资源预览内容
第1页 / 共41页
第2页 / 共41页
第3页 / 共41页
第4页 / 共41页
第5页 / 共41页
第6页 / 共41页
第7页 / 共41页
第8页 / 共41页
第9页 / 共41页
第10页 / 共41页
亲,该文档总共41页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
使用 VHDL 进行分频器设计作者:ChongyangLee摘要使用 VHDL 进行分频器设计作者:ChongyangLee本文使用实例描述了在 FPGA/CPLD 上使用 VHDL 进行分频器设计,包括偶数分频、非 50%占空比和 50%占空比的奇数分频、半整数(N+0.5)分频、小数分频、分数分频以及积分分频。所有实现均可通过 Synplify Pro 或 FPGA 生产厂商的综合器进行综合,形成可使用的电路,并在 ModelSim 上进行验证。目录概述.1 计数器 .1 普通计数器.1 约翰逊计数器 .3 分频器 .4 偶数分频器.4 奇数分频器.6 半整数分频器 .9 小数分频器.11 分数分频器.15 积分分频器.18 概述分频器是数字电路中最常用的电路之一,在FPGA 的设计中也是使用效率非常高的基本设计。基于FPGA实现的分频电路一般有两种方法:一是使用FPGA芯片内部提供的锁相环电路,如ALTERA提供的PLL (Phase Locked Loop),Xilinx 提供的 DLL(Delay Locked Loop);二是使用硬件描述语言,如VHDL、Verilog HDL 等。使用锁相环电路有许多优点,如可以实现倍频;相位偏移;占空比可调等。但FPGA 提供的锁相环个数极为有限,不能满足使用要求。因此使用硬件描述语言实现分频电路经常使用在数字电路设计中,消耗不多的逻辑单元就可以实现对时钟的操作,具有成本低、可编程等优点。计数器计数器是实现分频电路的基础,计数器有普通计数器和约翰逊计数器两种。这两种计数器均可应用在分频电路中。普通计数器最普通的计数器是加法(或减法)计数器。下面是加法计数器的VHDL实现,其Synplify Pro下的RTL View如图 1所示。-file Name: ripple.vhd-Description: 带复位功能的加法计数器library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity rippleisgeneric (width: integer := 4);port(clk, rst:in std_logic; cnt:out std_logic_vector(width - 1downto 0);end ripple;architecture aof ripple issignal cntQ: std_logic_vector(width - 1downto 0);beginprocess(clk, rst)beginif (rst = 1)then cntQ 0);elsif (clkeventand clk = 1)then cntQ = cntQ + 1;1endif;endprocess; cnt 4)port map(clk = clk_tb, rst = rst_tb, cnt = cnt_tb); clk_tb =not clk_tbafter 50 ns;processbegin rst_tb =transport 1;wait for 200 ns;2 rst_tb =transport 0;wait for 2000 ns;end process;end testbench;代码 2 加法计数器的 test bench 代码图 2 加法计数器的仿真结果波形在同一时刻,加法计数器的输出可能有多位发生变化,因此,当使用组合逻辑对输出进行译码时,会导致尖峰脉冲信号。使用约翰逊计数器可以避免这个问题。约翰逊计数器约翰逊计数器是一种移位计数器,采用的是把输出的最高位取非,然后反馈送到最低位触发器的输入端。约翰逊计数器在每个时钟下只有一个输出发生变化。下面是约翰逊计数器的 VHDL 实现代码。-file Name: ripple.vhd-Description: 带复位功能的约翰逊计数器library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity johnsonisgeneric (width: integer := 4); port (clk, rst: in std_logic; cnt: out std_logic_vector(width - 1downto 0);end johnson;architecture a of johnson issignal cntQ: std_logic_vector(width - 1downto 0);beginprocess(clk, rst) beginif(rst = 1)then cntQ 0); elsif (rising_edge(clk)then cntQ(width - 1downto 1) = cntQ(width - 2downto 0); cntQ(0) = not cntQ(width - 1); end if; end process;3 cnt = cntQ;end a;代码 3 约翰逊计数器 VHDL 代码图 3 约翰逊计数器 RTL 视图显然,约翰逊计数器没有有效利用寄存器的所有状态,假设最初值或复位状态为0000,则依次为0000、0001 、0011、0111、1111、1110、1100 、1000、0000 如此循环。再者,如果由于干扰噪声引入一个无效状态,如0010,则无法恢复到有效到循环中去,需要我们加入错误恢复处理,在
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号