VDHL-双边沿计数器

题目描述

(1)完成一个0~15之间循环计数的计数器,能在时钟信号的上升沿和下降沿都实现计数值的加1动作。
(2)完成一个0~8之间循环计数的计数器,能在时钟信号的上升沿和下降沿都实现计数值的加1动作。
(3)在(2)的基础上,产生进位信号。

代码实现

第一题

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY erer1 IS
PORT(	CLK:IN STD_LOGIC;      
	 	Q1:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)
      );
END;
ARCHITECTURE bhv OF erer1 IS 
signal cnt: STD_LOGIC_VECTOR(3 DOWNTO 0);
signal cnt1: STD_LOGIC_VECTOR(3 DOWNTO 0);  
begin
process(clk) begin
	if clk'event and clk='1' then
		cnt1 <= cnt + 1;
	end if;	
end process;
process(clk) begin
 	if clk'event and clk='0' then 
		cnt <= cnt1 + 1;
	end if;
end process;
process(clk) begin
 	if clk = '1' then
		Q1 <= cnt1;
	else
		Q1 <= cnt;
	end if;
end process;

end bhv;

第二题

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY erer1 IS
PORT(	CLK:IN STD_LOGIC;      
	 	Q1:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)
      );
END;
ARCHITECTURE bhv OF erer1 IS 
signal cnt: STD_LOGIC_VECTOR(3 DOWNTO 0);  
signal cnt1: STD_LOGIC_VECTOR(3 DOWNTO 0);
begin
process(clk) begin
	if clk'event and clk='1' then
		if cnt<8 then
			cnt1 <= cnt+1;
		else
			cnt1 <=  "0000";
		end if;
	end if;	
end process;
process(clk) begin
 	if clk'event and clk='0' then 
		if cnt1<8 then
			cnt <= cnt1+1;
		else
			cnt <=  "0000";
		end if;
	end if;
end process;
process(clk) begin
 	if clk = '1' then
		Q1 <= cnt1;
	else
		Q1 <= cnt;
	end if;
end process;

end bhv;

第三题

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY erer2 IS
PORT(	CLK:IN STD_LOGIC;      
	 	Q1:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
		cout:out STD_LOGIC
      );
END;
ARCHITECTURE bhv OF erer2 IS 
signal cnt: STD_LOGIC_VECTOR(3 DOWNTO 0);   
signal cnt1: STD_LOGIC_VECTOR(3 DOWNTO 0);
signal cout1,cout2: STD_LOGIC;
begin
process(clk) begin
	if clk'event and clk='1' then
		if cnt1 < 8 then
			cnt <= cnt1 + 1;cout1 <= '0';
		else
			cnt <= "0000"; cout1 <= '1';
		end if;	
	end if;	
end process;
process(clk) begin
 	if clk'event and clk='0' then 
		if cnt < 8 then
			cnt1 <= cnt + 1;cout2 <= '0';
		else
			cnt1 <= "0000"; cout2 <= '1';
		end if;		
	end if;
end process;
process(clk) begin
 	if clk = '1' then
		Q1 <= cnt1;
	else
		Q1 <= cnt;	end if;
	if clk = '1' then 
		cout <= cout2;
	else
		cout <= cout1;
	end if;
	-- 出现毛刺可以换成
	-- cout <= cout1 OR cout2; 
end process;
end bhv;
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值