Выходы семисегментного дисплея неизвестны

Я пытаюсь сделать счетчик, который считает от 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

Снимок экрана тестового стенда


person jhe4x    schedule 13.10.2020    source источник


Ответы (1)


Ваши выходы всегда X, потому что BCD всегда X. Вы объявили BCD как 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
person toolic    schedule 13.10.2020