原创 FPGA_Verilog学习(一)第一个调试成功的程序_按键控制数码管加减一

2009-3-27 18:20 11116 11 13 分类: FPGA/CPLD

第一个调试成功的程序_按键控制数码管加减一 


学习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

PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

用户1828424 2015-2-4 12:17

按照程序编译下载,不能进行加减,跳不到if(key1_f)

用户1688704 2013-4-1 10:23

module qushu(clk,rstn,en,shi,ge); input clk,rstn,en; output [3:0]shi,ge; reg [31:0]rshi,rge; reg[7:0]num; parameter t1s=26'd49999999; reg [25:0]count; always@(posedge clk or negedge rstn) begin if(!rstn) begin count<=26'd0; num<=1'b0; end else if(num==8'd100) begin num<=8'd0; end else if(count==t1s || en)begin num<=num+1'b1; count<=26'd0;end else count<=count+1'b1; end always@(posedge clk or negedge rstn) begin if(!rstn) begin rshi<=32'd0; rge<=32'd0; end else begin rshi<=num/10; rge<=num%10; end end assign shi=rshi[3:0]; assign ge=rge[3:0]; endmodule 这个按一次加了几十个数
相关推荐阅读
用户54562 2016-03-22 15:05
FPGA实现冒泡排序法(VHDL)
可能很多人会问,为什么用FPGA来实现冒泡排序?放CPU中用C语言只需短短几行代码即可实现的事情为啥用逻辑来实现,没办法我加入这个项目的时候系统方案已确定下来了。 通过一个小采集板实现一个窄脉...
用户54562 2010-09-09 13:20
32个最热CPLD-FPGA论坛(转)CPLD-FPGA论坛
1. OPENCORES.ORG 这里提供非常多,非常好的PLD了内核,8051内核就可以在里面找到。进入后,选择project或者由http//www.opencores.org/browse.cg...
用户54562 2010-04-21 18:49
电子工程师笔试题目收集1
一.Verilog如何消除毛刺?1.出现"毛刺"的原因  当信号在FPGA器件内部通过连线和逻辑门时,一般都有一定的延时。延时的大小与连线的长短和门单元的数目有关,同时还受器件的制造工艺、工作电压、温...
用户54562 2010-04-12 13:27
有关FPGA中.mif文件
在FPGA设计中ROM的应用时比较常见的,在调用ROM时经常要加载mif文件,对于初学者,无论mif还是hex都是很令人疑惑的东西,这里就对mif文件的格式及其创建做一点简单的说明。mif在fpga设...
用户54562 2010-03-24 15:38
Nios II系统外扩FLASH
这几天一直在调试外部存储器,也积累了一些经验和教训,养成良好的习惯,将这些记录下来。我用的FLASH是AM29LV160DB-90EC,主要管教功能:A:地址线DQ:数据线DQ15/A-1:如果是字(...
用户54562 2010-03-24 15:38
Nios II系统外扩FLASH
这几天一直在调试外部存储器,也积累了一些经验和教训,养成良好的习惯,将这些记录下来。我用的FLASH是AM29LV160DB-90EC,主要管教功能:A:地址线DQ:数据线DQ15/A-1:如果是字(...
我要评论
2
11
关闭 站长推荐上一条 /3 下一条