第一个调试成功的程序_按键控制数码管加减一
学习Verilog已经有两周,不过只是局限于语法的学习,早几天从老师那边拿到一块很老的FPGA学习板,好像是火龙刀的,上网搜索了一下资料,这块板的例程都是用VHDL编写的,本人菜鸟一只,暂时看不懂,呵呵!在EDN潜水多年,在电路设计上遇到问题习惯的上EDN来搜索,刚好发现EDN助学—CPLD学习小组里面有很多适合像我这样刚从单片机编程转过来学习Verilog的初学者,呵呵,就像我以前学习单片机一样,都是从实验版和最简单例程开始学起的。经过三天的调试,终于调试成功,就像以前用单片机实验版调试第一个C程序跑马灯一样,成功之后总能带来喜悦!就像有些人,很有钱了,但是还是在拼命的赚钱,我想他们也是在享受赚钱带来的快感!
本程序只用到了一个数码管(实验版上面有四个),实现数字从0到9的加减!准备稍加修改,改成从0到100的加减,读者如果有兴趣的话,也可以自己编写!
在学习Verilog的这几天当中,发觉遇到的最大的困难就是经常会用单片机的C语言的编程思维和习惯,其实单片机和FPGA的编程还是有很大的不一样,虽然语法有很多是相似的!所以我还得多多编写程序,多多看书和上论坛,加油!个人觉得要想成为一名好的硬件工程师,单片机,FPGA,ARM都是需要掌握并熟练应用的!ARM和嵌入式是我的下一个目标~~
说了一些废话,现把程序贴上来
https://static.assets-stash.eet-china.com/album/old-resources/2009/3/27/548ec68a-4725-4871-91bc-4d009e8dc75b.rar
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
//按键控制数码管加减一
//功能:通过两个按键key1和key2分别控制共阳带小数点的数码管加减一
//调试环境:ISE 10.1;火龙刀实验板
//本程序参考了 EDN助学—CPLD学习小组 ilove314 的练习例程
//////////////////////////////////////////////////////////////////////////////////
module key(clk,key1,key2,led_cs,led_db);
input clk,key1,key2;
output led_cs; //数码管的选择,本实例只用其中一个数码管,所以直接连续赋值assign led_cs=1'b1;
output [7:0] led_db; //七段数码管,带小数点,共阳
reg [7:0] led_dbr; //7段数码管寄存器
reg [19:0] cnt;
reg[3:0] num; //显示数值
/*初始化,因为实验板上的复位键失灵,没有多余的按键了,所以取消复位初始化reset,改用initial*/
initial begin num="4"'d0;end
initial begin cnt="20"'h00000;end
always @ (posedge clk)
cnt <= cnt+1'b1; //循环计数
parameter seg0 = 8'hc0, //共阳七段数码管的值
seg1 = 8'hf9,
seg2 = 8'ha4,
seg3 = 8'hb0,
seg4 = 8'h99,
seg5 = 8'h92,
seg6 = 8'h82,
seg7 = 8'hf8,
seg8 = 8'h80,
seg9 = 8'h90;
always @ (num)
case (num)
4'd0: led_dbr<= seg0;
4'd1: led_dbr<= seg1;
4'd2: led_dbr<= seg2;
4'd3: led_dbr<= seg3;
4'd4: led_dbr<= seg4;
4'd5: led_dbr<= seg5;
4'd6: led_dbr<= seg6;
4'd7: led_dbr<= seg7;
4'd8: led_dbr<= seg8;
4'd9: led_dbr<= seg9;
default: ;
endcase
reg key1_flag,key2_flag,key1_flag_r,key2_flag_r;
initial begin key1_flag=1'b0;key2_flag=1'b0;key1_flag_r=1'b0;key2_flag_r=1'b0;end //定义存储键值的寄存器,并初始化
always @ (posedge clk) //如有按键按下,延时8'hfffff后,把键值赋予寄存器key1_flag和key2_flag
if(cnt==20'hfffff)
begin
key1_flag<=key1;
key2_flag<=key2;
end
always @ (posedge clk)
begin
key1_flag_r<=key1_flag;
key2_flag_r<=key2_flag;
end
wire key1_f=(~key1_flag)&&key1_flag_r; //相当于wire key1_f; assign key1_f=(~key1_flag)&&key1_flag_r;
wire key2_f=(~key2_flag)&&key2_flag_r;
always @(posedge clk)
begin
if(key1_f)
begin
if(num<9) num<=num+4'd1; //按键key1一次,数码管加一
else num<=9;
end
if(key2_f)
begin
if(num>0)
num<=num-4'd1;//按键key2一次,数码管减一
else num<=0;
end
end
assign led_db=led_dbr; //数码管输出
assign led_cs=1'b1;//数码管常亮
endmodule
用户1828424 2015-2-4 12:17
用户1688704 2013-4-1 10:23