Verilog设计数字时钟

这篇具有很好参考价值的文章主要介绍了Verilog设计数字时钟。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、设计要求

二、模块总和

三、模块设计

1.顶层模块

2.秒分频模块

3.秒计数模块

4.分钟分频模块

5.分钟计数模块

6.小时分频模块

7.小时计数模块

8.数据分配数码管模块

9.数码管显示模块

10.管脚约束代码

四、引脚分配

一、设计要求

1.利用 NEXYS4 DDR 开发板设计一款数字时钟,能够正确显示时、分、秒;

2.数字时钟为24小时进制;

二、模块总和

verilog数字时钟设计,项目设计,fpga开发,学习,经验分享,开发语言

三、模块设计

1.顶层模块

module digital_clock_top(
	input clk,
	input rst_n,
	output  [7:0]sel,
	output  [7:0]seg
);
wire clk_1s;
wire clk_1f;
wire clk_1h;
wire [5:0]cnt_s;
wire [5:0]cnt_f;
wire [4:0]cnt_h;
wire [3:0]bit_s;
wire [3:0]tenbit_s;
wire [3:0]bit_f;
wire [3:0]tenbit_f;
wire [3:0]bit_h;
wire [3:0]tenbit_h;
digital_clock_div_s a(
	.clk(clk),
	.rst_n(rst_n),
	.clk_1s(clk_1s)
    );
digital_clock_count_s b(
	.clk(clk_1s),
	.rst_n(rst_n),
	.cnt_s(cnt_s) 
    );
digital_clock_div_f c(
	.clk(clk),
	.rst_n(rst_n),
	.clk_1f(clk_1f)
    );
digital_clock_count_f d(
	.clk(clk_1f),
	.rst_n(rst_n),
	.cnt_f(cnt_f) 
    );
digital_clock_div_h e(
	.clk(clk),
	.rst_n(rst_n),
	.clk_1h(clk_1h)
    );
digital_clock_count_h f(
	.clk(clk_1h),
	.rst_n(rst_n),
	.cnt_h(cnt_h)
    );
digital_clock_time g(
	.clk(clk),
	.rst_n(rst_n),
	.cnt_s(cnt_s),
	.cnt_f(cnt_f),
	.cnt_h(cnt_h),
	.bit_s(bit_s),
	.tenbit_s(tenbit_s),
	.bit_f(bit_f),
	.tenbit_f(tenbit_f),
	.bit_h(bit_h),
	.tenbit_h(tenbit_h) 
    );
digital_clock_digital h(
	.clk(clk),
	.rst_n(rst_n),
	.bit_s(bit_s),
	.tenbit_s(tenbit_s),
	.bit_f(bit_f),
	.tenbit_f(tenbit_f),
	.bit_h(bit_h),
	.tenbit_h(tenbit_h),
	.sel(sel),
	.seg(seg)
);
endmodule

2.秒分频模块

module digital_clock_div_s(
	input clk,
	input rst_n,
	output reg clk_1s
    );
