2013-05-14 72 views
1

我正在使用Pmod_KYPD連接到Digilent FPGA[verilog]使用Pmod_KYPD組合激活LED

我的目的是在組合鍵'123'輸入到鍵盤後激活板上的第一個LED。

我已經下載從Digilent的鍵盤工作正常的demo code,它基本上顯示無論從鍵盤上按下到7段顯示。演示代碼由解碼和顯示兩部分組成。我已經修改了顯示代碼(僅第二「始終」語句是我加)像一個聲明機執行以下操作:

`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不會被激活。

我在修改中應該更改哪些內容?

謝謝。 :)

回答

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 <=。這將允許監視狀態訂單

+0

非常感謝格雷格。那正是我所期待的。 :) – 2013-05-16 12:37:37