verilog数字时钟设计

  • 功能说明
  • 问题分析及模块实现
    • 模24计数器
    • 模60计数器
      • 模6计数器
      • 模10计数器
      • 模60计数器
    • 数码管驱动电路
    • 11位控制位说明
    • 分频器
    • 数字时钟
  • 顶层文件实现
  • 写在后面

功能说明

本文实现一个采用同步计数,具有暂停以及用11位控制字进行时分秒置位功能的24h数字时钟。

问题分析及模块实现

数字时钟由时分秒三部分组成,为此需要设计分频器、模24的计数器和模60的计数器,此外为了在多位共阴极数码管上显示,还需要设计数码管的驱动电路,最后,为实现全置位的功能,设计了11位控制字来对复位进行控制。

模24计数器

一般模24计数器只需要5位二进制状态码即可实现,但考虑到数字时钟应用的特殊性,即需要两个数码管来显示,其中每一个数码管的显示信号均需要4位二进制数译码得到。因此,这里采用8位二进制状态码来设计,高4位为十位,低4位为个位。

//8421BCD码计数器,模24
module counter24(clk, rst_n, en, dout,set,set_flag);input clk, rst_n, en;
input set_flag;
input[7:0] set;
output[7:0] dout;
reg[7:0] dout;always@(posedge clk or negedge rst_n)
beginif(!rst_n)       //复位信号有效时,置位if(set_flag)dout <= set[7:0];elsedout<=dout;else if(en == 1'b0)   //计数使能无效时,输出不变dout <= dout;else if( (dout[7:4] == 4'b0010)&&(dout[3:0] == 4'b0011) )  //计数达到23时,输出清零dout <= 8'b00000000;else if(dout[3:0] == 4'b1001)       //低位达到9时,低位清零,高位加1begindout[3:0] <= 4'b0000;dout[7:4] <= dout[7:4] + 1'b1;endelse                     //上述情况都没有发生,则高位不变,低位加1begindout[7:4] <= dout[7:4];dout[3:0] <= dout[3:0] + 1'b1;end
end
endmodule

值得说明的是这里为了后续暂停、进位以及自定义置位等功能的实现,在每个计数器中都加入了使能信号en、置位标识set_flag、置位信号set输入和进位信号co输出。

模60计数器

这里所设计的模60计数器由一个模6计数器和一个模10计数器组成,其中模6计数器的4位状态输出表示十位,模10计数器的4位状态输出表示个位,两者组合产生模60计数器的8位输出。

模6计数器

//模6计数器模块
module counter6(clk, rst_n, en, dout, co,set,set_flag);input clk, rst_n, en;
input set_flag;
input [3:0]set;
output[3:0] dout;
reg [3:0] dout;
output co;always@(posedge clk or negedge rst_n)
beginif(!rst_n)if(set_flag)dout <= set[3:0];elsedout<=dout;        //系统置位else if(en)if(dout == 4'b0101)     //计数值达到5时,计数器清零dout <= 4'b0000;elsedout <= dout + 1'b1; //否则,计数器加1elsedout <= dout;endassign co = dout[0]&dout[2];  //当计数达到5(4'b1001)时,进位为1,计数值为其他,都没有进位endmodule

模10计数器

//模10计数器模块
module counter10(clk, rst_n, en, dout, co,set,set_flag);input clk, rst_n, en;
input set_flag;
input[3:0] set;
output[3:0] dout;
reg [3:0] dout;
output co;always@(posedge clk or negedge rst_n)
beginif(!rst_n )if(set_flag)dout <= set[3:0];elsedout<=dout;        //系统复位,计数器置为8(展示进位)else if(en)if(dout == 4'b1001)     //计数值达到9时,计数器清零dout <= 4'b0000;elsedout <= dout + 1'b1; //否则,计数器加1elsedout <= dout;endassign co = dout[0]&dout[3];  //当计数达到5(4'b1001)时,进位为1,计数值为其他,都没有进位endmodule

模60计数器

