2013-12-17 91 views
1

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

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

***任何解决方案*
这里是我的代码如下Verilog多个驱动程序

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 
+0

看起来像以下副本:http://electronics.stackexchange.com/questions/93932/connected-to-multiple-drivers-problem-verilog – Greg

回答

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 
+1

SO的BCD1减计数器也有一个错误。如果(BCD1 == 4'b1001)BCD1 <= 4'b1001;'应该是'如果(BCD1 == 4'b0000)BCD1 <= 4'b1001; – Greg

4

您不能从always块中修改BCD。任何修改只能在一个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 
相关问题