FPGA实验---数码管秒表显示实验
实验主要分为两大块:
第一部分就是秒表的实现功能;
第二部分就是数码管显示功能;
在这之前由于我们外部有启动,暂停的按钮,为了防止按键亚稳态需要打两拍寄存;
其中秒表显示部分主要实现是:
外部时钟采用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实验---数码管秒表显示实验相关推荐
- FPGA学习--RGB-LCD屏彩条显示实验
FPGA学习--RGB-LCD屏彩条显示实验 RGB-LCD屏原理 程序设计 参考正点原子视频 RGB-LCD屏原理 LCD 是一种液晶显示屏,它采用薄膜晶体管(TFT)技术提升图像质量,如提高图像亮 ...
- 实验六 键盘扫描显示实验(矩阵键盘)
实验六 键盘扫描显示实验(矩阵键盘) 一.实验要求 在上一个实验的基础上,利用实验仪提供的键盘扫描电路和显示电路,做一个扫描键盘和数码显示实验,把按键输入的键码在八位数码管上显示出来. 实验程序可分成 ...
- 嵌入式开发:使用STM32CubeMX 和 Keil uVision5实现两位数码管循环显示实验
一.STM32CubeMx实现数码管 1.双击打开STM32CubeMX. 2.点击File选项,在File列表下选择New Project选项新建工程. 3.在图中所示位置的方框中输入我们使用的芯片 ...
- 山东大学单片机原理与应用实验 3.7LCD 1602显示实验
目录 一.实验题目 二.实验要求 三.实验过程及结果分析 四.实验流程图 五.实验源代码 一.实验题目 3.7 LCD 1602显示实验 二.实验要求 1.画出实验的流程图 2.编写源程序并进行注释 ...
- 【正点原子FPGA连载】 第二十八章OV5640 DP显示实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南
1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: h ...
- 【正点原子FPGA连载】第二十四章HDMI彩条显示实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1
1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码+手册+视频下载地址:ht ...
- 【正点原子FPGA连载】第二十一章 HDMI彩条显示实验 -摘自【正点原子】领航者ZYNQ之FPGA开发指南_V2.0
1)实验平台:正点原子领航者ZYNQ开发板 2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761 3)全套实验源码+手册+视频下 ...
- 【正点原子FPGA连载】 第三十五章双目OV5640摄像头HDMI显示实验 摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0
1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: h ...
- 【正点原子FPGA连载】 第十七章 HDMI彩条显示实验摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0
1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: h ...
最新文章
- spark编程基础--5.1RDD编程基础
- bootstrap4 左侧导航栏 优秀 大气_志愿服务嘉年华|“持志隽永 赴愿奔行优秀志愿服务项目展示第六期...
- 【R】Rstudio set up
- C#类的属性遍历及属性值获取
- 教学交流研讨会总结(一)
- 前端学习(2363):数据缓存
- zip伪加密破解方法
- 全国政协常委胡晓炼:要重视数字货币与数字鸿沟问题
- could not be installed at this time
- Cisco Equipment Configuration SSH login
- 通达信波段王指标公式主图_通达信精选指标——组合波段王果断买入井喷金叉突破均线流公式...
- 神经网络 神经元_神经去耦
- 基于python的酒店管理系统_(完整版)新 基于web的酒店管理系统毕业论文
- 国内外最顶级的十大敏捷项目管理软件【2022】
- 超细节!数据分析社招面试指南
- 基于OpenCv+Django的网络实时视频流传输(前后端分离)
- 润迈德医疗开启招股:未有基石投资者参与,亏损金额翻倍增长
- 合天网安 在线实验 CTF竞赛 writeup(第六周 | 套娃一样的上传、第二十一周 | 你的空格哪去了、第十周 | 试试协议吧、第十一周 | 签到般的包含、第九周 | 试下phpinfo吧)
- 【剑指Offter】从上往下打印二叉树
- ws心跳检测完整代码,for websocket