实验主要分为两大块:
第一部分就是秒表的实现功能;
第二部分就是数码管显示功能;

在这之前由于我们外部有启动,暂停的按钮,为了防止按键亚稳态需要打两拍寄存;

其中秒表显示部分主要实现是:
外部时钟采用10MHz的时钟频率,秒表的最小单位为0.1秒,也就是每振动10^6下计数一次, 2^20=1 048 57, 用一个 reg[19:0] cnt_time来计数,cnt_time_en使能,cnt_time_cl清零,
三个数码管显示器,最多从00.0计数到99.9,reg[9:0]data_tem负责每0.1加一。

数码管显示功能:
首先数码管需要以一个500Hz到1000Hz的频率进行刷新,才能在人眼中形成一个视觉暂留的过程,reg [14:0]cnt_500,因为系统的时钟是10MHz,要想产生500Hz的频率,就需要20 000震动一次 ,2^15=32768,cnt_500_cl负责清零;然后就是数码显示的逻辑,一个FSM,四个状态idle初始状态,display1,display2,display3,分别表示显示第一二三个数码管,转移判断的量为,cnt_500_cl==1,

`timescale  1ns/1ps
//
// Company: Nuaa
// Engineer: Jason Wang
//
// Create Date: 2021/06/09 12:17:57
// Design Name: stop_watch
// Module Name: stop_watch
// Project Name:
// Target Devices: z7
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//module stop_watch(input I_clk,input I_rst,input I_start,input I_stop,output O_led_a,    //led管output O_led_b,output O_led_c,output O_led_d,output O_led_e,output O_led_f,output O_led_g,output O_led_we1,      //位选信号output O_led_we2,output O_led_we3);
//================================输入信号定义====================
reg start_d1;        //输入信号寄存打拍
reg start_d2;
reg stop_d1;
reg stop_d2;
//===============================内部信号定义=====================
reg start_pos;
reg stop_pos;                  //开始停止标志d1 ==1且d2==0 为1;
reg[19:0] cnt_time;            //20位信号,表示0~999999 2^20=1 048 576
reg       cnt_time_en;         //计数使能信号
reg       cnt_time_cl;         //计数清零信号
reg[9:0]  data_tem;            //10位 计数 0~999
reg[14:0] cnt_500;             //500Hz的刷新率 在10MHz的频率下相当于20 000次动一次
reg       cnt_500_cl;
reg [2:0] cur_state;
reg [2:0] next_state;          //fsm state definiteparameter  idle     = 3'd0,display1 = 3'd1,display2 = 3'd2,display3 = 3'd3;   //diaslpay parameter
wire[11:0]  rom_dout;          // transfer data_tem from binary to decimal
reg[3:0]   led_tem;
reg   [6:0]    led_dout  ;    //7端数码管
reg            led_we1   ;
reg            led_we2   ;
reg            led_we3   ;    //数码管位选信号//===================================计时功能====================================================//================================I_start=====================================
always@(posedge I_clk)beginstart_d1<=I_start;start_d2<=start_d1;end//================================I_stop=====================================
always@(posedge I_clk)beginstop_d1<=I_stop;stop_d2<=stop_d1;end
//=============================start_pos===================================
always@(posedge I_clk,posedge I_rst)beginif(I_rst)start_pos<=1'b0;else if(start_d1==1&&start_d2==0)start_pos<=1'b1;elsestart_pos<=1'b0;end
//=============================start_pos===================================
always@(posedge I_clk,posedge I_rst)beginif(I_rst)stop_pos<=1'b0;else if(stop_d1==1&&stop_d2==0)stop_pos<=1'b1;elsestop_pos<=1'b0;end
///=================================cnt_time_en===================================
always@(posedge I_clk or posedge I_rst)beginif(I_rst)begincnt_time_en<=1'b0;endelse if(start_pos==1'b1)begincnt_time_en<=1'b1;endelse if(stop_pos==1'b1)begincnt_time_en<=1'b0;endelse begincnt_time_en<=cnt_time_en;end
end
///====================================cnt_time_cl===============================
always@(posedge I_clk or posedge I_rst)beginif(I_rst)begincnt_time_cl<=1'b0;endelse if(cnt_time==20'd999998)begin  //这里用999998的原因是因为再加一 cnt_time_cl就是1,可以用作data_tem的使能信号;cnt_time_cl<=1'b1;endelse begincnt_time_cl<=1'b0;end
end
///==========================cnt_time============================
always@(posedge I_clk or posedge I_rst)
beginif(I_rst)begincnt_time<=20'd0;endelse if(cnt_time_cl)begincnt_time<=20'd0;endelse if(cnt_time_en==1'b1)begincnt_time<=cnt_time+1'b1;endelsecnt_time<=cnt_time;
end
///===================================data_time====================
always@(posedge I_clk or posedge I_rst)beginif(I_rst)begindata_tem<=10'd0;endelse if(cnt_time_cl==1'b1)beginif(data_tem==10'd999)begindata_tem<=10'd0;endelse begindata_tem<=data_tem+1'b1;end
end
end
//=======================cnt_500_cl====================================
always@(posedge I_clk,posedge I_rst)beginif(I_rst)cnt_500_cl<=1'b0;else if (cnt_500==15'd19998)cnt_500_cl<=1'b1;elsecnt_500_cl<=1'b0;end
//======================cnt_500=======================================
always@(posedge I_clk,posedge I_rst )beginif(I_rst)cnt_500<=15'd0;else if(cnt_500_cl==1'b1)cnt_500<=15'd0;elsecnt_500<=cnt_500+1'b1;end
//===========================================display fsm====================================
always@(posedge I_clk,posedge I_rst)beginif(I_rst)begincur_state <= idle;endelse cur_state <=next_state;endalways@(*)
begincase(cur_state)idle:beginnext_state=display1;enddisplay1:beginif(cnt_500_cl==1'b1)next_state=display2;elsenext_state=display1;enddisplay2:beginif(cnt_500_cl==1'b1)next_state=display3;elsenext_state=display2;enddisplay3:beginif(cnt_500_cl==1'b1)next_state=idle;elsenext_state=display3;enddefault:next_state=idle;endcaseend
//========================led_tem=============================
always@(posedge I_clk,posedge I_rst)beginif(I_rst)beginled_tem<=4'd0;endelse case(cur_state)idle:               led_tem<=4'd0;display1:          led_tem<=rom_dout[3:0];display2:            led_tem<=rom_dout[7:4];display3:            led_tem<=rom_dout[11:8];default:            led_tem<=4'd0;endcaseend
//=============================led_out=======================
always@(posedge I_clk,posedge I_rst)beginif(I_rst)beginled_dout <=7'b0;endelsecase(led_tem)4'h0:    led_dout <= 7'b0000001;4'h1:    led_dout <= 7'b1001111;4'h2:    led_dout <= 7'b0010010;4'h3:    led_dout <= 7'b0000110;4'h4:    led_dout <= 7'b1001100;4'h5:    led_dout <= 7'b0100100;4'h6:    led_dout <= 7'b0100000;4'h7:    led_dout <= 7'b0001111;4'h8:    led_dout <= 7'b0000000;4'h9:    led_dout <= 7'b0000100;default: led_dout <= 7'b0000001;     endcaseend
///====================================== led_we1 ===========================================
always@(posedge I_clk,posedge I_rst)begin           begin                                            if(I_rst)                                     led_we1 <= 1'b1;      //高位为无效else if(cur_state==display1)led_we1 <= 1'b0;elseled_we1 <= 1'b1;endend
///====================================== led_we2===========================================
always@(posedge I_clk,posedge I_rst)begin          begin                                            if(I_rst)                                     led_we2 <= 1'b1;else if(cur_state==display2)led_we2 <= 1'b0;elseled_we2 <= 1'b1;end
end   ///====================================== led_we3===========================================
always@(posedge I_clk,posedge I_rst)begin          begin                                            if(I_rst)                                     led_we3 <= 1'b1;else if(cur_state==display3)led_we3 <= 1'b0;elseled_we3 <= 1'b1;end end
///=================================== output ports =========================================
assign   O_led_a   = led_dout[6];
assign   O_led_b   = led_dout[5];
assign   O_led_c   = led_dout[4];
assign   O_led_d   = led_dout[3];
assign   O_led_e   = led_dout[2];
assign   O_led_f   = led_dout[1];
assign   O_led_g   = led_dout[0];
assign   O_led_we1 = led_we1    ;
assign   O_led_we2 = led_we2    ;
assign   O_led_we3 = led_we3    ;
//====================================instance IP core==============================================blk_mem_gen_0 rom_inst(.clka  (I_clk    ),.ena  (~I_rst    ),.addra (data_temp),.douta (rom_dout )
) ;endmodule
`timescale 1ns / 1psmodule stop_watch_clk_rst(input I_sys_clk_50M,  //  外部输入时钟input I_sys_rst_50M,   // 复位按键output O_clk,         // 输出10MHz的时钟output O_rst         // 输出复位
);wire rst_50M;              // 按键复位信号,按键复位按下为低0,需要取反
wire rst;
wire clk;
wire pll_locked;               //pll输出有效信号
reg rst_d1;
reg rst_d2;               //打拍 防止亚稳态assign rst_50M = ~I_sys_rst_50M;
assign rst = rst_50M  || ~pll_locked;always@(posedge clk or posedge rst_50M)beginif(rst_50M)beginrst_d1<=1'b1;rst_d2<=1'b1;endelsebeginrst_d1<=rst;rst_d2<=rst_d1;endendassign O_rst =rst_d2;
assign O_clk =clk;clk_wiz_0 clk_wiz_inst(.clk_in1(I_sys_clk_50M),.reset(rst_50M),.locked(pll_locked),.clk_out1(clk));endmodule
`timescale  1ns/1ps                                                                            module   stop_watch_top(input            I_sys_clk_50M ,input            I_sys_rst_50M , input            I_start       ,input            I_stop        ,output           O_led_a       ,   output           O_led_b       ,   output           O_led_c       ,   output           O_led_d       ,   output           O_led_e       ,   output           O_led_f       ,   output           O_led_g       ,   output           O_led_we1     ,output           O_led_we2     ,output           O_led_we3     ); wire  clk;
wire  rst;stop_watch_clk_rst stop_watch_clk_rst_inst(.I_sys_clk_50M (I_sys_clk_50M ),.I_sys_rst_50M (I_sys_rst_50M ),.O_clk         (clk           ),.O_rst         (rst           ));
stop_watch   stop_watch_inst(.I_clk       (clk        ),.I_rst       (rst        ),.I_start     (I_start    ),.I_stop      (I_stop     ),.O_led_a     (O_led_a    ),.O_led_b     (O_led_b    ),.O_led_c     (O_led_c    ),.O_led_d     (O_led_d    ),.O_led_e     (O_led_e    ),.O_led_f     (O_led_f    ),.O_led_g     (O_led_g    ),.O_led_we1   (O_led_we1  ),.O_led_we2   (O_led_we2  ),.O_led_we3   (O_led_we3  ));  endmodule

其中2进制转十进制,用了一个ROM的IP核,还用了一个pll的分频时钟的IP核;

FPGA实验---数码管秒表显示实验相关推荐

  1. FPGA学习--RGB-LCD屏彩条显示实验

    FPGA学习--RGB-LCD屏彩条显示实验 RGB-LCD屏原理 程序设计 参考正点原子视频 RGB-LCD屏原理 LCD 是一种液晶显示屏,它采用薄膜晶体管(TFT)技术提升图像质量,如提高图像亮 ...

  2. 实验六 键盘扫描显示实验(矩阵键盘)

    实验六 键盘扫描显示实验(矩阵键盘) 一.实验要求 在上一个实验的基础上,利用实验仪提供的键盘扫描电路和显示电路,做一个扫描键盘和数码显示实验,把按键输入的键码在八位数码管上显示出来. 实验程序可分成 ...

  3. 嵌入式开发:使用STM32CubeMX 和 Keil uVision5实现两位数码管循环显示实验

    一.STM32CubeMx实现数码管 1.双击打开STM32CubeMX. 2.点击File选项,在File列表下选择New Project选项新建工程. 3.在图中所示位置的方框中输入我们使用的芯片 ...

  4. 山东大学单片机原理与应用实验 3.7LCD 1602显示实验

    目录 一.实验题目 二.实验要求 三.实验过程及结果分析 四.实验流程图 五.实验源代码 一.实验题目 3.7 LCD 1602显示实验 二.实验要求 1.画出实验的流程图 2.编写源程序并进行注释 ...

  5. 【正点原子FPGA连载】 第二十八章OV5640 DP显示实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南

    1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: h ...

  6. 【正点原子FPGA连载】第二十四章HDMI彩条显示实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1

    1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码+手册+视频下载地址:ht ...

  7. 【正点原子FPGA连载】第二十一章 HDMI彩条显示实验 -摘自【正点原子】领航者ZYNQ之FPGA开发指南_V2.0

    1)实验平台:正点原子领航者ZYNQ开发板 2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761 3)全套实验源码+手册+视频下 ...

  8. 【正点原子FPGA连载】 第三十五章双目OV5640摄像头HDMI显示实验 摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0

    1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: h ...

  9. 【正点原子FPGA连载】 第十七章 HDMI彩条显示实验摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0

    1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: h ...

最新文章

  1. spark编程基础--5.1RDD编程基础
  2. bootstrap4 左侧导航栏 优秀 大气_志愿服务嘉年华|“持志隽永 赴愿奔行优秀志愿服务项目展示第六期...
  3. 【R】Rstudio set up
  4. C#类的属性遍历及属性值获取
  5. 教学交流研讨会总结(一)
  6. 前端学习(2363):数据缓存
  7. zip伪加密破解方法
  8. 全国政协常委胡晓炼:要重视数字货币与数字鸿沟问题
  9. could not be installed at this time
  10. Cisco Equipment Configuration SSH login
  11. 通达信波段王指标公式主图_通达信精选指标——组合波段王果断买入井喷金叉突破均线流公式...
  12. 神经网络 神经元_神经去耦
  13. 基于python的酒店管理系统_(完整版)新 基于web的酒店管理系统毕业论文
  14. 国内外最顶级的十大敏捷项目管理软件【2022】
  15. 超细节!数据分析社招面试指南
  16. 基于OpenCv+Django的网络实时视频流传输(前后端分离)
  17. 润迈德医疗开启招股:未有基石投资者参与,亏损金额翻倍增长
  18. 合天网安 在线实验 CTF竞赛 writeup(第六周 | 套娃一样的上传、第二十一周 | 你的空格哪去了、第十周 | 试试协议吧、第十一周 | 签到般的包含、第九周 | 试下phpinfo吧)
  19. 【剑指Offter】从上往下打印二叉树
  20. ws心跳检测完整代码,for websocket

热门文章

  1. Windows 10安装Adobe XD出现白屏闪退问题
  2. 高校动态|研究生被录取后放导师鸽子,学校要上报教育部失信名单取消其推免资格
  3. 微信扫描自定义二维码关注公众号并登录
  4. 银行数字化转型导师坚鹏:数字化背景下BLM银行网点转型
  5. CentOS6.5的安装及本地源的配置
  6. 蓝桥杯练习题之数列特征
  7. 备品管理方案怎么写_备品备件管理制度62802
  8. finder个人收藏和前往文件夹
  9. [luogu]P1852跳跳棋
  10. Linux wait和waitpid和kill