首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >[verilog]使用Pmod_KYPD组合激活发光二极管

[verilog]使用Pmod_KYPD组合激活发光二极管
EN

Stack Overflow用户
提问于 2013-05-15 02:02:29
回答 1查看 1.7K关注 0票数 1

我正在使用连接到Digilent FPGAPmod_KYPD

我的目的是在键盘上输入组合'123‘后,激活电路板上的第一个LED。

我已经从Digilent下载了键盘的demo code,它工作得很好,基本上可以在7段显示屏上显示从键盘按下的任何东西。

演示代码由解码和显示两部分组成。我已经使用语句机修改了显示代码(只有第二个'always‘语句是我添加的),如下所示:

代码语言:javascript
运行
复制
`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根本不会被激活。

我应该在我的修改中修改什么?

谢谢。:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-15 23:57:04

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

代码语言:javascript
运行
复制
        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 <=。这将允许监视状态顺序

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16549841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档