基于BASYS3开发板Verilog的计时器实验

2024-01-29 08:58

本文主要是介绍基于BASYS3开发板Verilog的计时器实验,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

基于BASYS3开发板Verilog的计时器实验

因为Basys3开发板只有4位数码管,而且中间的那个冒号无法显示。所以我们做4位的时间显示,min:sec或者hour:min
然后我们如何去实现这个呢?首先需要利用系统时钟来计时,每秒或者每分钟变换一次,需要进位时进位,以及将数字显示出来。

1. 分频模块

因为时钟是动态的所以需要动态刷新,而人眼在每秒26帧以上时,会因为视觉暂留效应认为是连续变换的。也就是一个数码管至少一秒应该刷新26次以上,4位数码管至少应该是102Hz以上的刷新频率。
而BASYS3开发板的系统时钟的频率为50MHz或者100MHz。所以应该高频率的系统时钟分为低频的刷新时钟。而分频方式有2分频还有整数分频等方式。
这里使用整数分频,即系统时钟变换N次时,让输出脉冲变化一次。
注意:因为Verilog语言中 if 必须和 else 配对,不能只有if,不然会报错。

module clkdiv(input clk,input pau,input res,output reg clk100);parameter update_interval = 50000000 / 100 - 1;     integer selcnt;reg state; always @(posedge clk,posedge pau,posedge res)  //100Hzbeginif(res)beginstate<=0;selcnt<=0;clk100<=0;endelse if(pau)state=~state;else beginif(state)begin    if (selcnt == update_interval)  begin  selcnt <= 0;  clk100 <=~clk100;  endelseselcnt<=selcnt+1;endelseselcnt<=selcnt+0;end         endendmodule

输入为系统的时钟,res重置按钮/开关,pau暂停按钮/开关。这里update_interval代表的是分频值的大小,要分成100Hz。系统时钟每有update_interval个上升沿时输出脉冲发生一次变化,即完成分频。res表示reset,时间置0。而pau表示pause,暂停,按下第一次时,会认为是暂停,selcnt一直加0,从而使时间暂停。按下第二次之后,state取反,继续计数。

2.计数模块

输入为分频模块的输出的分频后的时钟脉冲,重置,输出为时间。代码为

