`

试验五 计数器实验

 
阅读更多

实验内容

本次实验要设计一个计数器,并在数码管上面显示计数器的计数过程。
根据实验要求,程序大体可分为三个部分:分频部分,计数部分, 显示部分。
由于开发板提供的时钟频率是50MHz,人眼睛没法达到这个速度,四个数码管也
不好显示这么高频率计数后得到的巨大数字,所以要先对50MHz进行分频,这样才能
保证计数器每计一个数的周期在一秒左右。
计数部分由多个寄存器构成,每个时钟的上升沿,寄存器里面的数值就加一,计数
器复位数值是0000,当计满到9999的时候,计数器返回0000状态,重新开始计数。

module counter(clk,rst_n,
							 seg_en0,
							 seg_en1,
							 seg_en2,
							 seg_en3,
							 data0,
							 data1,
							 data2,
							 data3,
							 data4,
							 data5,
							 data6,
							 data7
							);
							
	input          clk,rst_n                          ;
	
	output         seg_en0,seg_en1,seg_en2,seg_en3    ;
	output         data0,data1,data2,data3            ;
	output         data4,data5,data6,data7            ;
	
	reg            seg_en0,seg_en1,seg_en2,seg_en3    ;
	reg    [24:0 ] clk_cnt                            ;
	reg    [3 :0 ] cnt0,cnt1,cnt2,cnt3                ;
	reg    [7 :0 ] data_out                           ;
	reg    [3 :0 ] state                              ;
	
	wire           data0,data1,data2,data3            ;
	wire           data4,data5,data6,data7            ;          
	wire           data_en0,data_en1,data_en2,data_en3;
	wire           clk_24,clk_15                      ;
	
	wire           cntin0 = 4'b0000                   ;
	wire           cntin1 = 4'b0000                   ;
	wire           cntin2 = 4'b0000                   ;
	wire           cntin3 = 4'b0000                   ;
	
parameter    SHOW0   =   4'b0001  ,
						 SHOW1   =   4'b0010  ,
						 SHOW2   =   4'b0100  ,
						 SHOW3   =   4'b1000  ;
	
function [7 :0 ] translater3_8 ;
	input  [3 :0 ] cnt ;
	
	begin
		case ( cnt )
			4'b0000: translater3_8 = 8'b1111_1100 ;
			4'b0001: translater3_8 = 8'b0110_0000 ;
			4'b0010: translater3_8 = 8'b1101_1010 ;
			4'b0011: translater3_8 = 8'b1111_0010 ;
			4'b0100: translater3_8 = 8'b0110_0110 ;
			4'b0101: translater3_8 = 8'b1011_0110 ;
			4'b0110: translater3_8 = 8'b1011_1110 ;
			4'b0111: translater3_8 = 8'b1110_0000 ;
			4'b1000: translater3_8 = 8'b1111_1110 ;
			4'b1001: translater3_8 = 8'b1111_0110 ;
		endcase
	end
	
endfunction
	
always @ ( posedge clk or negedge rst_n )
	if( !rst_n )
		begin
			clk_cnt <= 25'b0_0000_0000_0000_0000_0000_0000 ;
		end
	else
		begin
			clk_cnt <= clk_cnt + 25'b0_0000_0000_0000_0000_0000_0001 ;
		end
		
assign clk_24 = clk_cnt[21] ;
assign clk_15 = clk_cnt[14] ;

always @ ( posedge clk_24 or negedge rst_n )
	if( !rst_n )
		begin
			cnt0 <= cntin0 ;
			cnt1 <= cntin1 ;
			cnt2 <= cntin2 ;
			cnt3 <= cntin3 ;
		end
	else
		begin
			if( (4'b1001 == cnt3) && (4'b1001 == cnt2) && (4'b1001 == cnt1) && (4'b1001 == cnt0) )
				begin
					cnt0 <= 4'b0000 ;
					cnt1 <= 4'b0000 ;
					cnt2 <= 4'b0000 ;
					cnt3 <= 4'b0000 ;
				end
			else
				begin
					if( (4'b1001 == cnt2) && (4'b1001 == cnt1) && (4'b1001 == cnt0) )
						begin
							cnt0 <= 4'b0000 ;
							cnt1 <= 4'b0000 ;
							cnt2 <= 4'b0000 ;
							cnt3 <= cnt3 + 4'b0001 ;
						end
					else
						begin
							if( (4'b1001 == cnt1) && (4'b1001 == cnt0) )
								begin
									cnt0 <= 4'b0000 ;
									cnt1 <= 4'b0000 ;
									cnt2 <= cnt2 + 4'b0001 ;
									cnt3 <= cnt3 ;
								end
							else
								begin
									if( 4'b1001 == cnt0 )
										begin
											cnt0 <= 4'b0000 ;
											cnt1 <= cnt1 + 4'b0001 ;
											cnt2 <= cnt2 ;
											cnt3 <= cnt3 ;
										end
									else
										begin
											cnt0 <= cnt0 + 4'b0001 ;
											cnt1 <= cnt1 ;
											cnt2 <= cnt2 ;
											cnt3 <= cnt3 ;
										end
								end
						end
				end
		end

assign   data_en0  =  (cnt0||cnt1||cnt2||cnt3) ? 1'b1 : 1'b0 ; 	
assign   data_en1  =  (cnt1||cnt2||cnt3) ? 1'b1 : 1'b0 ; 	
assign   data_en2  =  (cnt2||cnt3) ? 1'b1 : 1'b0 ; 	
assign   data_en3  =  (cnt3) ? 1'b1 : 1'b0 ;
//assign   data_en0  =  cnt0 ? 1'b0 : 1'b1 ; 	
//assign   data_en1  =  cnt1 ? 1'b0 : 1'b1 ; 	
//assign   data_en2  =  cnt2 ? 1'b0 : 1'b1 ; 	
//assign   data_en3  =  cnt3 ? 1'b0 : 1'b1 ; 		
		
always @ ( posedge clk_15 or negedge rst_n )
	if( !rst_n )
		begin
			state <= SHOW0 ;
			seg_en0 <= 1'b0 ;
			seg_en1 <= 1'b0 ;
			seg_en2 <= 1'b0 ;
			seg_en3 <= 1'b0 ;
			data_out <= 8'b0000_0000 ;
		end
	else
		begin
			case( state )
				SHOW0:
					begin
						seg_en0 <= data_en0 ;
						seg_en1 <= 1'b0 ;
						seg_en2 <= 1'b0 ;
						seg_en3 <= 1'b0 ;
						data_out[7:0] <= translater3_8(cnt0) ;
						state <= SHOW1 ;
					end
				SHOW1:
					begin
						seg_en0 <= 1'b0 ;
						seg_en1 <= data_en1 ;
						seg_en2 <= 1'b0 ;
						seg_en3 <= 1'b0 ;
						data_out[7:0] <= translater3_8(cnt1) ;
						state <= SHOW2 ;
					end
				SHOW2:
					begin
						seg_en0 <= 1'b0 ;
						seg_en1 <= 1'b0 ;
						seg_en2 <= data_en2 ;
						seg_en3 <= 1'b0 ;
						data_out[7:0] <= translater3_8(cnt2) ;
						state <= SHOW3 ;
					end
				SHOW3:
					begin
						seg_en0 <= 1'b0 ;
						seg_en1 <= 1'b0 ;
						seg_en2 <= 1'b0 ;
						seg_en3 <= data_en3 ;
						data_out[7:0] <= translater3_8(cnt3) ;
						state <= SHOW0 ;
					end
				default: state <= SHOW0 ;
			endcase
		end
		
assign  data0  =  data_out[0] ;
assign  data1  =  data_out[1] ;
assign  data2  =  data_out[2] ;
assign  data3  =  data_out[3] ;
assign  data4  =  data_out[4] ;
assign  data5  =  data_out[5] ;
assign  data6  =  data_out[6] ;
assign  data7  =  data_out[7] ;
				
endmodule		
/*
module test;

	reg          clk,rst_n                          ;
	
	wire         seg_en0,seg_en1,seg_en2,seg_en3    ;
	wire         data0,data1,data2,data3            ;
	wire         data4,data5,data6,data7            ; 
	
initial
	begin
		clk = 0 ;
		rst_n = 1 ;
		#10 rst_n = 0 ;
		#10 rst_n = 1 ;
		#100000000 $stop;
	end	
	always #5 clk = ~clk ;

counter cc_coun(.clk(clk),.rst_n(rst_n),
							 .seg_en0(seg_en0),
							 .seg_en1(seg_en1),
							 .seg_en2(seg_en2),
							 .seg_en3(seg_en3),
							 .data0(data0),
							 .data1(data1),
							 .data2(data2),
							 .data3(data3),
							 .data4(data4),
							 .data5(data5),
							 .data6(data6),
							 .data7(data7)
							);
							
endmodule
*/

 

分享到:
评论

相关推荐

    定时器 / 计数器 实验报告

    实验环境基于Windows XP系统,使用了启东试验教学平台作为编译环境。实验步骤包括线路连接、示波器校准、代码编写与编译、程序下载到8253以及实验数据的测试与分析。 实验中,8253的输入时钟频率为8MHz,通过分频器...

    计数器实验 192 390 161

    至于提供的"第五次试验PPt.ppt"文件,它可能包含了实验的详细步骤、电路图、真值表以及预期结果的分析。在PPT中,可能会讲解如何构建这些计数器电路,可能使用了集成芯片如D flip-flops或者JK flip-flops,以及如何...

    计数器实验

    【计数器实验】是单片机实验的一部分,主要目的是学习如何使用单片机的定时/计数器功能。在这个实验中,学生需要对外部的单脉冲信号进行计数,当计数达到5次时,会产生一个计数中断。这个实验在物理与机电工程学院的...

    五进制计数器分享.pdf

    实验的主要目的是设计一个自然二进制码的五进制计数器,并掌握同步时序电路逻辑设计的过程。 在实验中,首先需要确定状态转移图或状态转移表,然后进行状态化简、状态分配、选择触发器、排除孤立状态等步骤。最后,...

    试验三集成计数器.pdf

    本文主要介绍了试验三集成计数器的设计、实现和应用,涵盖了集成计数器的基本原理、设计方法、实验步骤和报表要求等方面。 一、实验目的 本实验旨在掌握集成计数器的构成、设计和实现计数电路,通过实验掌握集成...

    试验5定时器计数器试验报告.pdf

    这篇实验报告是关于单片机中的定时器/计数器应用的一个实例,主要涉及的知识点包括: 1. **定时器/计数器的工作原理**:定时器/计数器是单片机中重要的硬件资源,可以实现定时或计数功能。在本实验中,它被用来计算...

    单片机计数器使用试验

    单片机计数器是微控制器中不可或缺的一部分,它在电子系统中扮演着计数、定时和频率测量的重要角色。本试验将通过Proteus仿真软件来深入理解单片机...实验五--计数器,无疑是深入理解单片机计数器操作的一个重要步骤。

    07.定时器计数器试验.zip

    定时器计数器试验.zip"压缩包中,我们可以预见到一些关于如何在NUC972上进行定时器和计数器实验的资料或代码。 首先,我们需要理解定时器和计数器的基本概念。定时器是一种硬件设备,它可以在预设的时间间隔后产生...

    交换计数器实现试验报告四.pdf

    该试验报告主要关注的是交换计数器的实现,这是一个在计算机网络和通信领域中的关键组件,主要用于统计网络接口的流量和性能。以下是基于提供的部分内容详细解释的知识点: 1. **交换计数器**:交换计数器是网络...

    计数器功能试验-6页.pdf

    实验报告——计数器功能试验 本实验主要围绕两种类型的计数器展开,分别是4位可逆计数器74193和4位加法计数器74160,旨在帮助学生深入理解计数器的工作原理,并熟练运用EDA软件进行功能验证。 1. **4位可逆计数器...

    实验五 时序逻辑电路实验报告.pdf

    实验五时序逻辑电路实验报告 一、实验目的 掌握同步计数器设计方法与测试方法 掌握常用中规模集成计数器的逻辑功能与使用方法 二、实验设备 * THHD-2型数字电子计数实验箱 * 示波器 * 信号源器件 * 74LS163、74...

    实验7_51单片机定时计数_

    在这个实验中,51单片机将连接到一个试验箱,试验箱上有一个或多个按键,用于输入数字。每次按键被按下,定时器都会开始计数,直到接收到下一个按键输入时停止,并更新显示的数字。这意味着我们需要编写程序来处理...

    计数器说明书

    从工厂的生产线上对产品数量的监控,到实验室中对试验次数的记录,再到日常生活中如门票计数器、流量监控等,计数器都扮演着重要角色。 8. 计数器的维护与故障排除:为保证计数器长时间稳定运行,用户需要定期进行...

    电子-一种用于避雷计数器放电试验的测试装置

    试验过程中,测试装置需产生与真实雷电相似的电流波形和能量,以确保实验结果的可信度。 接着,我们讨论测试装置的构成。一个标准的避雷计数器放电试验装置可能包括以下几个部分:电源系统、脉冲发生器、控制单元、...

    数字系统设计实验报告计数器、累加器.pdf

    在实验五中,学生被要求设计一个十进制计数器。十进制计数器是指在每次时钟脉冲到来时,计数值会增加1,直到达到9后再回到0,形成0到9的循环。设计计数器通常分为两步:图形法设计和Verilog HDL语言设计。图形法设计...

    接口与通讯的实验报告

    **8253A定时/计数器实验** 8253A是一种可编程定时/计数器,常用于系统的定时、计数功能。实验中,我们研究了其工作模式、计数方式以及如何通过I/O指令进行编程配置。这为我们理解系统级的定时服务和中断处理提供了...

    清华大学数字电路multisim实验

    2-87 二-五-十进制异步计数器74LS290 2-88 用置零法将74LS160接成6进制计数器 2-89 2-88电路的改进 2-90 用置数法将74LS160接成6进制计数器(1) 2-91 用置数法将74LS160接成6进制计数器(2) 2-92 用两片74LS...

    接口技术实验2_8253定时计数实验

    实验中使用了两个计数器,分别是计数器0和计数器1。计数器0实现周期性负脉冲输出,时钟信号为1MHz,输出信号频率为1KHz。计数器1实现周期性方波输出,时钟信号为2MHz,输出信号频率为50KHz。 在实验中,我们需要画...

    计算机组成原理实验4-TEC-2试验计算机微程序控制器实验

    计算机组成原理实验是深入理解计算机系统底层运作的关键环节,本次实验——TEC-2试验计算机微程序控制器实验,旨在让参与者全面了解微程序控制器的工作原理和技术细节。微程序控制器是现代计算机的重要组成部分,它...

    数电实验报告试验五触发器及其应用.pdf

    实验报告的标题是“数电实验报告试验五触发器及其应用”,这意味着实验内容涉及到数字电子领域中的触发器及其实际应用。触发器是数字电路中最基本的时序逻辑元件之一,它们用于存储一位二进制信息,即“0”或“1”,...

Global site tag (gtag.js) - Google Analytics