【Verilog零基础入门-边看边练】学习笔记——第五讲 时序逻辑代码设计和仿真(秒计数器)(二)

 二、用秒计数器驱动数码管实现0-9秒循环显示逻辑设计

所需软件

Verilog编程软件:Lattice Diamond(3.11.0.396.4_Diamond_x64)

Verilog仿真软件:ModelSim SE-64 10.2c(modelsim-win64-10.2c-se)

方法:用always语句实现秒计数器驱动数码管循环显示0-9秒逻辑设计

符号图: 

Verilog代码:

Part1:Test11_top.v文件(Verilog工程文件)

//2022-06-02
//用秒计时器驱动数码管实现0-9秒循环显示
module Test11_top(clk,res,a_g);
input					clk;
input					res;
output[6:0]				a_g;				//顶层内部信号,若只是为了连接,则定义成wire型即可

parameter				frequency_clk=24;	//假设系统时钟为24KHz
	
reg[24:0]				con_t;				//基于系统时钟的秒脉冲分频计数器。0到23999999计数,每循环一圈就是1秒。设系统时钟频率为24MHz。十进制的24兆(24000000D=?0001011011100011011000000000?B)转化为二进制需要占用25位。
reg						s_pulse;			//秒脉冲尖。1秒出现一次。两个秒脉冲尖之间表示一个系统时钟宽度。当秒脉冲分频计数器con_t计数为0后,秒脉冲尖为1;当秒脉冲分频计数器con_t计数为1后时起,秒脉冲尖为0(无秒脉冲尖),直到秒脉冲分频计数器计数再次为0后,秒脉冲尖再次为1,如此反复。
reg[3:0]				s_num=0;			//秒计数。对秒脉冲出现的次数进行计数,计数范围是0-9。
											//对s_num赋初值0
											//虽然a_g是输出端口,但是若想在always语句里赋值,也需要把它定义成reg型变量。等同于一个触发器,故需要对其复位。
reg[6:0]				a_g=7'b1111111;		//对数码管赋初值,显示“8”
 
always@(posedge clk or negedge res) begin
if(~res) begin
	con_t<=0;s_pulse<=0;s_num<=0;a_g=7'b1111111;
end
else begin
	//秒脉冲分频计数器con_t,计数范围0-23999999
	if(con_t==frequency_clk*1000-1) begin	//如果秒脉冲分频计数器con_t的计数值(1秒之内秒脉冲的个数)达到分频系数:frequency_clk*1000-1
		con_t<=0;							//对秒脉冲分频计数器清零
	end
	else begin								//如果秒脉冲分频计数器con_t的计数值(1秒之内秒脉冲的个数)未达到分频系数:frequency_clk*1000-1
		con_t<=con_t+1;						//秒脉冲分频计数器继续计数
	end
	
	//秒脉冲尖发生器s_pulse,电平状态1或0
	if(con_t==0) begin						//如果秒脉冲分频计数器con_t的计数值为零
		s_pulse<=1;							//将秒脉冲发生器s_pulse置1,秒脉冲是“尖”的形态,得到秒脉冲尖
	end
	else begin								//如果秒脉冲分频计数器con_t的计数值不为零
		s_pulse<=0;							//将秒脉冲发生器s_pulse置0,秒脉冲不是“尖”的形态
	end

	//秒(秒脉冲尖)计数器s_num,计数范围0-9
	if(s_pulse) begin						//如果秒脉冲发生器s_pulse不为0
		if(s_num==9) begin					//如果秒计数器s_num记录的秒脉冲尖(秒脉冲发生器s_pulse为1的状态)的个数已经达到9个
			s_num<=0;						//对秒计数器清零
		end
		else begin							//如果秒计数器s_num记录的秒脉冲尖(秒脉冲发生器s_pulse为1的状态)的个数未达到9个
			s_num<=s_num+1;					//秒计数器+1,用于对秒脉冲尖(秒脉冲发生器s_pulse为1的状态)计数。两个秒脉冲尖之间的时间间隔是1秒。
		end
	end
	
	//用case语句实现数码管逻辑
	case(s_num)								//用case语句实现组合逻辑
	4'd0: begin a_g<=7'b1111110; end		//当num为十进制的0时,a_g输出为1111110,数码管显示0。
	4'd1: begin a_g<=7'b0110000; end		//当num为十进制的1时,a_g输出为011_0000,数码管显示1。	
	4'd2: begin a_g<=7'b1101101; end		//当num为十进制的2时,a_g输出为110_1101,数码管显示2。	
	4'd3: begin a_g<=7'b1111001; end		//当num为十进制的3时,a_g输出为111_1001,数码管显示3。
	4'd4: begin a_g<=7'b0010011; end		//当num为十进制的4时,a_g输出为001_0011,数码管显示4。
	4'd5: begin a_g<=7'b1011011; end		//当num为十进制的5时,a_g输出为101_1011,数码管显示5。
	4'd6: begin a_g<=7'b1011111; end		//当num为十进制的6时,a_g输出为101_1111,数码管显示6。
	4'd7: begin a_g<=7'b1110000; end		//当num为十进制的7时,a_g输出为111_0000,数码管显示7。
	4'd8: begin a_g<=7'b1111111; end		//当num为十进制的8时,a_g输出为111_1111,数码管显示8。
	4'd9: begin a_g<=7'b1111011; end		//当num为十进制的9时,a_g输出为111_1011,数码管显示9。
 	//Verilog中的数字表达式:<位宽><进制><数字>
	//'b:二进制,eg 4'b1010,表示4位二进制数1010
	//'h:十六进制,eg 8'hef、4'ha
	//'d:十进制,eg 2'd3(二位的十进制数3)、4'd15(不能写16,4位最大是15,意为十进制数15,0000001111)
	default: begin a_g<=7'b0000001; end	//当num不在0-9范围时,a_g输出为000_0001,数码管显示中杠“-”。
	endcase	
	
