这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » anananjjj的FPGA_DIY进程贴的血泪史!

共24条 3/3 1 2 3 跳转至
工程师
2013-01-03 22:23:38     打赏
21楼

3:完成按键作业:
忙着做项目,所以只能闲暇时做做DIY的作业,只是想有些自己的收获,所以慢慢更新,活动的日期就不关心了!关键是能学到东西!
利用去抖动按键切换数码管,显示0~9.

程序:
module key_data(sys_clk,sys_rstn,key_in,sm_seg,sm_bit);
//输入信号
input sys_clk;//50Hz
input sys_rstn;
input key_in;
//输出信号
output [7:0] sm_seg; //段码
output [7:0] sm_bit; //位码
//寄存器
reg [7:0] sm_seg;
reg [7:0] sm_bit;
reg [15:0] cnt  ;
reg [19:0] delay_cnt;
wire key_scan;
wire key_low;
reg key_samp;
reg key_samp_r;
reg key_rst;
reg key_rst_r;
/*************************
按键脉冲边沿检测
***************************/
always@(posedge sys_clk or negedge sys_rstn)
begin
if(!sys_rstn)
key_samp<=1'b1;
else
key_samp<=key_in;
end

always@(posedge sys_clk or negedge sys_rstn)
begin
if(!sys_rstn)
key_samp_r<=1'b1;
else
key_samp_r<=key_samp;
end
assign key_scan=key_samp_r&(~key_samp);
/*************************************
延迟20ms
************************************/
always@(posedge sys_clk or negedge sys_rstn)
begin
if(!sys_rstn)
delay_cnt<=20'h0;
else if(key_scan)
delay_cnt<=20'h0;
else//按键按下
delay_cnt<=delay_cnt+1'b1;
end

always@(posedge sys_clk or negedge sys_rstn)
begin
if(!sys_rstn)
key_rst<=1'b1;
else if(delay_cnt==20'hfffff)
key_rst<=key_in;
end
always@(posedge sys_clk or negedge sys_rstn)
begin
if(!sys_rstn)
key_rst_r<=1'b1;
else
key_rst_r<=key_rst;
end
assign key_low=key_rst_r&(~key_rst);
/***********************************

***********************************/
always@(posedge sys_clk or negedge sys_rstn)
begin
if(!sys_rstn)
cnt<=4'b0000;
else if(key_low)
begin
cnt<=cnt+1'b1;
if(cnt==4'b1001)
cnt<=4'b0000;
end
end
                                                                                                                                                                                                                                                                                                                                                                

always@(posedge sys_clk or negedge sys_rstn)
begin
sm_bit<=8'b10101010;
case(cnt)
4'b0000:sm_seg<=8'hc0;
4'b0001:sm_seg<=8'hf9;
4'b0010:sm_seg<=8'ha4;
4'b0011:sm_seg<=8'hb0;
4'b0100:sm_seg<=8'h99;
4'b0101:sm_seg<=8'h92;
4'b0110:sm_seg<=8'h82;
4'b0111:sm_seg<=8'hf8;
4'b1000:sm_seg<=8'h80;
4'b1001:sm_seg<=8'h90;
default:sm_seg<=8'hc0;
endcase
end
endmodule

图片:


视频:


专家
2013-01-03 22:51:22     打赏
22楼
吃一堑长一智,下次DIY就不会犯同样的错误

工程师
2013-01-04 08:43:17     打赏
23楼
主要是当时脑袋一热就那么干了!下次要注意啊!

工程师
2013-01-07 12:42:22     打赏
24楼
4、完成LCD显示作业:
51FPGA老大给我们提供了历程,所以程序不必粘贴,要说明的一点是,我使用的Quartus II 12.0 (32-Bit)编译器,在编译12864的历程时候,发现showdata定义的是output型,编译不能通过,通过查看rom.v可知,showdata应为wire型,改过之后,编译可通过!


1602的显示我只是一带而过:




我重点玩了一下LCD12864:

试了很多种取模软件和keil编译器
版本:
最终成功显示图片和汉字:

我使用的取模软件:zimo221
zimo221.rar

开始取模:
原始图片:


取模:注意设置选项!!









输出格式选51格式:


将生成的代码在keil4编译软件中编译生成hex文件!





编译12864的例程并下载:


最终效果:












由于我的12864引脚刚好是反的所以只能跳线链接啦!

共24条 3/3 1 2 3 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]