1

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

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

我从 Digilent 下载了键盘的演示代码,它运行良好,它基本上显示了从键盘按下的任何内容到 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 根本不会被激活。

我应该在修改中进行哪些更改?

谢谢。:)

4

1 回答 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 <=状态机中的注释。这将允许监控状态顺序

于 2013-05-15T15:57:03.927 回答