2

我正在尝试使用将连接到 7 段解码器的 Verilog 制作 BCD 计数器。
在我合成它之后,错误发生如下:

Multi-source in Unit <BCDcountmod> on signal <BCD0<3>>; this signal is connected to multiple drivers.>**还有更多.....

***任何解决方案?*
下面是我的代码

module BCDcountmod(
  input Clock, Clear, up, down,
  output [3:0] BCD1_1, BCD0_0 );
reg [3:0] BCD1, BCD0;
//reg [3:0] BCD1_1, BCD0_0;
always @(posedge Clock) begin
  if (Clear) begin
    BCD1 <= 0;
    BCD0 <= 0;
    end
end


 always @(posedge up) begin
      if (BCD0 == 4'b1001) begin
        BCD0 <= 0;
        if (BCD1 == 4'b1001)
          BCD1 <= 0;
        else
          BCD1 <= BCD1 + 1;
      end
      else
        BCD0 <= BCD0 + 1;
    end


always @(posedge down) begin
      if (BCD0 == 4'b0000) begin
        BCD0 <= 4'b1001;
        if (BCD1 == 4'b1001)
          BCD1 <= 4'b1001;
        else
          BCD1 <= BCD1 - 1;
      end
      else
        BCD0 <= BCD0 - 1;
    end

 assign BCD1_1 = BCD1;
 assign BCD0_0 = BCD0;

endmodule
4

2 回答 2

4

您不能BCD从不同的always块进行修改。任何修改都应该只在一个always. 就像是:

module BCDcountmod(
  input Clock, Clear, up, down,
  output [3:0] BCD1_1, BCD0_0 );
  reg [3:0] BCD1, BCD0;
//reg [3:0] BCD1_1, BCD0_0;

  assign BCD1_1 = BCD1;
  assign BCD0_0 = BCD0;  

  always @(posedge Clock) begin
    //---- IS IT CLEAR? --------------
    if (Clear) begin
      BCD1 <= 0;
      BCD0 <= 0;
    end
    //---- IS IT UP? --------------
    else if (up) then begin
      if (BCD0 == 4'b1001) begin
        BCD0 <= 0;
        if (BCD1 == 4'b1001)
          BCD1 <= 0;
        else
          BCD1 <= BCD1 + 1;
      end
    end
    //---- IS IT DOWN? --------------
    else if (down) begin
      if (BCD0 == 4'b0000) begin
        BCD0 <= 4'b1001;
        if (BCD1 == 4'b1001)
          BCD1 <= 4'b1001;
        else
          BCD1 <= BCD1 - 1;
      end
      else
        BCD0 <= BCD0 - 1;
    end
  end
endmodule
于 2013-12-17T11:38:35.417 回答
0

只是为了添加到 mcleod_ideafix 的答案,你有这个块:

always @(posedge Clock) begin
  if (Clear) begin
    BCD1 <= 0;
    BCD0 <= 0;
    end
end

这意味着同步清除,我不确定这是否是您的意图,因为通常您会为 ASIC 设计中的触发器进行异步清除,或者为 FPGA 设置初始状态。

对于具有异步高电平有效清除的触发器

always @(posedge clock or posedge clear) begin
  if (clear) begin
    BCD1 <= 'b0;  //NB: defined widths
    BCD0 <= 'b0;
  end
  else
    // normal logic
  end
end

使用低电平有效复位更为典型:

always @(posedge clock or negedge clear_n) begin
  if (~clear_n) begin
    BCD1 <= 'b0;  //NB: defined widths
    BCD0 <= 'b0;
  end
  else
    if (up == 1'b1) begin
      // up logic
    end
    else if (down == 1'b1) begin
      // down logic
    end
    else begin 
      // nothing to see here
    end
  end
end

进行比较== 1'b1意味着如果 LHS(左侧)宽于 1 位,您将收到宽度不匹配警告,而不是奇怪的行为。

我还注意到你有:

output [3:0] BCD1_1, BCD0_0 );
reg [3:0] BCD1, BCD0;
assign BCD1_1 = BCD1;
assign BCD0_0 = BCD0;

您只需执行以下操作即可将 reg 作为输出:

output reg [3:0] BCD1, BCD0

尽管我发现以下内容更清楚:

output reg [3:0] BCD1,
output reg [3:0] BCD0
于 2013-12-17T18:24:51.837 回答