2013-12-17 4 views
1

Я пытаюсь сделать счетчик BCD с помощью Verilog, который будет подключен к 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 

Doing сравнения с == 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

Существует также ошибка в счетчике BCD1 SO. 'if (BCD1 == 4'b1001) BCD1 <= 4'b1001;' должно быть 'if (BCD1 == 4'b0000) BCD1 <= 4'b1001;' – Greg

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