//模60计数器的Verilog HDL设计
module counter60(clk, rst_n, en, dout, co,set,set_flag);input clk, rst_n, en;
input set_flag;
input[7:0] set;
output[7:0] dout;
output co;
wire co10_1, co10, co6;
wire[3:0] dout10, dout6;counter10 inst_counter10(.clk(clk), .rst_n(rst_n), .en(en), .dout(dout10), .co(co10_1),.set(set[3:0]),.set_flag(set_flag)); //模10计数器的进位为co10_1
and u3(co10,en,co10_1); //co10_1与en的与为co10
counter6 inst_counter6(.clk(clk), .rst_n(rst_n), .en(co10), .dout(dout6), .co(co6),.set(set[7:4]),.set_flag(set_flag)); //co10_1与en的与为co10,作为模6计数器的使能信号
and u4(co, co10, co6); //模6计数器的进位和模6的使能信号co10的与作为模60计数器的进位assign dout = {dout6,dout10}; //模60计数器的输出,高位为模6计数器的输出,低位为模10计数器的输出,读法是8421BCD码读法endmodule

此处说明一点,当两个计数器连接在一起的时候,低位计数器的进位信号与低位计数器的使能信号做与运算得到高位计数器的使能信号。此时clk信号都是统一直接连接在各计数器的clk端上的,故所实现的计数器是同步计数器。

数码管驱动电路

由于数码管的显示频率与数字时钟频率不同,故在其内部需要实现一个分频,来产生数码管的片选信号。实现的原理是将一个18位二进制计数器的高3位状态译码,作为片选。值得一提的是这里有6个数码管,而高3位可以对8个数码管进行片选,所以在计数过程中还应该实现一个状态的跳转。

