桂林电子科技大学职业技术学院实训报告
致 谢
感谢老师为我们争取的这次实训机会,让我们有了锻炼自己和提高自己的机会。熊老师对我的帮助也是很大的,平时的学习,还有这次实训老师的帮助。我很感谢熊老师给我的这个机会让我们完成这次实训,虽然实训没有很成功的完成,但是从中也学习到了很多。老师还尽心尽力的辅导我们如何写论文,这次的实训和
论文都是在熊老师的指导下完成的。
2011年6月 16 日
10
桂林电子科技大学职业技术学院实训报告
参考文献
[1] 叶俊明,熊彬.FPGA实验指导书.
[2] 夏宇闻.数字系统设计.北京航空航天大学出版社.2008.6
[3] 王金明.数字系统设计与verilog HDL.北京电子工业出版社.2008 [4] 王金明,冷自.EDA技术与Verilog设计.北京科技出版社.2008
11
桂林电子科技大学职业技术学院实训报告
附件
实训程序:
`timescale 1ns / 1ps
module key(dataout,en,clk,reset,row,col,key_value); input clk,reset;
input [3:0] row; //行 output [2:0] col; //列 output [3:0] key_value;
output reg [6:0]dataout;//数码管显示数据 output reg [3:0]en; //数码管显示使能 reg [3:0] col;
reg [3:0] key_value; //键值 reg [5:0] count; reg [2:0] state;
reg key_flag; //按键标志位 reg clk_500khz;
reg [2:0] col_reg; //寄存扫描的列值 reg [3:0] row_reg; //寄存扫描的行值
always @(posedge clk or negedge reset)
if(!reset) begin clk_500khz<=0; count<=0; end else begin
if(count>=50) begin clk_500khz<=~clk_500khz;count<=0;end else count<=count+1; end
always @(posedge clk_500khz or negedge reset)//扫描模块 if(!reset) begin col<=3'b000;state<=0;end else begin case (state) 0:begin
12
桂林电子科技大学职业技术学院实训报告
col[2:0]<=3'b000; key_flag<=1'b0;
if(row[3:0]!=4'b1111) begin state<=1;col[2:0]<=3'b011;end else state<=0; end 1:begin
if(row[3:0]!=4'b1111) begin state<=5;end //判断是否是第一行 else begin state<=2;col[2:0]<=3'b101;end //扫描第二行 end 2:begin
if(row[3:0]!=4'b1111) begin state<=5;end //判断是否是第二行 else begin state<=3;col[2:0]<=3'b110;end //扫描第三行 end 3:begin
if(row[3:0]!=4'b1111) begin state<=5;end //判断是否是第三行 else begin state<=4;end //扫描第四行 end 4:begin
if(row[3:0]!=4'b1111) begin state<=5;end //判断是否是第一行 else state<=0; end 5:begin
if(row[3:0]!=4'b1111) begin
col_reg<=col; //保存扫描列值 row_reg<=row; //保存扫描行值 state<=5;
key_flag<=1'b1; //有键按下的标志位 end else
begin state<=0;end end endcase end
13
桂林电子科技大学职业技术学院实训报告
always @(clk_500khz or col_reg or row_reg) begin
if(key_flag==1'b1)
begin
case ({row_reg,col_reg}) 7'b1110_011:key_value<=1; 7'b1110_101:key_value<=2; 7'b1110_110:key_value<=3;
7'b1101_011:key_value<=4; 7'b1101_101:key_value<=5; 7'b1101_110:key_value<=6;
7'b1011_011:key_value<=7; 7'b1011_101:key_value<=8; 7'b1011_110:key_value<=9;
7'b0111_101:key_value<=0; 7'b0111_011:key_value<=10; 7'b0111_110:key_value<=11; endcase
end
end
always @(key_value) //显示模块 begin
case(key_value)
0:begin dataout<=7'b1000000;en=4'b0111;end 1:begin dataout<=7'b1111001;en=4'b0111;end 2:begin dataout<=7'b0100100;en=4'b0111;end 3:begin dataout<=7'b0110000;en=4'b0111;end 4:begin dataout<=7'b0011001;en=4'b0111;end 5:begin dataout<=7'b0010010;en=4'b0111;end 6:begin dataout<=7'b0000010;en=4'b0111;end 7:begin dataout<=7'b1111000;en=4'b0111;end
14
桂林电子科技大学职业技术学院实训报告
8:begin dataout<=7'b0000000;en=4'b0111;end 9:begin dataout<=7'b0010000;en=4'b0111;end
10:begin dataout<=7'b0001000;en=4'b0111;end 11:begin dataout<=7'b0000011;en=4'b0111;end
default:dataout<=7'bz;
endcase
end
endmodule
管脚配置:
NET \
NET \
NET \NET \NET \NET \NET \NET \NET \NET \NET \NET \NET \NET \NET \NET \NET \NET \NET \
15