【问题标题】:Combining led, switches and buttons in verilog在verilog中结合led、开关和按钮
【发布时间】:2016-06-16 00:45:22
【问题描述】:

我正在用 verilog 创建一个 basys2 板,用于以二进制显示七段显示器。我正在使用开关 0-3 并希望使用 4 个按钮,以便在按下按钮 [0] 时,显示开关的二进制数(向上为 1,向下为 0)。但是,我坚持如何将按钮与二进制文件和 LED 集成在一起。我是verilog的新手,遇到了一些麻烦。有什么建议么?

module final(btn,clk,sw,cathodes,anodes,led,rst);

    input clk,rst;
    output [6:0] cathodes;
    output [7:0] led;
    output [3:0] anodes;
    input [3:0] sw;
    input [3:0] btn;

    reg [6:0] cathodes;
    reg [15:0] dig;
    reg [3:0] anodes;
    reg slow_clock;
    integer count;
    reg [7:0] led;

    always @ (posedge clk)
        create_slow_clock(clk, slow_clock);

纠结于如何分配 LED:

always @(posedge clk)
        begin
            if (btn[0:3]);
                begin
                    led[0]
                    led[1]
                    led[2]
                    led[3]

也不确定这是否正确:

always @ (posedge slow_clock)
            begin
                led=~led;
                if (rst == 0) anodes = 4'b1111;
                else
                    begin
                        case (btn)
                            0: anodes = 4'b0111;
                            1: anodes = 4'b1011;
                            2: anodes = 4'b1101;
                            3: anodes = 4'b1110;
                            default: anodes = 4'b1111;



                    endcase
                    cathodes = calc_cathode_value(dig);
                    end
                end

.

function[6:0] calc_cathode_value;
    input [15:0] dig;
    begin
        case (dig)
            0: calc_cathode_value = 8'b00000011;
            1: calc_cathode_value = 8'b10011111;
            2: calc_cathode_value = 8'b00100101;
            3: calc_cathode_value = 8'b00001101;
            4: calc_cathode_value = 8'b10011001;
            5: calc_cathode_value = 8'b01001001;
            6: calc_cathode_value = 8'b01000001;
            7: calc_cathode_value = 8'b00011111;
            8: calc_cathode_value = 8'b00000001; 
            9: calc_cathode_value = 8'b00001001;
            'hA: calc_cathode_value = 8'b00010001;
            'hb: calc_cathode_value = 8'b11000001;
            'hC: calc_cathode_value = 8'b01100011;
            'hd: calc_cathode_value = 8'b10000101;
            'hE: calc_cathode_value = 8'b01100001;
            'hF: calc_cathode_value = 8'b01110001;
            default: calc_cathode_value = 8'b0000001;
        endcase
    end
endfunction

task create_slow_clock;
    input clock;
    inout slow_clock;
    integer count;

        begin
            if (count > 250000)
            begin
                count = 0;
                slow_clock = ~slow_clock;
            end
            count = count + 1;
        end
    endtask

结束模块

【问题讨论】:

  • 我建议您从单个 LED 开始。然后用一个开关。然后用一个LED和一个开关。在你觉得舒服之后,尝试更复杂的东西。
  • 我已经做到了,但还没有弄清楚如何添加更多。我尝试了一些不同的方法,但似乎无法正常工作

标签: verilog


【解决方案1】:

you signal btn 被定义为 4 位,这意味着 case 语句需要表示从 0 到 F 的所有 16 种可能性。想想当同时按下一个以上按钮时需要发生什么。如果您只关心按下 1 个按钮的情况,那么您的情况值需要为 0,1,2,4,因为每个位位置代表另一个 2^n 值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-22
    相关资源
    最近更新 更多