首页 文章

[verilog]使用Pmod_KYPD组合激活LED

提问于
浏览
1

我正在使用Pmod_KYPD连接到Digilent FPGA .

我的目的是在将组合“123”输入键盘后激活电路板上的第一个LED .

我已经从Digilent下载了demo code键盘,它工作正常,它基本上显示从键盘上按下的7段显示器上的任何内容 .

演示代码由两部分组成,即解码和显示 . 我已经修改了显示代码(只有第二个'always'语句是我的补充),如下所示:

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////////////////////////////
// Company: Digilent Inc 2011
// Engineer: Michelle Yu  
//               Josh Sackos
// Create Date:    07/23/2012 
//
// Module Name:    DisplayController
// Project Name:   PmodKYPD_Demo
// Target Devices: Nexys3
// Tool versions:  Xilinx ISE 14.1 
// Description: This file defines a DisplayController that controls the seven segment display that works with 
//               the output of the Decoder.
//
// Revision History: 
//                      Revision 0.01 - File Created (Michelle Yu)
//                          Revision 0.02 - Converted from VHDL to Verilog (Josh Sackos)
//////////////////////////////////////////////////////////////////////////////////////////////////////////

// ==============================================================================================
//                                              Define Module
// ==============================================================================================
module DisplayController(
DispVal,
anode,
segOut,
 led,
 clk,
 reset
);

 input clk;
 input reset;

// ==============================================================================================
//                                          Additional Declarations
// ==============================================================================================

 output reg [7:0] led;
 reg [1:0] state;

// ==============================================================================================
//                                          Port Declarations
// ==============================================================================================

input [3:0] DispVal;            // Output from the Decoder
output [3:0] anode;             // Controls the display digits
output [6:0] segOut;            // Controls which digit to display

// ==============================================================================================
//                                  Parameters, Regsiters, and Wires
// ==============================================================================================

// Output wires and registers
wire [3:0] anode;
reg [6:0] segOut;

// ==============================================================================================
//                                              Implementation
// ==============================================================================================

// only display the rightmost digit
assign anode = 4'b1110;

//------------------------------
//         Segment Decoder
// Determines cathode pattern
//   to display digit on SSD
//------------------------------
always @(DispVal) begin
        case (DispVal)

                4'h0 : segOut <= 7'b1000000;  // 0
                4'h1 : segOut <= 7'b1111001;  // 1
                4'h2 : segOut <= 7'b0100100;  // 2
                4'h3 : segOut <= 7'b0110000;  // 3
                4'h4 : segOut <= 7'b0011001;  // 4
                4'h5 : segOut <= 7'b0010010;  // 5
                4'h6 : segOut <= 7'b0000010;  // 6
                4'h7 : segOut <= 7'b1111000;  // 7
                4'h8 : segOut <= 7'b0000000;  // 8
                4'h9 : segOut <= 7'b0010000;  // 9
                4'hA : segOut <= 7'b0001000;    // A
                4'hB : segOut <= 7'b0000011;    // B
                4'hC : segOut <= 7'b1000110;    // C
                4'hD : segOut <= 7'b0100001;    // D
                4'hE : segOut <= 7'b0000110;    // E
                4'hF : segOut <= 7'b0001110;    // F
                default : segOut <= 7'b0111111;

        endcase
end





always @(posedge clk) begin
    if(reset) begin
        led <= 8'b11111111;
        state <= 0;
    end

    else begin
        case (state)

            2'b00: begin 
                if(DispVal == 1) begin
                    state <= state + 1;
                end
                //led <= 8'b10000000;
            end

            2'b01: begin 
                if(DispVal == 2) begin
                    state <= state + 1;
                end
                else
                    state <= 0;
                //led <= 8'b00000010;
            end

            2'b10: begin 
                if(DispVal == 3) begin
                    state <= state + 1;
                end
                else
                    state <= 0;
                //led <= 8'b00000100;
            end

            2'b11: begin
                led <= 8'b11111111;
            end

            default: led <= 0;

        endcase
    end
end

endmodule

但不幸的是,我的修改并没有奏效 . 如果我从键盘输入“123”,LED就不会被激活 .

我的修改应该改变什么?

谢谢 . :)

1 回答

  • 2

    您需要一个保持当前状态的条件 . 例:

    2'b01: begin 
                if(DispVal == 2) begin
                    state <= state + 1;
                end
                else if(DispVal == 1) 
                    state <= state; // keep current state
                else
                    state <= 0;
                //led <= 8'b00000010;
            end
    

    注意:这是假设 DispVal 是粘性的(即,它保持它的值直到按下不同的键) . 如果没有,则添加逻辑或状态以处理无键按压条件 .

    调试建议:如果你不是模拟器,那么在状态机中取消注释已注释掉的 led <= . 这将允许监控州秩序

相关问题