目录

一、设计指标(同样的都是鲲鲲指定的,我直接贴过来)

二、计时器原理:

三、Verilog实现

1、十进制计数器:

2、六进制计数器:

3、六十进制计数器:

4、计时器:

5、时钟分频:50MHz->1KHz

6、时钟分频模块:50MHz->1Hz

7、数码管动态扫描模块:

8、BCD码译码模块:

9、LED显示模块:

10、顶层模块:

四、FPGA实现

1.管脚约束

2、实验效果


一、设计指标(同样的都是鲲鲲指定的,我直接贴过来)

在选择Basys 2/3型开发板,用Verilog语言描述,设计一个计时器,功能要求如下:

  1. 用Verilog语言描述,设计功能电路;
  2. 用数码管做一个计时器,四个数码管为
  3. 拨码开关开始计时与复位(无约束)
  4. 两种工作模式
    1. 可以从0开始计时,从00:00开始计时。
    2. 也可以自己设定倒数计时,比如从05:00开始倒数计时减到00:00。
  5. 假设输入晶振50MHz;
  6. 完成计时器的设计、前仿和后仿。

分(十位)

分(个位)

秒(十位)

秒(个位)

二、计时器原理:

笔者找了网上现有的方案,觉得由六进制计数器和十进制计数器搭建六十进制计数器,再由两个六十进制计数器在1Hz时钟下连接称为分、秒计时器的思路是比较清晰的,所以笔者的设计就是按照这个思路来的。

系统框图如下:

详细来说,首先构建十进制计数器和六进制计数器,再用十进制计数器作为六十进制计数器的个位,六进制计数器作为十位,构成六十进制计数器。每个六十进制计数器都有使能端和复位端,控制秒的六十进制计数器的进位信号连接控制分的六十进制计数器的使能端,每个计数器六十进制计数器中的十进制计数器和六进制计数器输出的数字为4位BCD码,这样就可以用我们之前讲解的通用数码管显示模块显示出来,高两位为分显示0~59,低两位为秒显示0~59;

三、Verilog实现

1、十进制计数器:

很常用的计数控制

