数字时钟计数器(内含模60计数器以及8421BCD码计数器设计代码)

目录

前言

模60计数器

verilog设计代码如下:

ISE综合

模24的8421BCD码计数器

原理

verilog HDL代码

测试文件

仿真波形

数字时钟计数器

verilog HDL代码

测试代码

仿真波形

ISE综合


前言

这是我刚开始写博客时候写的了,本身结构很丑,我于2018/8/2 15:26重新整理了下结构,就不删了,然后我又重新整理了一份博文,和这个一样,但要比这个清晰,贴出地址:数字时钟计数器(Verilog HDL语言描述)(仿真和综合),可以看这篇以及相关的那几个小模块部分。

简单的数字时钟计数器,其实现方法也是通过计数器的级联,由两个模60计数器和一个模24计数器子模块共同构成,下面的这段代码采用结构性描述方法,U1,U2,U3为调用的两个模60计数器和一个模24计数器子模块,模60计数器实现分秒的计数,模24计数器实现小时的计数。

在进行设计数字时钟计数器之前,分别介绍模60计数器count60以及8421BCD计数器count24。

模60计数器

verilog设计代码如下:

//模60计数器模块
module counter60(clk, rst_n, en, dout, co);
	input clk, rst_n, en;
	output co;
	output [7:0] dout;
	wire co10_1, co10, co6;
	wire [3:0] dout10, dout6;
	count10 U1(.clk(clk), .rst_n(rst_n), .en(en), .dout(dout10), .co(co10_1));
	count6 U2(.clk(clk), .rst_n(rst_n), .en(co10), .dout(dout6), .co(co6));
	and U3(co, co10, co6);
	and U4(co10, en, co10_1);
	assign dout = {dout6, dout10};
endmodule

//模10计数器
module count10(clk, rst_n, en, dout, co);
	input clk, rst_n, en;
	output co;
	output [3:0] dout;
	reg [3:0] dout;
	
	always @ (posedge clk or negedge rst_n)
		begin
			if(!rst_n)
				dout <= 4'b0000;
			else if(en == 1'b1)
				begin
					if(dout == 4'b1001)
						dout <= 4'b0000;
					else 
						dout <= dout + 1'b1;
				end
			else
				dout <= dout;
		end
		
	assign co = dout[0] & dout[3];
endmodule

//模6计数器
module count6(clk, rst_n, en, dout, co);
	input clk,
设计一个8421BCD三十六进加法计数器,并使用数码管显示个位计数,使用两个发光二极管显示十位计数,可以按照以下步骤进行: ### 1. 设计计数器逻辑 首先,我们需要设计一个三十六进制的计数器。由于8421BCD只表示0-9的数字,我们需要两个BCD来表示三十六进制的数。 #### 1.1 计数器块 我们可以使用两个BCD计数器来表示十位和个位。每当个位计数器达到9时,进位到十位计数器。 ```vhdl library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity BCD_Counter is Port ( clk : in STD_LOGIC; reset : in STD_LOGIC; enable : in STD_LOGIC; count : out STD_LOGIC_VECTOR (3 downto 0); carry : out STD_LOGIC); end BCD_Counter; architecture Behavioral of BCD_Counter is signal temp_count : STD_LOGIC_VECTOR (3 downto 0) := "0000"; begin process(clk, reset) begin if reset = '1' then temp_count <= "0000"; carry <= '0'; elsif rising_edge(clk) then if enable = '1' then if temp_count = "1001" then temp_count <= "0000"; carry <= '1'; else temp_count <= temp_count + 1; carry <= '0'; end if; end if; end if; end process; count <= temp_count; end Behavioral; ``` ### 2. 设计顶层块 顶层块将连接两个BCD计数器,并处理进位逻辑。 ```vhdl library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity ThirtySix_Counter is Port ( clk : in STD_LOGIC; reset : in STD_LOGIC; count_ones : out STD_LOGIC_VECTOR (3 downto 0); count_tens : out STD_LOGIC_VECTOR (3 downto 0); led_tens : out STD_LOGIC_VECTOR (1 downto 0)); end ThirtySix_Counter; architecture Behavioral of ThirtySix_Counter is signal count_ones_sig : STD_LOGIC_VECTOR (3 downto 0); signal count_tens_sig : STD_LOGIC_VECTOR (3 downto 0); signal carry_ones : STD_LOGIC; signal carry_tens : STD_LOGIC; begin ones_counter: entity work.BCD_Counter port map ( clk => clk, reset => reset, enable => '1', count => count_ones_sig, carry => carry_ones ); tens_counter: entity work.BCD_Counter port map ( clk => clk, reset => reset, enable => carry_ones, count => count_tens_sig, carry => carry_tens ); process(clk, reset) begin if reset = '1' then count_ones_sig <= "0000"; count_tens_sig <= "0000"; end if; end process; count_ones <= count_ones_sig; count_tens <= count_tens_sig; -- 两位LED显示十位 led_tens(0) <= '1' when count_tens_sig > "0000" else '0'; led_tens(1) <= '1' when count_tens_sig > "0001" else '0'; end Behavioral; ``` ### 3. 数码管显示 使用数码管显示个位计数,可以通过七段显示器的逻辑进行驱动。 ```vhdl library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity Seven_Segment_Display is Port ( digit : in STD_LOGIC_VECTOR (3 downto 0); segments : out STD_LOGIC_VECTOR (6 downto 0)); end Seven_Segment_Display; architecture Behavioral of Seven_Segment_Display is begin process(digit) begin case digit is when "0000" => segments <= "0000001"; when "0001" => segments <= "1001111"; when "0010" => segments <= "0010010"; when "0011" => segments <= "0000110"; when "0100" => segments <= "1001100"; when "0101" => segments <= "0100100"; when "0110" => segments <= "0100000"; when "0111" => segments <= "0001111"; when "1000" => segments <= "0000000"; when "1001" => segments <= "0000100"; when others => segments <= "1111111"; end case; end process; end Behavioral; ``` ### 4. 综合与仿真 将上述块综合在一起,并进行仿真测试,确保计数器逻辑正确,数码管显示和LED指示灯工作正常。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

李锐博恩

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

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

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

打赏作者

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

抵扣说明:

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

余额充值