分频器+计数器+数码管显示VHDL

天马星空,纯理论写代码,未实操

1.方案一

  • 波形(RTL)原理图+代码设计
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 代码
    • 1
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
-- 50Mhz
-- 任意Hz分频器
entity divide is
generic
(
	n:integer:=10;				--n分频
	m:integer:=3				--高电平
);
port
(
	clkin:in std_logic; 		--时钟输入		
	clkout: out std_logic	--时钟输出
);
end divide;
-- *************************************************************
architecture fenpin of divide is
signal count:integer range 0 to n-1;		-- 计数值
begin 
	process(clkin)
	begin 
		if(clkin' event and clkin= '1')then
			if(count<n-1) then
				count<=count+1;
			else
				count<=0;
			end if;
		end if;
	end process;
	clkout<='1' when count<m else
		'0';
end fenpin;
		



  • 2
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;

entity cnt is
port
(
	clk,clr :in std_logic;
	Q:out integer range 0 to 15
);
end cnt;

architecture counter of cnt is
signal temp: integer range 0 to 15;
begin 
	process(clk,clr)
	begin 
		if(clr='0') then
				temp<=0;
		elsif(clk'event and clk= '1')then
			if temp=9 then 
				temp<=0;
			else 
				temp<=temp+1;
			end if;
		end if;
		Q<=temp;
	end process;
end counter;
		


  • 3
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;

entity code47 is
port
(
	in47:in integer range 0 to 15;
	seq:out std_logic_vector(6 downto 0);
	s:out std_logic_vector(3 downto 0)
);
end code47;
-- 共阳管
architecture yima of code47 is

begin
	process(in47)
	begin
		s<="1000";
		case in47 is
			when 0 => seq<="1000000";
			when 1 => seq<="1111001";
			when 2 => seq<="0100100";
			when 3 => seq<="0110000";
			when 4 => seq<="0011001";
			when 5 => seq<="0010010";
			when 6 => seq<="0000010";
			when 7 => seq<="1111000";
			when 8 => seq<="0000000";
			when 9 => seq<="0010000";
			when others => seq<="1111111";
		end case;
			
	end process;
end yima;
				
		

  • 4
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;

entity chengxu is
port
(
	clk: in std_logic;
	clr: in std_logic;
	seq:out std_logic_vector(6 downto 0);
	s:out std_logic_vector(3 downto 0)
);
end chengxu;

architecture Dec of chengxu is
component divide 
generic
(
	n:integer;   --n分频
	m:integer	  --高电平
);
port
(
	clkin:in std_logic;
	clkout: out std_logic
);
end component;

component cnt 
port
(
	clk,clr :in std_logic;
	Q:out integer range 0 to 15
);
end component;
component code47 
port
(
	in47:in integer range 0 to 15;
	seq:out std_logic_vector(6 downto 0);
	s:out std_logic_vector(3 downto 0)
);
end component;


signal clkout:std_logic;
signal Qtemp:integer  range 0 to  15;

begin
	U1: divide generic map(10,3)
	port map(clk,clkout);
	U2: cnt port map(clkout,clr,Qtemp);
	U3: code47 port map(Qtemp,seq,s);
end Dec;
  1. 方案二
  • 波形(RTL)原理图+代码设计
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 代码
  • 1
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
-- 50Mhz
-- 任意Hz分频器
entity divide is
generic
(
	n:integer:=4;   			--n分频
	m:integer:=2	  			--高电平
);
port
(
	clkin:in std_logic;		--时钟输入
	clkout: out std_logic	--时钟输出
);
end divide;
-- ****************************************************
architecture fenpin of divide is
signal count:integer range 0 to n-1;    --计数值
begin 
	process(clkin)
	begin 
		if(clkin' event and clkin= '1')then
			if(count<n-1) then
				count<=count+1;
			else
				count<=0;
			end if;
		end if;
	end process;
	clkout<='1' when count<m else
		'0';
end fenpin;
		



  • 2
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
-- ****************************************************
-- 任意进制计数器 0-9999
entity cntx is
generic
(	
	num :integer range 0 to 9999:=100	--计数上限
);
port
(
	clk,clr :in std_logic;					--时钟输入,清零
	Q:out integer range 0 to num-1		--计数输出
);
end cntx;
-- ****************************************************
architecture counter of cntx is
signal temp: integer range 0 to num-1;
begin 
	process(clk,clr)
	begin 
		if(clr='0') then
				temp<=0;
		elsif(clk'event and clk= '1')then
			if temp=num-1 then 
				temp<=0;
			else 
				temp<=temp+1;
			end if;
		end if;
		Q<=temp;
	end process;
end counter;
		


  • 3
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
-- ****************************************************
-- 四位共阳数码管数值显示
entity codexx is
generic
(
	NumMax:integer range 0 to 9999:=100  --选择计数上限
);
port
(
	incode:in integer range 0 to NumMax-1;  	--数值输入
	clk: in std_logic;							--时钟控制
	seq:out std_logic_vector(6 downto 0);	--段码
	s:out std_logic_vector(3 downto 0)		--位码
);
end codexx;
-- ****************************************************
architecture yima of codexx is

type TT is array(3 downto 0) of integer range 0 to 9;  --自定义数组
signal temp:TT;
signal stemp:std_logic_vector(3 downto 0);
signal biao:integer range 0 to 3:=0;						
begin
	
	temp(0)<=incode rem 10;
	temp(1)<=(incode/10)  rem 10;
	temp(2)<=(incode/100)  rem 10;
	temp(3)<=(incode/1000);
	A:process(clk)				--进程A 检测上升沿,控制显示位
	begin 
		if clk'event and clk='1' then
			if(biao=3) then
				biao<=0;
			else
				biao<=biao+1;
			end if;
		end if;
	end process A;	
	B:process(biao)			--进程B 数值显示
	begin
		stemp <= "0000";
		stemp(biao)<='1';
		case temp(biao) is
			when 0 => seq<="1000000";
			when 1 => seq<="1111001";
			when 2 => seq<="0100100";
			when 3 => seq<="0110000";
			when 4 => seq<="0011001";
			when 5 => seq<="0010010";
			when 6 => seq<="0000010";
			when 7 => seq<="1111000";
			when 8 => seq<="0000000";
			when 9 => seq<="0010000";
			when others => seq<="1111111";
		end case;
		s<=stemp;
	end process B;
	
end yima;
				
		

  • 4
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
-- ****************************************************
entity chengxu is
port
(
	clk: in std_logic;					--时钟输入
	clr: in std_logic;					--清零
	seq:out std_logic_vector(6 downto 0);		--段码
	s:out std_logic_vector(3 downto 0)			--位码
);
end chengxu;
-- ****************************************************
architecture Dec of chengxu is
component divide 
generic
(
	n:integer;   --n分频
	m:integer	  --高电平
);
port
(
	clkin:in std_logic;
	clkout: out std_logic
);
end component;
-- ****************************************************
component cntx 
generic
(	
	num :integer 								--计数上限
);
port
(
	clk,clr :in std_logic;					--时钟输入,清零
	Q:out integer range 0 to num-1		--计数输出
);
end component;
-- ****************************************************
component codexx 
generic
(
	NumMax:integer 								--选择计数上限
);
port
(
	incode:in integer range 0 to NumMax-1;  	--数值输入
	clk: in std_logic;							--时钟控制
	seq:out std_logic_vector(6 downto 0);	--段码
	s:out std_logic_vector(3 downto 0)		--位码
);
end component;
-- ****************************************************
signal clkout:std_logic;
signal Qtemp:integer ;
begin
	U1: divide generic map(10,3)
	port map(clk,clkout);
	U2: cntx generic map(10)
	port map(clkout,clr,Qtemp);
	U3: codexx generic map(10)
	port map(Qtemp,clk,seq,s);
end Dec;
  • 10
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,我可以给你提供一些思路。 首先,我们需要了解一些基础知识: 1. 分频器:用于将输入的时钟信号分频,得到一个更低频率的信号输出,常用于时序控制电路中。 2. 8421十进制计数器:可以将二进制计数器计数结果转换成8421码,方便在数码管上进行显示。 3. 数码管译码器:将二进制码转换成数码管可以识别的信号,从而在数码管上显示数字。 接下来,我们可以根据这些基础知识,设计实现这个电路。 1. 分频器:可以使用计数器实现。计数器计数速度比输入时钟信号的速度慢,因此可以通过计数器的输出信号来实现分频。例如,如果需要将输入时钟信号分频为1/10,可以使用一个10位二进制计数器,当计数器计数到10时,输出一个脉冲信号,作为分频后的输出信号。 2. 8421十进制计数器:可以使用二进制计数器和编码器实现。二进制计数器计数结果是一个二进制数,需要将其转换成8421码。可以使用编码器将二进制数转换成8421码,然后将8421码输出到数码管译码器。 3. 数码管译码器:可以使用芯片实现。常用的芯片有7447和74LS47,这些芯片可以将8421码转换成数码管可以识别的信号,从而在数码管上显示数字。 最后,将分频器、8421十进制计数器和数码管译码器进行连接,即可实现在数码管上显示计数结果的电路。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值