end
end

endmodule

Part2:Test11_top_tb.v文件(Verilog仿真文件)

//2022-06-02
//用秒计时器驱动数码管实现0-9秒循环显示-testbench of Test11_top
`timescale 1ns/10ps
module Test11_top_tb;
reg							clk_in;
reg							res_in;
wire[6:0]					a_g_out;				//仿真输出变量

Test11_top Test11_top(								//s_counter:module名;U1:例化名。为module名,不要带上“_tb”
							.clk(clk_in),
							.res(res_in),
							.a_g(a_g_out)			//括号中是顶层信号名,若不是端口,则需要定义成wire型完成连接							
							);
			
initial begin
							clk_in<=0;res_in<=0;

		#17					res_in<=1;				//过17ns,解除对时钟的复位
		#3000000			$stop;					//运行时长3000000ns。24KHz,计数24000次,一次10ns,循环一周期(计数一秒)为240000ns,则完成0~9的计数需要运行2400000ns。
end
 
always	#5					clk_in<=~clk_in;		//设定一个以10ns为周期的运行时钟

endmodule

仿真波形:

注意事项

1、对于顶层的内部信号,若只是为了连接,则定义成wire型即可;

2、若设定系统时钟为24KHz,且把分频系数选为23999,则需计数24000次,设定计数一次用时10ns(设定运行时钟周期为10ns),则循环一周期(计数1秒)为240000ns,那么完成0~9秒的计数需要运行2400000ns。

原教学视频链接如下

Verilog零基础入门_哔哩哔哩_bilibili

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
电子科技大学数字逻辑综合实验的实验4是关于Verilog时序逻辑设计的。这个实验旨在通过使用Verilog语言进行时序逻辑电路设计,帮助学生了解和掌握时序逻辑电路的基本概念和设计方法。 在本实验中,学生需要根据实验要求,设计一个特定的时序逻辑电路,并用Verilog代码实现。学生需要了解时序逻辑电路的特点和设计要求,包括时钟信号的边沿触发、时序逻辑门电路的功能等。 学生需要根据实验要求,编写Verilog代码来描述时序逻辑电路的行为和功能。他们需要使用Verilog语言的模块化设计方法,将时序逻辑电路划分为各个模块,每个模块描述特定的功能和行为。 在完成代码编写后,学生需要使用Verilog仿真工具来验证设计时序逻辑电路的功能和正确性。他们可以输入不同的输入信号,观察电路输出信号的变化情况,以确保电路的设计和功能是正确的。 最后,学生需要编写实验报告,详细描述实验过程、实验结果以及所学到的知识和经验。他们需要总结实验中遇到的问题和解决方法,以及对时序逻辑电路设计的理解和应用。 通过完成这个实验,学生将会掌握Verilog时序逻辑设计的基本原理和方法,了解时序逻辑电路的设计过程,提高代码编写和仿真验证的能力。这将为他们今后在数字逻辑设计领域的学习和工作中打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

社牛超靓的铁蛋儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值