verilog语言FPGA键盘程序解析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//------------------------------------------------------------------------------------------------- // File : top.v // Generated : 2011-07-20 // Author : wangliang //------------------------------------------------------------------------------------------------- `timescale 1 ns / 1 ps module top ( KEYO ,KEYI ,clk ,Y , rst; input [3:0] KEYO ; //与原理图一致,是键盘输出端口给FPGA input clk ; input rst ; output [3:0] KEYI ; //与原理图一致,是FPGA输出给键
盘 output [7:0] Y ; wire keypress; wire scanclk; wire [7:0] temp ; wire [3:0] keydrv ; reg [7:0] temp_r ; reg [7:0] Y_r; reg [4:0] keyvalue ; reg [3:0] scankey_o; reg [3:0] scankey_i; wire dis; reg dis_pre; assign dis = &KEYO ; scan_clk key_clk( .clk ( clk, .clkout
( scanclk , .rst ( rst ; key_scan key_scan( .clk ( scanclk , .keydrv (keydrv , .rst ( rst ; always @ ( posedge clk or negedge rst begin if ( rst==1'b0 begin scankey_o <= 4'b0 ; scankey_i <= 4'b0 ; dis_pre <= dis; end else if ( clk ==1'b1 begin dis_pre <= dis; if ( (dis == 1'b0&&(dis_pre==1'b1 begin scankey_o <= keydrv ; scankey_i <= KEYO ; end end end assign KEYI = keydrv; assign temp = {scankey_o,scankey_i}; always @ ( posedge clk or negedge rst begin if ( rst==1'b0 begin temp_r <= 8'b0; end else if ( clk == 1'b1 temp_r <= temp ; end always @( temp_r or rst begin if ( rst==1'b0 begin //译码输出keyvalue <= 5'b0; end else case ( temp_r 8'b0111_0111 : keyvalue <= 5'hb; //无用,仅
作为复位 8'b1110_1110 : keyvalue <= 5'h7; 8'b1110_1101 : keyvalue <= 5'h8;
8'b1110_1011 : keyvalue <= 5'h9; 8'b1101_1110 : keyvalue <= 5'h4; 8'b1101_1101 : keyvalue <= 5'h5; 8'b1101_1011 : keyvalue <= 5'h6; 8'b1011_1110 : keyvalue <= 5'h1;
8'b1011_1101 : keyvalue <= 5'h2; 8'b1011_1011 : keyvalue <= 5'h3; 8'b0111_1101 : keyvalue <= 5'h0; 8'b0111_1011 : keyvalue <= 5'b1_0001; //小数点 default: keyvalue <= 5'h0; endcase end always @(keyvalue or rst begin if ( rst==1'b0 //译码输出 Y_r <= 8
'b0000_0000; else begin Y_r =8'b0000_0000; case (keyvalue 5'h0: Y_r =
8'b0011_1111; // 0 5'h1: Y_r = 8'b0000_0110; // 1 5'h2: Y_r = 8'b0101_1011; // 2 5'h3:
Y_r = 8'b0100_1111; // 3 5'h4: Y_r = 8'b0110_0110; // 4 5'h5: Y_r = 8'b0110_1101; // 5 5'h6: Y_r = 8'b0111_1101; // 6 5'h7: Y_r = 8'b0000_0111; // 7 5'h8: Y_r = 8'b0111_1111; // 8 5'h9: Y_r = 8'b0110_1111; // 9 5'b1_0001: Y_r = 8'b1000_0000; //. default: Y_r =
8'b0000_0000; endcase end end assign Y =~Y_r; endmodule。