【问题标题】:Baysis2 Verilog - First Digit of 7 Segment Display Wont WorkBaysis2 Verilog - 7 段显示的第一位数字不起作用
【发布时间】:2015-11-26 01:50:10
【问题描述】:

我正在尝试使用 verilog 在我的 baysis2 FGPA 上创建一个简单的 4 位密码系统。我想使用 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

【问题讨论】:

  • 为什么assert_seg被分配到4个引脚? Thid 代码不应通过“翻译”步骤。您的代码没有用于驱动所有 4 位数字的 7 段显示器的时间多路复用器。请参阅电路板原理图进行说明。
  • 板子的原理图在哪里?
  • 你试过只断言最低位吗?即wire assert_seg[3:0] - assert_seg = 4'b0001 - NET "assert_seg[0]" LOC = "K14"。该电路设计为在任何时候仅运行 7 段显示器中的一个(更新频率高于人眼可以感知的频率)。也许它不能正确地在所有显示器上连续显示一个值。 Source

标签: verilog fpga xilinx-ise spartan seven-segment-display


【解决方案1】:

问题是,七段显示的第一个数字不亮,而其他所有的都亮。

我假设您的七段显示器中有两位数字,因此您需要从您的enter_password 模块输出14-bit seven_seg_display

改变

    output wire [6:0]  seven_seg_display,

    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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-25
    • 2016-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    • 2021-12-23
    相关资源
    最近更新 更多