//计数器计数1s的数值
reg [25:0]cnt1;
always @(posedge clk or negedge rst_n)
	if(!rst_n)
		cnt1 <= 0;
	else if(cnt1 == 26'd49999999)
		cnt1 <= 0;
	else 
		cnt1 <= cnt1 + 1;
//分频为1s
always @(posedge clk or negedge rst_n)
	if(!rst_n)
		clk_1s <= 0;
	else if(cnt1 == 26'd49999999)
		clk_1s <= ~clk_1s;
	else 
		clk_1s <= clk_1s;
endmodule

3.秒计数模块

module digital_clock_count_s(
	input clk,
	input rst_n,
	output reg [5:0]cnt_s //计数60秒
    );
	
always @(negedge clk or negedge rst_n)
	if(!rst_n)
		cnt_s <= 0;
	else if(cnt_s == 6'd59) 
		cnt_s <= 0;
	else	 
		cnt_s <= cnt_s + 1;

endmodule

4.分钟分频模块

module digital_clock_div_f(
	input clk,
	input rst_n,
	output reg clk_1f
    );
//计数器计数1分钟的数值
reg [31:0]cnt2;//计数值 ((60000000000/10=6000000000)/2-1)=2,999,999,999
always @(posedge clk or negedge rst_n)
	if(!rst_n)
		cnt2 <= 0;
	else if(cnt2 == 32'd2999999999)
		cnt2 <= 0;
	else 
		cnt2 <= cnt2 + 1;
//分频为1分钟
always @(posedge clk or negedge rst_n)
	if(!rst_n)
		clk_1f <= 0;
	else if(cnt2 == 32'd2999999999)
		clk_1f <= ~clk_1f;
	else 
		clk_1f <= clk_1f;
endmodule

5.分钟计数模块

module digital_clock_count_f(
	input clk,
	input rst_n,
	output reg [5:0]cnt_f //计数60分
    );
	
always @(negedge clk or negedge rst_n)
	if(!rst_n)
		cnt_f <= 0;
	else if(cnt_f == 6'd59) 
		cnt_f <= 0;
	else	 
		cnt_f <= cnt_f + 1;

endmodule

6.小时分频模块

module digital_clock_div_h(
	input clk,
	input rst_n,
	output reg clk_1h
    );
//计数器计数1小时的数值
reg [37:0]cnt3;//计数值 ((3600000000000/10=360000000000)/2-1)=179,999,999,999
always @(posedge clk or negedge rst_n)
	if(!rst_n)
		cnt3 <= 0;
	else if(cnt3 == 38'd179999999999)
		cnt3 <= 0;
	else 
		cnt3 <= cnt3 + 1;
//分频为1分钟
always @(posedge clk or negedge rst_n)
	if(!rst_n)
		clk_1h <= 0;
	else if(cnt3 == 38'd179999999999)
		clk_1h <= ~clk_1h;
	else 
		clk_1h <= clk_1h;
endmodule

7.小时计数模块

module digital_clock_count_h(
	input clk,
	input rst_n,
	output reg [4:0]cnt_h  //计数24小时
    );
always @(negedge clk or negedge rst_n)
	if(!rst_n)
		cnt_h <= 0;
	else if(cnt_h == 5'd23)
		cnt_h <= 0;
	else 	
		cnt_h <= cnt_h + 1;
		
endmodule

8.数据分配数码管模块

module digital_clock_time(
	input clk,
	input rst_n,
	input [5:0]cnt_s,
	input [5:0]cnt_f,
	input [4:0]cnt_h,
	output reg [3:0]bit_s,//个位秒
	output reg [3:0]tenbit_s,//十位秒
	output reg [3:0]bit_f,//个位分
	output reg [3:0]tenbit_f,//十位分
	output reg [3:0]bit_h,//个位时
	output reg [3:0]tenbit_h //十位时
    );
	
always @(posedge clk or negedge rst_n )
	if(!rst_n)
		begin 
			bit_s <= 0;
			tenbit_s <= 0;
		end
	else if (cnt_s < 6'd10)
		begin 
			bit_s <= (cnt_s%10);
			tenbit_s <= 0;
		end
	else if (cnt_s < 6'd20)
		begin 
			bit_s <= (cnt_s - 10);
			tenbit_s <= 1;
		end
	else if (cnt_s < 6'd30)
		begin 
			bit_s <= (cnt_s - 20);
			tenbit_s <= 2;
		end
	else if (cnt_s < 6'd40)
		begin 
			bit_s <= (cnt_s - 30);
			tenbit_s <= 3;
		end
	else if (cnt_s < 6'd50)
		begin 
			bit_s <= (cnt_s - 40);
			tenbit_s <= 4;
		end
	else if (cnt_s <= 6'd59)
		begin 
			bit_s <= (cnt_s - 50);
			tenbit_s <= 5;
		end

always @(posedge clk or negedge rst_n )
	if(!rst_n)
		begin 
			bit_f <= 0;
			tenbit_f <= 0;
		end
	else if (cnt_f < 6'd10)
		begin 
			bit_f <= (cnt_f%10);
			tenbit_f <= 0;
		end
	else if (cnt_f < 6'd20)
		begin 
			bit_f <= (cnt_f - 10);
			tenbit_f <= 1;
		end
	else if (cnt_f < 6'd30)
		begin 
			bit_f <= (cnt_f - 20);
			tenbit_f <= 2;
		end
	else if (cnt_f < 6'd40)
		begin 
			bit_f <= (cnt_f - 30);
			tenbit_f <= 3;
		end
	else if (cnt_f < 6'd50)
		begin 
			bit_f <= (cnt_f - 40);
			tenbit_f <= 4;
		end
	else if (cnt_f <= 6'd59)
		begin 
			bit_f <= (cnt_f - 50);
			tenbit_f <= 5;
		end

always @(posedge clk or negedge rst_n )
	if(!rst_n)
		begin 
			bit_h <= 0;
			tenbit_h <= 0;
		end
	else if (cnt_h < 5'd10)
		begin 
			bit_h <= (cnt_h%10);
			tenbit_h <= 0;
		end
	else if (cnt_h < 5'd20)
		begin 
			bit_h <= (cnt_h - 10);
			tenbit_h <= 1;
		end
	else if (cnt_h < 5'd23)
		begin 
			bit_h <= (cnt_h - 20);
			tenbit_h <= 2;
		end
endmodule

9.数码管显示模块

module digital_clock_digital(
	input clk,
	input rst_n,
	input [3:0]bit_s,//个位秒
	input [3:0]tenbit_s,//十位秒
	input [3:0]bit_f,//个位分
	input [3:0]tenbit_f,//十位分
	input [3:0]bit_h,//个位时
	input [3:0]tenbit_h, //十位时
	output reg [7:0]sel,//片选信号
	output reg [7:0]seg //段选信号
);
//1ms计数器
	reg [16:0]cnt4;
	always @(posedge clk or negedge rst_n)
		if(!rst_n)
			cnt4 <= 0;
		else if(cnt4 == 99999)//1000000/10=100000
			cnt4 <= 0;
		else 
			cnt4 <= cnt4 + 1;
//1ms使能时钟控制信号	
	reg clk_1ms;
	always @(posedge clk or negedge rst_n)
		if(!rst_n)
			clk_1ms <= 0;
		else if(cnt4 == 99999)
			clk_1ms <= 1;
		else 
			clk_1ms <= 0;
//位选计数器
	reg [2:0]num_cnt;
	always @(posedge clk or negedge rst_n)
	if(!rst_n)
		num_cnt <= 0;
	else if(clk_1ms)
		num_cnt <= num_cnt + 1;
//板上位选信号	共阳极 低电平有效
	always @(posedge clk)
		case(num_cnt)
			0:sel <=8'b1111_1110;//个位
			1:sel <=8'b1111_1101;//十位
			2:sel <=8'b1111_1011;
			3:sel <=8'b1111_0111;
			4:sel <=8'b1110_1111;
			5:sel <=8'b1101_1111;
			6:sel <=8'b1111_1111;
			7:sel <=8'b1111_1111;
		endcase 
//数据分配	
	wire [31:0]data;
	assign data[3:0] = bit_s;
	assign data[7:4] = tenbit_s;
	assign data[11:8] = bit_f;
	assign data[15:12] = tenbit_f;
	assign data[19:16] = bit_h;
	assign data[23:20] = tenbit_h;
	/*assign data[27:24] = 0;
	assign data[31:28] = 0; */
	
	reg [3:0]disp_tmp;
	always @(posedge clk)
		case(num_cnt)
			0:disp_tmp <= data[3:0];
			1:disp_tmp <= data[7:4];
			2:disp_tmp <= data[11:8];
			3:disp_tmp <= data[15:12];
			4:disp_tmp <= data[19:16];
			5:disp_tmp <= data[23:20];
			6:disp_tmp <= data[27:24];
			7:disp_tmp <= data[31:28];
		endcase 
		
//板上段选信号 共阳极 低电平有效	
	always @(posedge clk)
		case(disp_tmp)
			4'd0:seg <= 8'b1100_0000;
			4'd1:seg <= 8'b1111_1001;
			4'd2:seg <= 8'b1010_0100;
			4'd3:seg <= 8'b1011_0000;
			4'd4:seg <= 8'b1001_1001;
			4'd5:seg <= 8'b1001_0010;
	        4'd6:seg <= 8'b1000_0010;
			4'd7:seg <= 8'b1111_1000;
			4'd8:seg <= 8'b1000_0000;
			4'd9:seg <= 8'b1001_0000;
		endcase 
endmodule

10.管脚约束代码

set_property IOSTANDARD LVCMOS33 [get_ports {seg[7]}]
set_property IOSTANDARD LVCMOS33 [get_ports {seg[6]}]
set_property IOSTANDARD LVCMOS33 [get_ports {seg[5]}]
set_property IOSTANDARD LVCMOS33 [get_ports {seg[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {seg[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {seg[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {seg[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {seg[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {sel[7]}]
set_property IOSTANDARD LVCMOS33 [get_ports {sel[6]}]
set_property IOSTANDARD LVCMOS33 [get_ports {sel[5]}]
set_property IOSTANDARD LVCMOS33 [get_ports {sel[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {sel[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {sel[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {sel[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {sel[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports rst_n]
set_property PACKAGE_PIN E3 [get_ports clk]
set_property PACKAGE_PIN C12 [get_ports rst_n]
set_property PACKAGE_PIN U13 [get_ports {sel[7]}]
set_property PACKAGE_PIN K2 [get_ports {sel[6]}]
set_property PACKAGE_PIN T14 [get_ports {sel[5]}]
set_property PACKAGE_PIN P14 [get_ports {sel[4]}]
set_property PACKAGE_PIN J14 [get_ports {sel[3]}]
set_property PACKAGE_PIN T9 [get_ports {sel[2]}]
set_property PACKAGE_PIN J18 [get_ports {sel[1]}]
set_property PACKAGE_PIN J17 [get_ports {sel[0]}]
set_property PACKAGE_PIN R10 [get_ports {seg[1]}]
set_property PACKAGE_PIN K16 [get_ports {seg[2]}]
set_property PACKAGE_PIN K13 [get_ports {seg[3]}]
set_property PACKAGE_PIN P15 [get_ports {seg[4]}]
set_property PACKAGE_PIN T11 [get_ports {seg[5]}]
set_property PACKAGE_PIN L18 [get_ports {seg[6]}]
set_property PACKAGE_PIN H15 [get_ports {seg[7]}]
set_property PACKAGE_PIN T10 [get_ports {seg[0]}]

四、引脚分配

verilog数字时钟设计,项目设计,fpga开发,学习,经验分享,开发语言

verilog数字时钟设计,项目设计,fpga开发,学习,经验分享,开发语言

verilog数字时钟设计,项目设计,fpga开发,学习,经验分享,开发语言文章来源地址https://www.toymoban.com/news/detail-736442.html

到了这里,关于Verilog设计数字时钟的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA实验报告 Verilog HDL:7人表决器 巴克码信号发生器 FPGA数字时钟

    写在前面:本文提供以下三个任务的思路讲解和代码实现, 如需参考引脚配置说明,可以点击下方链接跳转查看完整实验报告 ;本实验使用的是Altera公司的cycloneⅢ类型的芯片。 Verilog HDL实现:7人表决器 信号发生器 多功能数字时钟 实验目标:实现7人投票表决电路,支持人

    2024年02月05日
    浏览(46)
  • 基于vivado(语言Verilog)的FPGA学习(5)——跨时钟处理

    慢时钟到快时钟一般都不需要处理,关键需要解决从快时钟到慢时钟的问题,因为可能会漏信号或者失真,比如: 第一种办法是开环解决方案,也就是人为设置目标信号脉宽大于1.5倍的周期。但是容易和设计要求冲突 所以第二个大方法是闭环解决方案,也就是从改善同步方

    2024年02月03日
    浏览(44)
  • 【数字IC手撕代码】Verilog无毛刺时钟切换电路|题目|原理|设计|仿真

    芯片设计验证社区·芯片爱好者聚集地·硬件相关讨论社区·数字verifier星球 四社区 联合力荐 !近500篇 数字IC精品文章收录 ! 【数字IC精品文章收录】学习路线·基础知识·总线·脚本语言·芯片求职·EDA工具·低功耗设计Verilog·STA·设计·验证·FPGA·架构·AMBA·书籍 本系列旨在提

    2023年04月08日
    浏览(35)
  • m基于FPGA的数字下变频verilog设计

    目录 1.算法描述 2.仿真效果预览 3.verilog核心程序 4.完整FPGA 整个数字下变频的基本结构如下所示 NCO使用CORDIC算法,CIC采用h结构的CIC滤波器,HBF采用复用结构的半带滤波器,而FIR则采用DA算法结构。     这里,我们首先假设不考虑中频信号输入的载波频偏问题,即发送的中频

    2024年02月21日
    浏览(44)
  • Quartus数字秒表verilog代码青创QC-FPGA开发板

    名称:Quartus数字秒表verilog代码青创QC-FPGA开发板(文末获取) 软件:Quartus 语言:Verilog 代码功能: 数字秒表设计 1、支持复位、启动、暂停 2、具有量程切换功能,可以切换显示小时、分钟或者秒、毫秒 3、数码管显示时间,精确到10毫秒 FPGA代码Verilog/VHDL代码资源下载:www.hd

    2024年02月03日
    浏览(39)
  • FPGA项目设计:数字时钟

    项目要求: 设计一个数字时钟,数码管前两位显示小时,数码管中间两位显示分钟,数码管后面两位显示秒。 项目设计: 系统框架图: 计数模块时序图: 代码实现: 计数模块: 数码管显示模块: 顶层文件:

    2024年02月14日
    浏览(44)
  • Verilog学习笔记(3):Verilog数字逻辑电路设计方法

    例:用Verilog设计模256(8bits)计数器 (a)可综合程序描述方式 (b)常见的错误描述方式 同时Verilog的电路描述方式具有多样性,这也决定了对于电路设计的多样性。 例:用Verilog设计数字多路选择器 (a)采用真值表形式的代码 (b)采用逻辑表达式形式的代码 (c)采用结

    2023年04月08日
    浏览(116)
  • 【数字IC精品文章收录】近500篇文章|学习路线|基础知识|接口|总线|脚本语言|芯片求职|安全|EDA|工具|低功耗设计|Verilog|低功耗|STA|设计|验证|FPGA|架构|AMBA|书籍|

    1.1 索引目的 本篇索引旨在 收藏CSDN全站中有关数字IC领域高价值文章 ,在数字芯片领域中,就算将架构,设计,验证,DFT,后端诸多岗位加在一起的数量,都不及软件类一个细分方向的岗位数量多,反映在社区氛围或是开源资料的丰富度而言,数字IC领域相较于软件/互联网领

    2024年02月03日
    浏览(116)
  • 密码锁设计Verilog代码Quartus 睿智FPGA开发板

    名称:密码锁设计Verilog代码Quartus  睿智FPGA开发板(文末获取) 软件:Quartus 语言:Verilog 代码功能: 1、设计一个密码锁的控制电路,当输入正确代码时,输岀开锁信号用红灯亮、绿灯 熄灭表示关锁,用绿灯亮、红灯熄灭表示开锁 2、在锁的控制电路中储存一个可以修改的4位代

    2024年01月18日
    浏览(45)
  • 基于FPGA的数字电子琴——数电小系统设计【数字电子技术】(使用Vivado中的verilog语言)含piano代码文件(全)

    目录 一、电路功能描述 二、方案设计 1. 总体设计方案 2. 对原理框图或程序流程图做出简单解释 3. 各模块介绍 3.1 音频驱动模块 3.2 LED显示模块 3.3 数码管显示模块 3.4 矩阵键盘模块 3.5 PS2机械键盘模块 3.6 时钟分频模块 3.7 曲谱生成模块 三、总结 数码管和LED显示模块 矩阵键盘

    2024年02月06日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包