Baysis2 Verilog - Первая цифра 7-сегментного дисплея не работает

Я пытаюсь создать простую 4-значную систему паролей на моем FGPA baysis2, используя verilog. Я хочу использовать 7-сегментный дисплей для отображения цифр по мере их ввода (они будут вводиться с помощью клавиатуры). Сейчас я просто тестирую, чтобы убедиться, что при вводе отображаются правильные числа. Проблема в том, что первая цифра семисегментного дисплея не загорается, когда загораются все остальные. Я пробовал это на нескольких платах, и все остальные цифры, подключенные к тому же проводу, в порядке. Почему это происходит?

module enter_password(
    input wire clk, reset,
    input wire ps2d, ps2c, rx_en,
    output wire [6:0]  seven_seg_display,
    output wire assert_seg);

    wire [7:0] scan_out;
    wire [7:0] ascii_code;

    //initial seven_seg_display = 7'b0000000;

    assign assert_seg = 1'b1;

    // instantiate ps2 receiver
    ps2_rx ps2_rx_unit(
      .clk(clk), .reset(reset), .rx_en(1'b1),
      .ps2d(ps2d), .ps2c(ps2c),
      .rx_done_tick(scan_done_tick), .dout(scan_out));

    // instantiate key-to-ascii code conversion circuit
    Scan_to_ascii key2ascii(.key_code(scan_out), .ascii_code(ascii_code));

    assign seven_seg_display =  
       ascii_code == 8'h30 ? 7'b0000001: //0
       ascii_code == 8'h31 ? 7'b1001111: //1
       ascii_code == 8'h32 ? 7'b0010010: //2
       ascii_code == 8'h33 ? 7'b0000110: //3
       ascii_code == 8'h34 ? 7'b1001100: //4
       ascii_code == 8'h35 ? 7'b0100100: //5
       ascii_code == 8'h36 ? 7'b0100000: //6
       ascii_code == 8'h37 ? 7'b0001111: //7
       ascii_code == 8'h38 ? 7'b0000000: //8
       ascii_code == 8'h39 ? 7'b0000100: //9
                             7'b1111111; //e for error 0
endmodule

UCF

NET "seven_seg_display[6]" LOC = "L14"; # Bank = 1, Signal name = CA
NET "seven_seg_display[5]" LOC = "H12"; # Bank = 1, Signal name = CB
NET "seven_seg_display[4]" LOC = "N14"; # Bank = 1, Signal name = CC
NET "seven_seg_display[3]" LOC = "N11"; # Bank = 2, Signal name = CD
NET "seven_seg_display[2]" LOC = "P12"; # Bank = 2, Signal name = CE
NET "seven_seg_display[1]" LOC = "L13"; # Bank = 1, Signal name = CF
NET "seven_seg_display[0]" LOC = "M12"; # Bank = 1, Signal name = CG
#NET "dp" LOC = "N13"; # Bank = 1, Signal name = DP

NET "assert_seg" LOC = "K14"; # Bank = 1, Signal name = AN3
NET "assert_seg" LOC = "M13"; # Bank = 1, Signal name = AN2
NET "assert_seg" LOC = "J12"; # Bank = 1, Signal name = AN1
NET "assert_seg" LOC = "F12"; # Bank = 1, Signal name = AN0

person Noah Mendoza    schedule 26.11.2015    source источник
comment
Почему assert_seg назначен на 4 контакта? Этот код не должен проходить этап "перевести". В вашем коде нет временного мультиплексора, для 7-сегментного дисплея нужно выводить все 4 цифры. См. схему платы для пояснения.   -  person Paebbels    schedule 26.11.2015
comment
Где схема платы?   -  person e19293001    schedule 26.11.2015
comment
Вы пытались утверждать только самый младший бит? То есть wire assert_seg[3:0] - assert_seg = 4'b0001 - NET "assert_seg[0]" LOC = "K14". Схема предназначена для запуска только одного из 7-сегментных дисплеев в любое время (с частотой обновления, которая выше, чем может воспринимать человеческий глаз). Возможно, он не может правильно отображать одно значение постоянно на всех дисплеях. Источник   -  person Hida    schedule 26.11.2015


Ответы (1)


Проблема в том, что первая цифра семисегментного дисплея не загорается, когда загораются все остальные.

Я предполагаю, что на вашем семисегментном дисплее есть две цифры, поэтому вам нужно иметь вывод 14-bit seven_seg_display из вашего модуля enter_password.

Изменять

    output wire [6:0]  seven_seg_display,

to

    output wire [13:0]  seven_seg_display,

Вам также может потребоваться изменить логику следующего кода, чтобы он поддерживал 14-bit seven_seg_display и мультиплексор, определяющий, какая половина seven_seg_display будет назначена ascii_code:

    assign seven_seg_display =  
       ascii_code == 8'h30 ? 7'b0000001: //0
       ascii_code == 8'h31 ? 7'b1001111: //1
       ascii_code == 8'h32 ? 7'b0010010: //2
       ascii_code == 8'h33 ? 7'b0000110: //3
       ascii_code == 8'h34 ? 7'b1001100: //4
       ascii_code == 8'h35 ? 7'b0100100: //5
       ascii_code == 8'h36 ? 7'b0100000: //6
       ascii_code == 8'h37 ? 7'b0001111: //7
       ascii_code == 8'h38 ? 7'b0000000: //8
       ascii_code == 8'h39 ? 7'b0000100: //9
                             7'b1111111; //e for error 0
person e19293001    schedule 26.11.2015