//数码管显示模块
module digital_tube_display(input clk,input rst_n,input [3:0] hex0, //第一个数码管显示的数字input [3:0] hex1,input [3:0] hex2,input [3:0] hex3,input [3:0] hex4,input [3:0] hex5,output reg [5:0] an,   //数码管选择output reg [7:0] sseg  //共阴极数码管信号);reg [3:0] hex_in; //进入的数字localparam N = 17;//数码管分频reg [N-1:0] regN; always@(posedge clk)beginregN <= regN + 1'b1;if (regN[N-1:N-3] == 3'b110) regN[N-1:N-3] <= 3'b000;//跳过110,111的情况endalways@ *begincase(regN[N-1:N-3])//使用分频信号的高三位作为数码管选择信号3'b000:beginan = 6'b111110; //选中第1个数码管hex_in = hex0; //数码管显示的数字由hex_in控制,显示hex0输入的数字;sseg[7] =0;end3'b001:beginan = 6'b111101; //选中第2个数码管,以此类推hex_in = hex1;sseg[7] =0;end3'b010:beginan = 6'b111011;hex_in = hex2;sseg[7] =1;//这里需要设置小数点end3'b011: beginan = 6'b110111;hex_in = hex3;sseg[7] =0;end3'b100: beginan = 6'b101111;hex_in = hex4;sseg[7] =1;//这里需要设置小数点end3'b101: beginan = 6'b011111;hex_in = hex5;sseg[7] =0;enddefault:beginan = 6'b111111;hex_in = 0;sseg[7] =0;endendcaseendalways@ (*)begincase(hex_in)4'h0: sseg[6:0] = 7'b1111110; //共阴极数码管4'h1: sseg[6:0] = 7'b0110000;4'h2: sseg[6:0] = 7'b1101101;4'h3: sseg[6:0] = 7'b1111001;4'h4: sseg[6:0] = 7'b0110011;4'h5: sseg[6:0] = 7'b1011011;4'h6: sseg[6:0] = 7'b1011111;4'h7: sseg[6:0] = 7'b1110000;4'h8: sseg[6:0] = 7'b1111111;4'h9: sseg[6:0] = 7'b1111011;4'ha: sseg[6:0] = 7'b1110111;4'hb: sseg[6:0] = 7'b0011111;4'hc: sseg[6:0] = 7'b1001110;4'hd: sseg[6:0] = 7'b0111101;4'he: sseg[6:0] = 7'b1001111;4'hf: sseg[6:0] = 7'b1000111;endcaseendendmodule

11位控制位说明

D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0
hour min sec H3 H2 H1 H0 L3 L2 L1 L0

hour:小时置位使能信号,=1时对小时置位,=0时不对小时置位。
min:分钟置位使能信号,=1时对分钟置位,=0时不对分钟置位。
sec:秒置位使能信号,=1时对秒置位,=0时不对秒置位。
H3~0:高4位置位信号。
L3~0:低4位置位信号。

注意当hour、min、sec同时为1时,时分秒会同时置为HL上表示的数,可以用来同步置0.

分频器

//分频
module demultiplication(clk,clk_out);
input clk;
output clk_out;
reg clk_out;
localparam Num=22;
reg [Num-1:0] count;
always @ (posedge clk) begincount <= count + 1'b1;
endalways @ (posedge clk) beginif(count == 1)beginclk_out <= ~clk_out;endelse beginclk_out<=clk_out;end
end
endmodule

数字时钟

//数字时钟
module digital_clock(input clk,input rst_n,input en,input[10:0] setting,output [7:0] hour,output [7:0] min,output [7:0] sec);//用两个模60计数器作为分秒信号
//用一个模24计数器作为小时信号
//计数器之间进位用co信号与使能信号与来得到
wire co_sec1,co_sec,co_min,co_min1;counter60 inst_sec(.clk(clk), .rst_n(rst_n), .en(en), .dout(sec), .co(co_sec1),.set_flag(setting[8]),.set(setting[7:0]));
and inst_and_sec(co_sec,en,co_sec1);counter60 inst_min(.clk(clk), .rst_n(rst_n), .en(co_sec), .dout(min), .co(co_min1),.set_flag(setting[9]),.set(setting[7:0]));
and inst_and_min(co_min,co_sec,co_min1);counter24 inst_hour(.clk(clk), .rst_n(rst_n), .en(co_min), .dout(hour),.set_flag(setting[10]),.set(setting[7:0]));endmodule

其中,en为使能,为0时时钟暂停。setting为11位控制位输入。当rst_n有一个负脉冲时根据控制位信息对时钟置位,为1时时钟正常工作。

顶层文件实现

module TOP(input clk,input rst_n,input en,input[10:0] setting, //11位控制位//S10为小时置位使能//S9为分钟置位使能//S8为秒置位使能//S7~S4为十位数字//S3~S0为个位数字output  [5:0] an,   //数码管选择output  [7:0] sseg  //数码管显示);  wire [7:0] hour;wire [7:0] min;wire [7:0] sec;wire clk_p;//clk_p为数字时钟所使用的时钟分频信号//时钟分频demultiplication inst_demultiplication(.clk(clk),.clk_out(clk_p));digital_clock inst_digital_clock(.clk(clk_p),.rst_n(rst_n),.en(en),.setting(setting),.hour(hour),.min(min),.sec(sec));wire [3:0] hex0; //第一个数码管显示的数字,以此类推wire [3:0] hex1;wire [3:0] hex2;wire [3:0] hex3;wire [3:0] hex4;wire [3:0] hex5;//sec assign hex0 = sec[3:0];assign hex1 = sec[7:4];//min assign hex2 = min[3:0];assign hex3 = min[7:4];//hour assign hex4 = hour[3:0];assign hex5 = hour[7:4];//数码管显示,注意数码管和时钟使用的是不同的分频时钟信号digital_tube_display inst_digital_tube_display(.clk(clk),.rst_n(rst_n),.hex0(hex0),.hex1(hex1),.hex2(hex2),.hex3(hex3),.hex4(hex4),.hex5(hex5),.an(an),.sseg(sseg));endmodule

代码中clk为系统自带时钟。此处的分频是写死的,可以根据实际需要去改分频器和驱动电路里面的localparam。频率太快会使得显示不正常,注意。

写在后面

学校数电实验总设计的代码,顺便放了上来,写代码的过程中参考了网上一些大佬的代码和思路,某些功能的实现可能会比较相似,给有需要的同学做一个参考吧。

不点个赞吗?
要工程文件可以评论留邮箱

Verilog数字系统设计——数字时钟(带暂停和任意位置位)相关推荐

  1. EDA课设(数字系统设计)--数字密码锁

    目录 1,注意 2,可能遇到的问题 3,题目描述 4,实现前期准备 5,实现代码 6,引脚设置 7,部分验证 1,注意 该博客是根据自己的课设报告写的,所以大家不要抄袭,仅用作给大家提供实现思路以及一 ...

  2. Verilog数字系统设计(夏宇闻)—课后思考题记录(上)

    00.绪论 1.什么是信号处理电路?它通常由哪两大部分组成? 数字信号处理电路是进行一些复杂的数字运算和数据处理,并且又有实时响应需求的电路. 它们通常是由高速专用数字逻辑系统或专用数字信号处理器所构 ...

  3. 在VIVADO上实现的非常简易的RISC-V CPU设计(来自《Verilog数字系统设计》夏宇闻著)

    在VIVADO上实现的非常简易的RISC-V CPU设计 一.实验要求重述: 1.实验目的 2.实验要求: 二.学习准备: 1.什么cpu? 2.cpu需要具有哪些部件? 3.什么是RISC_CPU? ...

  4. verilog学习|《Verilog数字系统设计教程》夏宇闻 第三版思考题答案(第十四章)

    <Verilog数字系统设计教程>夏宇闻 第三版思考题 答案合集 : Verilog学习系列 第三部分 1.用带电平敏感列表触发条件的always 块表示组合逻辑时,应该用哪一种赋值?   ...

  5. 《Verilog HDL与FPGA数字系统设计》书籍试读体验

    文章目录 前言 第一部分:数字系统基础 第二部分:数字系统设计实践 第三部分:可编程片上系统 总结 前言 最近参加一个面包板社区的图书试读活动:<Verilog HDL与FPGA数字系统设计&g ...

  6. 【Verilog数字系统设计(夏雨闻)6-------模块的结构、数据类型、变量和基本运算符号2】

    Verilog数字系统设计(夏雨闻)6-------模块的结构.数据类型.变量和基本运算符号2 常量 数字 参数型 变量 wire型 reg型 memory型 Verilog HDL中总共有19种数据 ...

  7. verilog学习|《Verilog数字系统设计教程》夏宇闻 第三版思考题答案(第五章)

    <Verilog数字系统设计教程>夏宇闻 第三版思考题 答案合集 :个人主页verilog专栏中 1.为什么建议在编写Verilog模块程序时,如果用到 if 语句建议大家把配套的else ...

  8. Verilog数字系统设计——10进制计数器,具有异步复位功能

    Verilog数字系统设计--10进制计数器,具有异步复位功能 题目 编程实现10进制计数器,具有异步复位功能,十位和个位用8421BCD码表示,各端口定义如下图所示: 仔细考虑端口定义中每个端口的含 ...

  9. 【Verilog数字系统设计(夏宇闻)4-----Verilog语法的基本概念2】

    Verilog数字系统设计(夏宇闻)3-----Verilog语法的基本概念2 Verilog 模块的基本概念 Verilog用于模块的测试 Verilog 模块的基本概念 下面先介绍几个简单的Ver ...

最新文章

  1. 适用于任何数据可视化需求的国外10个最佳JavaScript图表库
  2. centos安装ssdb
  3. ASP.NET 第五天 CSS在支付宝中的应用
  4. ASP.NET 快乐建站系列 -- 1. 十五分钟建立精美网站
  5. 【云计算】5_云存储产品介绍
  6. js for循环给object数组赋值
  7. wince6.0 s5pv210 中断
  8. 2012年9月计算机二级c语言,2012 年9月 全国计算机二级c语言试题
  9. Unity中提升像素字体清晰度
  10. python install pip 区别_pip install和python -m pip install有什么区别?
  11. struts2登录注册示例_Struts 2动作示例教程
  12. Java Script学习 6(转)
  13. 高度设置为100%无效的解决办法
  14. 阿里云黄海宇:视频云的云原生实践
  15. 1.概率论-组合分析
  16. n维椭球体积公式_初中物理公式总结(表格整理版)
  17. ubuntu处理视频 将视频转换成图片帧
  18. u盘启动linux出现grub,开机出现grub rescue报错如何解决 通用pe工具箱u盘启动盘制作工具教你...
  19. 谢国忠:2012年股市、楼市泡沫终将破灭
  20. DirectX12 3D游戏开发实践(龙书)第六章 利用Direct3D的绘制几何体

热门文章

  1. 腾讯、阿里纷纷看好的NFT,能否成为拯救区块链的良药?
  2. win10网络显示已连接到服务器异常,如何解决win10网络连接配置异常的问题
  3. HM编码器代码阅读(13)——帧间预测之AMVP模式(一)总体流程
  4. CentOS解决nginx autoindex 截断文件名,末尾出现乱码
  5. 液压比例阀放大器比例控制器比例阀放大板
  6. 本地BLAST的使用方法及基本操作步骤
  7. fpga实现dds和混频器
  8. 如何提升自己的设计能力
  9. 2021哔哩哔哩1024程序员节日第一弹:算法与安全
  10. 功放限幅保护_一种功放限幅器的制作方法