Семисегментные выходные данные неизвестны

#verilog #fpga #vivado #seven-segment-display

#verilog #fpga #vivado #семисегментный дисплей

Вопрос:

Я пытаюсь создать счетчик, который отсчитывает от 0-9 и отображается на семисегментном дисплее моего Nexys A7. Код компилируется, но в тестовом модуле он показывает, что все выходные данные неизвестны. Я протестировал свой модуль тактового делителя, и он выглядит нормально. Я не уверен, почему это не работает.

 module BCD_sevenseg(
    input clk,
    output segA, segB, segC, segD, segE, segF, segG, segDP, div_clk
    );
    
    counter module1(
    .clk(clk),
    .div_clk(div_clk)
    );
    
    reg[3:0] BCD; //BCD signal is 4 bits wide
    always@(posedge clk) //check every positive edge
        if(div_clk) //executes if counter value from module1 is true
            BCD <= (BCD == 4'h9 ? //check if BCD is at binary 9
            4'h0 : BCD   4'h1 );
            //true: reset to 0
            //false: count up
     
    reg [7:0] sevenseg; //8 segments on 7 segment display (w/ decimal point)
    always@(*)
    case(BCD) //one case for each digit
        4'h0: sevenseg = 8'b11111100;
        4'h1: sevenseg = 8'b01100000;
        4'h2: sevenseg = 8'b11011010;
        4'h3: sevenseg = 8'b11110010;
        4'h4: sevenseg = 8'b01100110;
        4'h5: sevenseg = 8'b10110110;
        4'h6: sevenseg = 8'b10111110;
        4'h7: sevenseg = 8'b11100000;
        4'h8: sevenseg = 8'b11111110;
        4'h9: sevenseg = 8'b11110110;
        default: sevenseg = 8'b00000000;        
    endcase
    
    assign {segA, segB, segC, segD, segE, segF, segG, segDP} = sevenseg;
    
endmodule
  

Тактовый делитель:

 module counter(
    input clk,
    output reg div_clk=0
    );

integer count_value=0;

always@(posedge clk)
begin
    if(count_value == 10)//change this number to adjust output signal frequency
    begin
        div_clk = ~div_clk;
        count_value <= 0;
    end
    else
        count_value <= count_value 1;
end


endmodule
  

Код тестового стенда:

 module BCD_sevenseg_tb();

reg clk=0;
wire segA, segB, segC, segD, segE, segF, segG, segDP, div_clk;


BCD_sevenseg UUT(
.clk(clk),
.segA(segA),
.segB(segB),
.segC(segC),
.segD(segD),
.segE(segE),
.segF(segF),
.segG(segG),
.segDP(segDP),
.div_clk(div_clk)
);

always
#1 clk=~clk;
    
endmodule
  

Скриншот Testbench

Ответ №1:

Ваши выходные данные всегда равны X, потому BCD что всегда X. Вы объявили BCD как a reg , который по умолчанию равен X. Необходимо выполнить инициализацию BCD с использованием известного значения, например 0.

Для целей моделирования вы можете сделать это просто с помощью:

 reg[3:0] BCD = 0; //BCD signal is 4 bits wide
  

Стандартный способ инициализации сигналов — использовать входной сигнал сброса. Например:

 always @(posedge clk) begin
    if (reset) begin
        BCD <= 4'h0;
    end else begin
        if (div_clk) BCD <= (BCD == 4'h9 ? 4'h0 : BCD   4'h1 );
    end
end