module count(input clk100,input res,output [15:0]tim);integer q;reg[3:0]sec_0;reg[3:0]sec_1;reg[3:0]min_0;reg[3:0]min_1;always@(posedge clk100 or posedge res)beginif(res)beginq<=0;sec_1=4'b0000;sec_0=4'b0000;min_0=4'b0000;min_1=4'b0000;endelse beginif(q==100)beginq<=0;if(sec_0==4'b1001) begin sec_0<=4'b0000;if(sec_1==4'b0101)beginsec_1<=4'b0000;if(min_0==4'b1001)begin min_0<=4'b0000;if(min_1==4'b0101)min_1<=4'b0000;elsemin_1<=min_1+1;                    endelsemin_0<=min_0+1;        endelsesec_1<=sec_1+1;                             endelsesec_0<=sec_0+1;                    endelseq<=q+1; end             endassign tim={min_1,min_0,sec_1,sec_0};
endmodule

为什么这里没有把pau作为输入呢?因为时间的值是随着输入时钟变化的,而pause之后,分频模块里的时钟已经不再增加了,所以计数模块的值也不会发生变化了。

3.显示模块

普通的7段数码显示

module display(inout clk,input [15:0]tim,output reg[3:0] an,output reg[6:0] a_to_g);reg[1:0] sign;reg[3:0] digit;parameter update_interval = 50000000 / 160 - 1;     integer selcnt; always @(posedge clk)  //分频160Hzbegin  selcnt <= selcnt + 1;  if (selcnt == update_interval)  begin  selcnt <= 0;  sign <= sign+ 1;  end  endalways @(*) //选择位case(sign)0:begin an=4'b1110;digit=tim[3:0];end1:begin an=4'b1101;digit=tim[7:4];end2:begin an=4'b1011;digit=tim[11:8];end3:begin an=4'b0111;digit=tim[15:12];endendcasealways @(*)//显示段数case(digit)0:a_to_g=7'b0000001;1:a_to_g=7'b1001111;2:a_to_g=7'b0010010;3:a_to_g=7'b0000110;4:a_to_g=7'b1001100;5:a_to_g=7'b0100100;6:a_to_g=7'b0100000;7:a_to_g=7'b0001111;8:a_to_g=7'b0000000;9:a_to_g=7'b0000100;'hA:a_to_g=7'b0001000;'hB:a_to_g=7'b1100000;'hC:a_to_g=7'b0110001;'hD:a_to_g=7'b1000010;'hE:a_to_g=7'b0110000;'hF:a_to_g=7'b0111000;default:a_to_g=7'b0000001;endcaseendmodule

4.模块组合

module timer(input clk,input [1:0] btn,output [3:0] an,output [6:0] a_to_g,output dp);wire clk100;wire [15:0]tim; assign dp=1'b1;clkdiv ck(.clk(clk),.pau(btn[0]),.res(btn[1]),.clk100(clk100));count ct(.clk100(clk100),.res(btn[1]),.tim(tim));display dis(.clk(clk),.tim(tim),.an(an),.a_to_g(a_to_g));
endmodule

如下,限制文件可能会报“ambiguous clock”这个问题,这个要注释一句就好了,百度上好像有。这里不粘出来了。

这篇关于基于BASYS3开发板Verilog的计时器实验的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/656393

相关文章

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

HNU-2023电路与电子学-实验3

写在前面: 一、实验目的 1.了解简易模型机的内部结构和工作原理。 2.分析模型机的功能,设计 8 重 3-1 多路复用器。 3.分析模型机的功能,设计 8 重 2-1 多路复用器。 4.分析模型机的工作原理,设计模型机控制信号产生逻辑。 二、实验内容 1.用 VERILOG 语言设计模型机的 8 重 3-1 多路复用器; 2.用 VERILOG 语言设计模型机的 8 重 2-1 多

开发板NFS挂载文件目录

文章目录 序NFS1. 安装 NFS 服务器和客户端在服务器上(NFS 服务器端)在客户端上(NFS 客户端) 2. 配置 NFS 服务器创建共享目录编辑 `/etc/exports` 文件启动 NFS 服务 3. 在客户端挂载 NFS 共享创建挂载点挂载 NFS 共享验证挂载 4. 设置开机自动挂载5. 解决权限问题 序 本节主要实现虚拟机(服务器)与开发板(客户端)通过N

安卓开发板_联发科MTK开发评估套件串口调试

串口调试 如果正在进行lk(little kernel ) 或内核开发,USB 串口适配器( USB 转串口 TTL 适配器的简称)对于检查系统启动日志非常有用,特别是在没有图形桌面显示的情况下。 1.选购适配器 常用的许多 USB 转串口的适配器,按芯片来分,有以下几种: CH340PL2303CP2104FT232 一般来说,采用 CH340 芯片的适配器,性能比较稳定,价

61.以太网数据回环实验(4)以太网数据收发器发送模块

(1)状态转移图: (2)IP数据包格式: (3)UDP数据包格式: (4)以太网发送模块代码: module udp_tx(input wire gmii_txc ,input wire reset_n ,input wire tx_start_en , //以太网开始发送信

数字电路专题:verilog 阻塞赋值和非阻塞赋值

verilog 阻塞赋值 和 非阻塞赋值 “=”阻塞赋值, ”<=”非阻塞赋值。阻塞赋值为执行完一条赋值语句,再执行下一条,可理解为顺序执行,而且赋值是立即执行; 非阻塞赋值可理解为并行执行,不考虑顺序,在 always 块语句执行完成后,才进行赋值。 如下面的阻塞赋值: //代码如下:module top(din,a,b,c,clk);input din;input clk;out

LTspice模拟CCM和DCM模式的BUCK电路实验及参数计算

关于BUCK电路的原理可以参考硬件工程师炼成之路写的《 手撕Buck!Buck公式推导过程》.实验内容是将12V~5V的Buck电路仿真,要求纹波电压小于15mv. CCM和DCM的区别: CCM:在一个开关周期内,电感电流从不会到0. DCM:在开关周期内,电感电流总会到0. CCM模式Buck电路仿真: 在用LTspice模拟CCM电路时,MOS管驱动信号频率为100Khz,负载为10R(可自

HarmonyOS】ArkTS学习之基于TextTimer的简易计时器的elapsedTime最小时间单位问题

本文旨在纪录自己对TextTimer使用过程的疑惑问题 我在查看教程时候,发现很多博客在onTimer(event: (utc: number, elapsedTime: number) => void) 这里提到elapsedTime:计时器经过的时间,单位为毫秒。我不清楚是否为版本问题。 在我查看version11和version10的api时候,说的都是设置格式的最小单位。 经过个人检验的

HCIA--实验十:路由的递归特性

递归路由的理解 一、实验内容 1.需求/要求: 使用4台路由器,在AR1和AR4上分别配置一个LOOPBACK接口,根据路由的递归特性,写一系列的静态路由实现让1.1.1.1和4.4.4.4的双向通信。 二、实验过程 1.拓扑图: 2.步骤: (下列命令行可以直接复制在ensp) 1.如拓扑图所示,配置各路由器的基本信息: 各接口的ip地址及子网掩码,给AR1和AR4分别配置

OpenGL/GLUT实践:流体模拟——数值解法求解Navier-Stokes方程模拟二维流体(电子科技大学信软图形与动画Ⅱ实验)

源码见GitHub:A-UESTCer-s-Code 文章目录 1 实现效果2 实现过程2.1 流体模拟实现2.1.1 网格结构2.1.2 数据结构2.1.3 程序结构1) 更新速度场2) 更新密度值 2.1.4 实现效果 2.2 颜色设置2.2.1 颜色绘制2.2.2 颜色交互2.2.3 实现效果 2.3 障碍设置2.3.1 障碍定义2.3.2 障碍边界条件判定2.3.3 障碍实现2.3.