[verilog]使用Pmod_KYPD组合激活LED

时间:2013-05-14 18:02:29

标签: verilog fpga

我正在使用与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 个答案:

答案 0 :(得分: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 <=。这将允许监控州秩序