module counter_10(input clk,input rst_n,input en,//使能output reg [3:0]dout,output co//进位);//输出BCD码always@(posedge clk or negedge rst_n)beginif(!rst_n)dout <= 4'd0;else if(en)beginif(dout == 4'd9)dout <= 4'd0;elsedout <= dout + 4'd1;endelsedout <= dout;end//当dout = 1001时产生进位assign co = dout[0] & dout[3];
endmodule

2、六进制计数器:

同十进制计数器一个思路

module counter_6(input clk,input rst_n,input en,//使能output reg [3:0]dout,output co//进位);//输出BCD码always@(posedge clk or negedge rst_n)beginif(!rst_n)dout <= 4'd0;else if(en)beginif(dout == 4'd5)dout <= 4'd0;elsedout <= dout + 4'd1;endelsedout <= dout;end//当dout = 0101时产生进位assign co = dout[0] & dout[2];
endmodule

3、六十进制计数器:

例化十进制计数器和六进制计数器,其中的进位控制逻辑需要主义

module counter_60(input clk,input rst_n,input en,//使能output [7:0]dout,output co//进位);//用一个十进制计数器和一个六进制计数器来构成60进制计数器//声明内部信号线wire co_10_1;//模10计数器的进位输出信号wire co_10;//模6计数器的选通信号wire co_6;//模6计数器的进位输出信号wire [3:0]dout_10,dout_6;//模块实例化//个位模十counter_10 c_10(.clk(clk),.rst_n(rst_n),.en(en),.dout(dout_10),.co(co_10_1));//十位模六counter_6 c_6(.clk(clk),.rst_n(rst_n),.en(co_10),.dout(dout_6),.co(co_6));//产生进位信号与八位输出assign co_10 = co_10_1 & en;assign co = co_10 & co_6;assign dout = {dout_6,dout_10};
endmodule

4、计时器:

在计时器中例化两个六十进制计数器

module Timer(input clk,input rst_n,input en,output [7:0]min_out,output [7:0]sec_out);//用两个模60计数器作为分、秒的信号//声明内部信号线wire co_sec_1,co_sec;//模块实例化counter_60 c_60_sec(.clk(clk),.rst_n(rst_n),.en(en),.dout(sec_out),.co(co_sec_1));counter_60 c_60_min(.clk(clk),.rst_n(rst_n),.en(co_sec),.dout(min_out));//产生进位assign co_sec = co_sec_1 & en;endmodule

5、时钟分频:50MHz->1KHz

将板子50MHz时钟分频称为1KHz时钟,用于数码管动态扫描

module clk_divider_1KHz(input clk,input rst_n,output reg clk_div);//输入板子50MHz时钟,输出1KHz时钟//计数分频:50000次reg [15:0]cnt = 16'd0;always@(posedge clk or negedge rst_n)beginif(!rst_n)begincnt <= 16'd0;endelse if(cnt == 16'd50000)begincnt <= 16'd0;endelsebegincnt <= cnt + 16'd1;endend//输出时钟控制always@(posedge clk or negedge rst_n)beginif(!rst_n)beginclk_div <= 1'b0;endelse if(cnt <= 16'd24999)beginclk_div <= 1'b1;endelsebeginclk_div <= 1'b0;endend
endmodule

6、时钟分频模块:50MHz->1Hz

将板子50MHz时钟分频为1Hz时钟,用于计时器计数

module clk_divider_1Hz(input clk,input rst_n,output reg clk_div);//输入板子50MHz时钟,输出1KHz时钟//计数分频:50000次reg [25:0]cnt = 26'd0;always@(posedge clk or negedge rst_n)beginif(!rst_n)begincnt <= 26'd0;endelse if(cnt == 26'd50_000_000)begincnt <= 26'd0;endelsebegincnt <= cnt + 26'd1;endend//输出时钟控制always@(posedge clk or negedge rst_n)beginif(!rst_n)beginclk_div <= 1'b0;endelse if(cnt <= 26'd24_999_999)beginclk_div <= 1'b1;endelsebeginclk_div <= 1'b0;endend
endmodule

7、数码管动态扫描模块:

输入1KHz时钟进行动态扫描,通过扫描计数器的状态选择相应的位并输出相应的段选码

module Display(input clk_div,input rst_n,input [7:0]Out_number_1,input [7:0]Out_number_2,input [7:0]Out_number_3,input [7:0]Out_number_4,output reg [7:0]duan_code,output reg [3:0]wei_code);//将输入的十六进制代码转换为共阳极数码管段选码动态扫描输出reg [2:0]sel_cnt;//扫描计数器//动态扫描//扫描计数器控制位选always@(posedge clk_div or negedge rst_n)beginif(!rst_n)beginsel_cnt <= 3'd0; endelse if(sel_cnt == 3'd4)beginsel_cnt <= 3'd0;endelsebeginsel_cnt <= sel_cnt + 3'd1;endend//位选与段选对应always@(posedge clk_div or negedge rst_n)beginif(!rst_n)beginwei_code <= 4'b0000;duan_code <= 8'hff;endelsebegincase(sel_cnt)3'd0:beginwei_code <= 4'b0001;duan_code <= Out_number_1;end3'd1:beginwei_code <= 4'b0010;duan_code <= Out_number_2;end3'd2:beginwei_code <= 4'b0100;duan_code <= Out_number_3;end3'd3:beginwei_code <= 4'b1000;duan_code <= Out_number_4;enddefault:beginwei_code <= 4'b0000;duan_code <= 8'hff;endendcaseendendendmodule

8、BCD码译码模块:

将计数器输出的BCD码转化为共阳极数码管的段选码,用于动态扫描显示

module wei_encoder(input [3:0]hex_number,output reg [7:0]display_code);//将输入的十六进制代码转换为共阳极数码管段选编码并输出always@(*)begincase(hex_number)4'b0000:display_code = 8'hc0;//04'b0001:display_code = 8'hf9;//14'b0010:display_code = 8'ha4;//24'b0011:display_code = 8'hb0;//34'b0100:display_code = 8'h99;//44'b0101:display_code = 8'h92;//54'b0110:display_code = 8'h82;//64'b0111:display_code = 8'hf8;//74'b1000:display_code = 8'h80;//84'b1001:display_code = 8'h90;//94'b1010:display_code = 8'h88;//A4'b1011:display_code = 8'h83;//B4'b1100:display_code = 8'hc6;//C4'b1101:display_code = 8'ha1;//D4'b1110:display_code = 8'h86;//E4'b1111:display_code = 8'h8e;//Fdefault:display_code = 8'hff;//无endcaseend
endmodule

9、LED显示模块:

突发奇想想用8个LED实现一个流水灯,计时一秒灯位移一次

module led_light(input clk,//1Hz时钟input rst_n,output reg [7:0]led);//初始化initialbeginled = 8'b0000_0001;end//循环位移always@(posedge clk or negedge rst_n)beginif(!rst_n)led <= 8'h00;elsebeginled[7:0] <= {led[6:0],led[7]};endend
endmodule

10、顶层模块:

module top(input clk,input rst_n,input en,output [3:0]wei_code,output [7:0]duan_code,output [7:0]led_display);//声明内部信号wire [7:0]sec_out;//八位BCD数:秒wire [7:0]min_out;//八位BCD数:分wire clk_div_1000;//系统50MHz时钟->1KHzwire clk_div_1;//系统50MHz时钟->1Hzwire [7:0]output_number_1;//数码管右一段选码wire [7:0]output_number_2;//数码管右二段选码wire [7:0]output_number_3;//数码管右三段选码wire [7:0]output_number_4;//数码管右四段选码//模块实例化//时钟分频,用于数码管扫描clk_divider_1KHz div_1(.clk(clk),.rst_n(rst_n),.clk_div(clk_div_1000));//时钟分频,用于计数器计数clk_divider_1Hz div_2(.clk(clk),.rst_n(rst_n),.clk_div(clk_div_1));//计时器:用于产生分、秒的压缩BCD码用于数码管扫描输出Timer timer(.clk(clk_div_1),.rst_n(rst_n),.en(en),.min_out(min_out),.sec_out(sec_out));//将二进制数转换位段选码,用于数码管扫描输出wei_encoder encoder_1(.hex_number(sec_out[3:0]),.display_code(output_number_1));wei_encoder encoder_2(.hex_number(sec_out[7:4]),.display_code(output_number_2));wei_encoder encoder_3(.hex_number(min_out[3:0]),.display_code(output_number_3));wei_encoder encoder_4(.hex_number(min_out[7:4]),.display_code(output_number_4));//数码管动态扫描模块,将段选码输出Display display(.clk_div(clk_div_1000),.rst_n(rst_n),.Out_number_1(output_number_1),.Out_number_2(output_number_2),.Out_number_3(output_number_3),.Out_number_4(output_number_4),.duan_code(duan_code),.wei_code(wei_code));//led流水灯,每一秒移动一次led_light led(.clk(clk_div_1),//1Hz时钟.rst_n(rst_n),.led(led_display));
endmodule

四、FPGA实现

1.管脚约束

根据开发板手册绑定管脚,管脚约束如下:

NET "led_display[7]" LOC = G1;
NET "led_display[6]" LOC = P4;
NET "led_display[5]" LOC = N4;
NET "led_display[4]" LOC = N5;
NET "led_display[3]" LOC = P6;
NET "led_display[2]" LOC = P7;
NET "led_display[1]" LOC = M11;
NET "led_display[0]" LOC = M5;
NET "wei_code[0]" LOC = F12;
NET "wei_code[1]" LOC = J12;
NET "wei_code[2]" LOC = M13;
NET "wei_code[3]" LOC = K14;
NET "duan_code[7]" LOC = N13;
NET "duan_code[6]" LOC = M12;
NET "duan_code[5]" LOC = L13;
NET "duan_code[4]" LOC = P12;
NET "duan_code[3]" LOC = N11;
NET "duan_code[2]" LOC = N14;
NET "duan_code[1]" LOC = H12;
NET "duan_code[0]" LOC = L14;
NET "clk" LOC = B8;
NET "en" LOC = P11;
NET "rst_n" LOC = N3;

2、实验效果

见视频(后续上传)

FPGA计时器

基于Basys2的分秒计时器的设计相关推荐

  1. 基于Basys2的Booth乘法器的设计

    目录 一.设计指标(老样子,鲲鲲定的,我直接贴上来) 二.Booth乘法原理 三.Verilog代码 1.Booth乘法器: 2.显示转换模块: 3.数值位译码器: 4.符号位译码器: 5.时钟分频模 ...

  2. 基于basys2驱动LCDQC12864B的verilog设计图片显示

    话不多说先上图 前言 在做这个实验的时候在网上找了许多资料,都是关于使用单片机驱动LCD显示,确实用单片机驱动是要简单不少,记得在FPGA学习交流群里问问题的时候,被前辈指教,说给我最好的指教便是别在 ...

  3. 基于Basys2的八位CPU的设计与FPGA实现

    目录 一.设计指标(鲲鲲提的要求,直接贴过来) 二.设计思路: 1.完整的8位CPU的设计: 2.本次设计思路: 三.Verilog实现 1.RAM: 2.指令寄存器IR 3.ALU 4.CPU 5. ...

  4. 基于Basys2开发板的简易电子琴和音乐播放器设计

    背景:华中科技大学 电测综合实验 主要功能:Basys2开发板外接一个扬声器(或无源蜂鸣器也可)实现电子琴和音乐播放器的功能.其中由于开发板上只有4个按键,所以电子琴功能只做了4个音调,分别对应于4个 ...

  5. 【电路方案】基于8086多种花色流水灯设计/8086秒表计时系统/8086电子琴设计/8086多功能密码锁设计/8086电子秒表计时器时钟系统设计/8086电子计时器控制设计/8086智能电子称称重

    基于8086多种花色流水灯仿真设计-汇编教程和protues画图 关于8086多种花色的流水冻控制电路方案,下面包含了汇编程序和配套的流水灯电路图,大家可以参考一下此方案教程.1.汇编程 CODE S ...

  6. android秒表课程设计,1258【毕设课设】基于单片机8155秒表计时器系统设计

    /***********************基于8155的8LED显示电子表设计************************************************/ #include ...

  7. 基于c语言单片机秒表课程设计,基于c语言单片机秒表课程设计要点.doc

    课程设计报告 课程名称:单片机原理及应用 报告题目:秒表 学生姓名: 所在学院:信息科学与工程学院 专业班级: 学生学号: 指导教师: 2013 年 12 月 25 日 课程设计任务书 报告题目秒表完 ...

  8. 基于FPGA的遥控数字时钟设计

    基于FPGA的遥控数字时钟设计报告 ​ ​ Author:张宏宇 摘要 ​ 数字时钟是一种通过数字显示时间的计时装置,本次项目采用Cyclone Ⅳ系列芯片,使用QuartusII开发环境,使用Ver ...

  9. 基于51单片机的电子时钟设计

    基于51单片机的电子时钟设计 0 功能介绍 1.从DS1302中读取时间显示 2.一共4个按键,按键1按下进入修改时间模式,再按下切换修改的时间变量,这个时候第2和3个按键就是修改时间变量的按键,修改 ...

最新文章

  1. python读取mtcars数据集并实现以下操作_Python可视化43 | plotnine≈R语言ggplot2,43plotnineR...
  2. 【科普】不同行业的常见数据分析的指标是什么?
  3. java arraylist 重复_Java中ArrayList去除重复元素
  4. A20 文件系统预装APK
  5. [洛谷P1231] 教辅的组成
  6. 红橙Darren视频笔记 点赞效果 动画练习
  7. Linux时间子系统(十六) clockevent
  8. 打游戏时领悟了“向死而生”,这个AI算法真的不虚强化学习
  9. ORM sqlachemy学习
  10. multisim模拟电路加法器_利用multisim仿真设计反相加法电路
  11. 控制策略 | PI控制器抗饱和积分的仿真分析
  12. 华硕主板如何用u盘启动计算机,华硕主板怎么设置u盘启动
  13. 计算机msvcp110.dll丢失,msvcp110.dll丢失怎样修复
  14. NPOI实现Word段落查找替换
  15. linux中mtd动态加载,Linux 2.6.11 下 MTD驱动情景实例分析
  16. c语言编程中的或逻辑的符号 符号如何输入,C语言中逻辑运算符(,||,!)和位运算符号(,|,^)...
  17. 国外大数据初创公司巨额融资 国内公司初长成
  18. java实训题:随机点名器
  19. Java 2.4(将磅转换为千克)编写程序,将磅数转换为千克数。程序提示输入用户磅数,然后转换为千克并显示结果。一磅等于0.454千克。下面是一个运行示例:
  20. python入门之字符串索引,切片

热门文章

  1. 阿里p8级软件测试被裁,能拿多少赔偿金?
  2. 2021年危险化学品经营单位安全管理人员考试内容及危险化学品经营单位安全管理人员最新解析
  3. 小白MacBook超级实战教程——装双系统WIN10
  4. rem与px之间的转换
  5. 入坑esp-01s 1.3寸OLED带农历时钟及天气显示(四)
  6. 暑期JAVA学习(41.1)TCP通信——多发多收消息
  7. 【部分翻译】NSBezierPath的基础知识
  8. 深度学习目标检测方法汇总
  9. Graz技术大学计算机图形与视觉小组PEGASUS项目介绍
  10. mysql vchar 磁盘碎片_mysql TEXT与BLOB 碎片整理