过期问题
  • 关于FPGA的串口

  • 悬赏分:5 回答数:6 浏览数:453 提问时间:2010年08月29日 14:41:21 截止时间:2010年09月13日 14:41:21
  • 下面是串口发送模块的程序,为了配合接收模块的波特率这里依然使用了16倍的波特率,在程序中进行处理,但是在编译是出现了如下的错误,认真分析后觉得并没有错误,不知怎么办了,特求助。

    编译错误提示如下:

    Error (10028): Can't resolve multiple constant drivers for net "n_reg[2]" at tx.v(39)
    Error (10029): Constant driver at tx.v(48)
    Error (10028): Can't resolve multiple constant drivers for net "n_reg[1]" at tx.v(39)
    Error (10028): Can't resolve multiple constant drivers for net "n_reg[0]" at tx.v(39)
    Error: Can't elaborate top-level user hierarchy
    Error: Quartus II Analysis & Synthesis was unsuccessful. 5 errors, 5 warnings
     Error: Peak virtual memory: 165 megabytes
     Error: Processing ended: Sun Aug 29 14:38:47 2010
     Error: Elapsed time: 00:00:01
     Error: Total CPU time (on all processors): 00:00:01

    //下面是源代码

    module tx
       #(
       parameter DBIT=8,
       parameter SB_TICK=16
       )
      (
       input wire clk,reset,
       input wire tx_start,s_tick,
       input wire [7:0] din,
       output reg tx_done_tick,
       output wire tx
       );
     //symolic state declaration
     localparam[1:0] idle=2'b00;
     localparam[1:0]  start=2'b01;
     localparam[1:0]  data=2'b10;
     localparam[1:0]  stop=2'b11;
      
      
     //signal declaration
     reg[1:0]state_reg,state_next;
     reg[3:0] s_reg,s_next;
     reg[2:0] n_reg,n_next;
     reg[7:0] b_reg,b_next;
     reg tx_reg,tx_next;
      //body
      //FSMD state&data register
      always@(posedge clk,posedge reset)
        if (reset)
           begin
              state_reg<=idle;
              s_reg<=4'b0000;
              n_reg<=3'b000;
              b_reg<=8'b00000000;
              tx_reg<=1'b1;
            end
        else
          begin
            state_reg<=state_next;
            s_reg<=s_next;
            n_reg<=n_next;
            b_reg<=b_next;
            tx_reg<=tx_next;
          end
      //FSMd next-state logic&functional units
      always@*
        begin
          state_next=state_reg;
          tx_done_tick=1'b0;
          s_next=s_reg;
          n_next=n_reg;
          b_next=b_reg;
          tx_next=tx_reg;
          case(state_reg)
            idle:
              begin
                 tx_next=1'b1;
                 if (tx_start)
                     begin
                         state_next=start;
                         s_next=0;
                         b_next=din;
                        end
               end
            start:
              begin
                 tx_next=1'b0;
                 if (s_reg==15)
                     begin
                         state_next=data;
                         s_next=0;
                         n_next=0;
                     end
                 else
                   s_next=s_reg+1;
             end
           data:
             begin
                 tx_next=b_reg[0];
                 if(s_tick)
                     if (s_reg==15)
                         begin
                             s_next=0;
                             b_next=b_reg>>1;
                             if(n_reg==(DBIT-1))
                                 state_next=stop;
                             else
                                n_reg=n_reg+1;
                         end
                      else
                         s_next=s_reg+1;
              end
            stop:
               begin
                 tx_next=1'b1;
                 if(s_tick)
                     if(s_reg==(SB_TICK-1))
                         begin
                             state_next=idle;
                             tx_done_tick=1'b1;
                          end
                     else
                       s_next=s_reg+1;
                end
           endcase
       end
      //output
      assign tx=tx_reg;
     
      endmodule
       谢谢!


  •   
所有答案
  •  

     always@(posedge clk,posedge reset)
        if (reset)
           begin
              state_reg<=idle;
              s_reg<=4'b0000;
              n_reg<=3'b000;
              b_reg<=8'b00000000;
              tx_reg<=1'b1;
            end
        else
          begin
            state_reg<=state_next;
            s_reg<=s_next;
            n_reg<=n_next;
            b_reg<=b_next;
            tx_reg<=tx_next;
          end
     
     
     
    你后面又直接跟always语句了?不用结束啊!

    回答者:陈晨 回答时间:2010年09月01日04:54:22
  • 你看看是不是在同一个时刻,你给n_reg都赋值了,检查一下判断的语句,always后面的条件

    回答者:梦想家 回答时间:2010年09月01日04:54:48
  • 从字面上看 应该不能有多个驱动来驱动你这个n_reg。你排查一下那些给n_reg赋值的语句吧?

    回答者:梦想家 回答时间:2010年09月01日04:54:58
相关问题