vhdl分频器
1. 实验任务
- 尝试用两种或以上方式设计并实现一个分频器
2. 如何实现
二进制分频器的设计
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; use ieee.std_logic_unsigned.all; ENTITY DIV IS generic (N:integer :=2);--进行2的N次幂分频 PORT (fin:in std_logic; fout:out std_logic); end entity DIV; architecture behav of DIV is signal count :std_logic_vector(N-1 downto 0); begin process (fin) begin if(fin'event and fin='1') then count<=count+1;--计数值加一 end if; end process; fout<=count(N-1); end ;
偶分频器(占空比为50%)
Library ieee; Use ieee.std_logic_1164.all; Use ieee.std_logic_unsigned.all; Use ieee.std_logic_arith.all; Entity fp is generic(N: integer:=6); --rate=N,N是偶数 port( clkin: IN std_logic; clkout: OUT std_logic ); End fp; Architecture a of fp is signal cnt: integer range 0 to n-1; Begin process(clkin) --计数 begin if(clkin'event and clkin='1') then if(cnt<n-1) then cnt <= cnt+1; else cnt <= 0; end if; end if; end process; process(cnt) --根据计数值,控制输出时钟脉冲的高、低电平 begin if(cnt<n/2) then clkout <= '1'; else clkout <= '0'; end if; end process; End a;
奇分频器(占空比为50%)
Library ieee; Use ieee.std_logic_1164.all; Use ieee.std_logic_unsigned.all; Use ieee.std_logic_arith.all; Entity fp is generic(N: integer:=5); --rate=N,N是奇数 port( clkin: IN std_logic; clkout: OUT std_logic ); End fp; architecture a of fp is signal cnt1, cnt2: integer range 0 to N-1; begin process(clkin) begin if(clkin‘event and clkin=’1‘) then --上升沿计数 if(cnt1<N-1) then cnt1 <= cnt1+1; else cnt1 <= 0; end if; end if; end process; process(clkin) begin if(clkin‘event and clkin=’0‘) then --下降沿计数 if(cnt2<N-1) then cnt2 <= cnt2+1; else cnt2 <= 0; end if; end if; end process; clkout <= '1' when cnt1<(N-1)/2 or cnt2<(N-1)/2 else '0'; end a;
使用LPM 和绘图方式来实际N分频器
选择Tools中的MegaWizard Plug-In Manager命令,选择Creat a new custom megafunction variation,定制一个新的模版,在左侧栏中选择算术项Arthmetic下的LPM_COUNTER,进而一步步配置,得到一定位数,预制功能可定制的LPM计数器。
二进制分频器可视作一个n位的计数器和一个D触发器相连接,当计数器溢出时,D触发器翻转,从而构成分频器。
LPM_COUNTER配置好之后,可以编写D触发器,或者使用系统提供的D触发器。
最后通过原件例化语句或者画图的方式将两者连接在一起。
- D触发器
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY DDFF IS PORT (CLK_D,D:IN STD_LOGIC; Q:OUT STD_LOGIC); END; ARCHITECTURE bhv OF DDFF IS SIGNAL Q1:STD_LOGIC; BEGIN PROCESS (CLK_D,Q1) BEGIN IF CLK_D'EVENT AND CLK_D='1' THEN Q1<=D; END IF; END PROCESS; Q<=Q1; END bhv;
- LPM_COUNTER(具有同步加载、异步清零、加减控制)N进制计数器
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; use ieee.std_logic_unsigned.all; ENTITY CNT4BIT IS generic (N:integer :=4);--进行2的N次幂分频 PORT ( CLK,RST,ENA,SLD,UD:IN STD_LOGIC; DIN:IN STD_LOGIC_VECTOR(3 DOWNTO 0); COUT:OUT STD_LOGIC; DOUT:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END ENTITY CNT4BIT; ARCHITECTURE behav OF CNT4BIT IS SIGNAL TRANS :STD_LOGIC; component LPM_MD port( aclr,clk_en,clock,sload,updown:in std_logic; data:in std_logic_vector(3 downto 0); cout:out std_logic; q:out std_logic_vector(3 downto 0)); end component; component DDFF PORT (CLK_D,D:IN STD_LOGIC; Q:OUT STD_LOGIC); END component ; begin U1:LPM_MD PORT MAP(sload=>SLD, clk_en=>ENA, aclr=>RST, cout=>TRANS, clock=>CLK, data=>DIN, updown=>UD, q=>DOUT); U2:DDFF port map( CLK_D=>CLK, D=>TRANS, Q=>COUT ); END ARCHITECTURE behav;
3. 实验结果
- 仿真波形图
- LPM_DIV(16分频分频器)