我正在使用与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就不会被激活。
我的修改应该改变什么?
感谢。 :)
答案 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 <=
。这将允许监控州秩序