vhdl中generic的分频用法
- 格式:docx
- 大小:28.69 KB
- 文档页数:4
VHDL语言中generic(类属)类属GENERIC 参量是一种端口界面常数,常以一种说明的形式放在实体或块结构体前的说明部分。
类属为所说明的环境提供了一种静态信息通道,类属与常数不同,常数只能从设计实体的内部得到赋值且不能再改变,而类属的值可以由设计实体外部提供。
因此设计者可以从外面通过类属参量的重新设定而容易地改变一个设计实体或一个元件的内部电路结构和规模。
类属参量以关键词GENERIC 引导一个类属参量表,在表中提供时间参数或总线宽度等静态信息。
类属表说明用于设计实体和其外部环境通信的参数,传递静态的信息。
类属在所定义的环境中的地位与常数十分接近,但却能从环境,如设计实体,外部动态地接受赋值,其行为又有点类似于端口PORT,因此常如以上的实体定义语句那样将类属说明放在其中,且放在端口说明语句的前面。
在一个实体中定义的来自外部赋入类属的值可以在实体内部或与之相应的结构体中读到,对于同一个设计实体,可以通过GENERIC 参数类属的说明,为它创建多个行为不同的逻辑结构,比较常见的情况是利用类属来动态规定一个实体的端口的大小,或设计实体的物理特性,或结构体中的总线宽度,或设计实体中底层中同种元件的例化数量等等。
一般在结构体中,类属的应用与常数是一样的,例如:当用实体例化一个设计实体的器件时,可以用类属表中的参数项定制这个器件,如可以将一个实体的传输延迟,上升和下降延时等参数加到类属参数表中,然后根据这些参数进行定制,这对于系统仿真控制是十分方便的。
其中的常数名是由设计者确定的类属常数名,数据类型通常取INTEGER 或TIME 等类型,设定值即为常数名所代表的数值,但需注意VHDL 综合器仅支持数据类型为整数的类属值。
程序3-2和3-3是两个使用了类属说明的实例描述程序3-2ENTITY mcu1 ISGENERIC (addrwidth : INTEGER := 16);PORT(add_bus : OUT STD_LOGIC_VECTOR(addrwidth-1 DOWNTO 0) );...在这里GENERIC 语句对实体mcu1 作为地址总线的端口add_bus 的数据类型和宽度作了定义即定义add_bus 为一个16 位的标准位矢量定义addrwidth 的数据类型是整数INTEGER 其中常数名addrwidth减 1 即为15 所以这类似于将上例端口表写成PORT (add_bus : OUT STD_LOGIC_VECTOR (15 DOWNTO 0));由程序3-2 可见对于类属值addrwidth 的改变将对结构体中所有相关的总线的定义同时作了改变由此将改变整个设计实体的硬件结构程序3-3 2输入与门的实体描述VHDL实用教程22ENTITY PGAND2 ISGENERIC ( trise : TIME := 1 ns;tfall : TIME := 1 ns ) ;PORT ( a1 : IN STD_LOGIC ;a0 : IN STD_LOGIC ;z0 : OUT STD_LOGIC );END ENTITY PGAND2;这是一个准备作为 2 输入与门的设计实体的实体描述在类属说明中定义参数trise 为上沿宽度tfall为下沿宽度它们分别为1ns 这两个参数用于仿真模块的设计以下的程序3-5 是一个顶层设计文件它在例化语句中调用了程序3-4 读者应注意到在程序3-4 中的类属变量n 并没有如程序3-2 那样明确规定了它的取值n 的具体取值是在程序3-5 中的类属映射语句GENERIC MAP ( )中指定的并在两个不同的类属映射语句中作了不同的赋值程序3-4 和3-5 给出了类属语句的一种典型应用。
目录一、设计任务与要求 (3)二、总体框图 (3)三、选择器件 (4)四、功能 (5)1、数控分频器 (5)2、BCD译码器 (6)3、扫描器 (11)4、3-8译码器 (13)5、7段数码管显示译码器 (16)五、总体设计电路图 (19)1总体(顶层)电路原理图 (19)2仿真结果 (19)3管脚分配图 (20)4.硬件连接情况 (20)六.心得体会 (20)数控分频器设计一、设计任务与要求数控分频器的功能就是当输入端给定不同输入数据时,将对输入的时钟信号有不同的分频比,以实现所需的输出频率。
基本功能:1、实现8位分频器,依据输入的8位2进制数的不同,有不同的分频比。
如输入10010000,即对输入的时钟信号进行144分频,如输入01001000,即对输入的时钟信号进行72 分频。
2、输出的波形应为占空比位50%的方波。
3、有显示功能,显示当前的分频比,即,输入的二进制数的大小。
总体框图设计思路:数控分频器用计数值可并行预置的加法器设计完成,当在输入端给定不同输入数据时将对输入的时钟信号有不同的分频比。
把输入端输入的八位二进制数直接通过BCD译码器转换为十位BCD码表示的十进制数,通过扫描器对3个数码管进行选通扫描,最后7段数码管显示译码器对选中数码管的赋值进行译码,并驱动数码管显示该数据。
模块的功能:1、数控分频器:实现8位分频器,依据输入的8位2进制数的不同,有不同的分频比。
如输入10010000,即对输入的时钟信号进行144分频。
2、BCD译码器:把输入端的8位2进制数转换成10位BCD码表示的十进制数。
3、扫描器:when “000”=>daout<=dout(3 downto 0);when “001”=>daout<=dout(7 downto 4);when “010”=>daout<=dout(3 downto 2)<="00";daout(1 downto 0)<=dout(9 downto 8);when others=>null;4、3-8译码器:当sel=0时,q=11111110;选择个位数码管亮。
在quartus里面没找到SCI的LPM部件,又不想自己从头编写,在网上找到了一个verilog的程序,也找到了和这个实现方法相同的VHDL程序。
都是接收到按键按下时候,启动串口发送,发送welcom但是都是发现一个,并延时重新读取按键,然后再重新启动发送。
数据格式是9600 boud rate、8数据位、1启动位、1停止位,每16个bit周期发送一个byte,接收程序,没有中间多位判断部分,考虑接收的有效性和可靠性,对程序进行了修改,改为每11个bit周期发送一个byte,这样也可以兼容接收2个停止位的接收程序,在接收程序中进行了多相判断。
程序和截图如下:--本模块的功能是验证实现和PC机进行基本的串口通信的功能。
需要在PC机上安装一个串口调试工具来验证程序的功能。
--程序实现了一个收发一帧10个bit(即无奇偶校验位)的串口控制器,10个bit是1位起始位,8个数据位,1个结束位。
--串口的波特律由程序中定义的div_par参数决定,更改该参数可以实现相应的波特率。
程序当前设定的div_par 的值--是0x145,对应的波特率是9600。
用一个8倍波特率的时钟将发送或接受每一位bit的周期时间划分为8个时隙以使通--信同步.--程序的基本工作过程是,按动一个按键key1 控制器向PC的串口发送“welcome",--PC机接收后显示验证数据是否正确(串口调试工具设成按ASCII码接受方式).--PC可随时向FPGA发送0-F的十六进制数据,FPGA接受后显示在7段数码管上.library ieee;-- design by jiaolonglanuse myserial isgeneric ( boud_rate:integer := 9600;clk_rate :integer := 50_000_000);port( clk : in std_logic;rstn : in std_logic;rxd : in std_logic; --receive bittxd : out std_logic; --send bit-- txd_buff :in std_logic_vector(7 downto 0); -- buffer write in-- write_data: in std_logic; -- write dataen :out std_logic_vector(7 downto 0);seg_data:out std_logic_vector(7 downto 0);-- rxd_buff :out std_logic_vector(7 downto 0);key_input:in std_logic-- testout: out std_logic-- read_data: in std_logic);end entity myserial;architecture bhv of myserial isSIGNAL div_reg : integer range 0 to 2**16-1;--分频计数器,分频值由波特率决定。
VHDL语言实现的任意整数分频器fpga中,一般外接的晶振是50Mhz,如果电路中一个模块需要25mhz时钟,那么进行一个2分频,这个是相当容易的,下面是一种方法,还有可以用一个二进制计数器实现。
process(clk)--clk输入时钟;beginif(rst = '0') then --rst复位信号;clkout <= '0';elsif(clk;event and clk = '1')thenclkout <= not clk;end if;end process;但是如果实现一个三分频呢?是不是3分频器应该是每1.5的clock就0变1、1变0,但问题来了,哪来的1.5个clock?计数器并不能产生1.5!正源触发与负源触发的间隔时间刚好是0.5个clock?所以我们产生两个clock,一个是posedge clk,一个是negedge clk,最后将两个clock做or,这样就可以产生出0.5个clock了。
下面给出代码:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity clk_div_n isport(clk : in std_logic;rst : in std_logic;clkout :out std_logic);end clk_div_n;architecture rtl of clk_div_n isconstant n : integer range 0 to 10 := 6; --这里的n可以是任意值,当然要大于1.signal clk_p : std_logic;signal clk_n : std_logic;signal cnt_p : integer range 0 to n;signal cnt_n : integer range 0 to n;beginprocess(clk_p, clk_n)beginif((n mod 2) = 0)thenclkout <= clk_p;elseclkout <= clk_p or clk_n;end if;end process;process(clk, rst)beginif(rst = '0') thencnt_p <= 0;elsif(clk'event and clk = '1') thenif(cnt_p = n-1) thencnt_p <= 0;elsecnt_p <= cnt_p + 1;end if;end if;end process;process(clk, rst)beginif(rst = '0') thenclk_p <= '0';elsif(clk'event and clk = '1')thenif (cnt_p < (n/2)) thenclk_p <= '1';elseclk_p <= '0';end if ;end if;end process;process(clk, rst)beginif(rst = '0') thencnt_n <= 0;elsif(clk'event and clk = '0')thenif(cnt_n = n-1) thencnt_n <= 0;elsecnt_n <= cnt_n + 1;end if;end if;end process;process(clk, rst)beginif(rst = '0') thenclk_n <= '0';elsif(clk'event and clk = '0')thenif (cnt_n < (n/2)) thenclk_n <= '1';elseclk_n <= '0';end if ;end if;end process;end rtl;接下来我给出对应的testbench::有兴趣可以用make a simulation in modelsim LIBRARY ieee ;USE ieee.std_logic_1164.all ;USE ieee.std_logic_arith.all ;USE ieee.std_logic_unsigned.all ;ENTITY clk_div_n_tb ISEND clk_div_n_tb;ARCHITECTURE clk_div_tb_arch OF clk_div_n_tb ISSIGNAL clkout : std_logic ;SIGNAL rst : std_logic := '0' ;SIGNAL clk : std_logic := '1' ;COMPONENT clk_div_nPORT (clk : in std_logic ;rst : in std_logic ;clkout : out std_logic);END COMPONENT ;BEGINprocessbeginwait for 50ns;clk <= not clk;end process;rst <= '1' after 200ns;test:clk_div_nPORT MAP (clk => clk,rst => rst,clkout => clkout) ;END clk_div_tb_arch;。
分频器设计------本源代码属于陈楠个人所有源代码中完成对时钟信号CLK的2分频,4分频,8分频,16分频。
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY clkdiv ISPORT(clk : IN STD_LOGIC;clk_div2 : OUT STD_LOGIC;clk_div4 : OUT STD_LOGIC;clk_div8 : OUT STD_LOGIC;clk_div16 : OUT STD_LOGIC);END clk_div;ARCHITECTURE rtl OF clk_div ISSIGNAL count : STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINPROCESS(clk)BEGINIF (clk’event AND clk=’1’) THENIF(count=”1111”) THENCount <= (OTHERS =>’0’);ELSECount <= count +1;END IF ;END IF ;END PROCESS;clk_div2 <= count(0);clk_div4 <= count(1);clk_div8 <= count(2);clk_div16 <= count(3);END rtl;对于分频倍数不是2的整数次幂的情况,我们只需要对源代码中的计数器进行一下计数控制就可以了,如下面源代码描述一个对时钟信号进行6分频的分频器。
ENTITY clkdiv ISPORT(clk : IN STD_LOGIC;clk_div6 : OUT STD_LOGIC);END clk_div;ARCHITECTURE rtl OF clk_div ISSIGNAL count : STD_LOGIC_VECTOR(1 DOWNTO 0);SIGNAL clk_temp : STD_LOGIC;BEGINPROCESS(clk)BEGINIF (clk’event AND clk=’1’) THENIF(count=”10”) THENcount <= (OTHERS =>’0’);clk_temp <=NOT clk_temp;ELSEcount <= count +1;END IF ;END IF ;END PROCESS;clk_div6 <= clk_temp;END rtl;前面两个分频器的例子描述的将时钟信号进行分频,分频后得到的时钟信号的占空比为1:1。
电子科技大学成都学院学院指导教师模值12计数器,分频器设计二、实验目的1、了解二进制计数器的工作原理。
2、时钟在编程过程中的作用。
3、学习数控分频器的设计、分析和测试方法。
4、了解和掌握分频电路实现的方法。
5、掌握EDA技术的层次化设计方法。
三、实验原理(1)二进制计数器中应用最多、功能最全的计数器之一,含异步清零和同步使能的加法计数器的具体工作过程如下:在时钟上升沿的情况下,检测使能端是否允许计数,如果允许计数(定义使能端高电平有效)则开始计数,否则一直检测使能端信号。
在计数过程中再检测复位信号是否有效(低电平有效),当复位信号起作用时,使计数值清零,继续进行检测和计数。
其工作时序如下图所示:(2)数控分频器的功能就是当输入端给定不同的输入数据时,将对输入的时钟信号有不同的分频比,数控分频器就是用计数值可并行预置的加法计数器来设计完成的,方法是将计数溢出位与预置数加载输入信号相接得到。
(1)“模值12计数器的设计”的实验要求完成的任务是在时钟信号的作用下,通过使能端和复位信号来完成加法计数器的计数。
实验中时钟信号使用数字时钟源模块的1HZ信号,用一位拨动开关K1表示使能端信号,用复位开关S1表示复位信号,用LED模块的LED1~LED4来表示计数的二进制结果。
实验L ED 亮表示对应的位为‘1’,LED灭表示对应的位为‘0’。
通过输入不同的值模拟计数器的工作时序,观察计数的结果。
实验箱中的拨动开关、与FPGA 的接口电路,LED 灯与FPGA 的接口电路以及拨动开关、LED 与F PGA 的管脚连接在实验一中都做了详细说明,这里不在赘述。
数字时钟信号模块的电路原理如下图所示,其时钟输出与F PGA 的管脚连接表如下图所示:信号名称对应FPGA 管脚名说明DIGITAL-CLK C13 数字时钟信号送至FPGA 的C13按键开关模块的电路原理如下图所示:按键开关的输出与F PGA 的管脚连接表如下图所示:五、实验步骤(一)模值12计数器的设计1、建立工程文件1)运行QUARTUSII 软件。
目录摘要 (2)1 前言 (3)2 设计方案 (5)2.1 总体设计思路 (5)2.2 方案论证 (6)2.2.1方案一 (6)2.2.2方案二 (6)2.2.3方案三 (6)2.3 方案确定 (7)3 软件设计 (8)3.1 波形产生模块 (8)3.1.1正弦波 (8)3.1.2 矩形波 (10)3.1.3 三角波 (10)3.1.4 基波 (11)3.1.5谐波的产生 (11)3.1.6 波形模块图 (11)3.2 频率控制模块 (11)3.3 选择波形模块 (11)3.4 分频器模块 (13)3.4.1 设计思路 (13)3.4.2 VHDL实现 (13)3.4.3 分频值计算 (14)4 硬件电路设计 (15)4.1 硬件设计注意事项 (15)4.2滤波电路 (15)4.3 幅度控制电路 (16)4.4 FPGA器件引脚分配 (16)4.5 硬件电路实现 (17)5 调试 (18)5.1设计及仿真调试使用设备 (18)5.2 调试方法 (18)5.2.1 硬件调试 (18)5.2.2 软件调试 (18)5.2.3 综合调试 (19)5.3 调试结果 (19)5.3.1 软件仿真结果及分析 (19)5.3.2 综合调试结果 (21)6 结论 (24)致谢辞 (25)参考文献 (26)附录 (27)基于FPGA的信号发生器摘要本次设计课题为应用VHDL语言及MAX+PLUS II软件提供的原理图输入设计功能,结合电子线路的设计加以完成一个可应用于数字系统开发或实验时做输入脉冲信号或基准脉冲信号用的信号发生器,它具结构紧凑,性能稳定,设计结构灵活,方便进行多功能组合的特点,经济实用,成本低廉。
具有产生三种基本波形脉冲信号(正弦波、矩形波和三角波),以及三次(及三次以下)谐波与基波的线性组合脉冲波形输出,且单脉冲输出脉宽及连续脉冲输出频率可调,范围从100HZ到1kHZ,步进为100HZ;幅度可调,从0到5伏,步进为0.1V。
6.4乐曲硬件演奏电路EDA设计6.4.1 设计要求利用可编程逻辑器件FPGA,设计一个乐曲硬件演奏电路。
由键盘输入控制音响,同时可自动演奏乐曲。
演奏时可选择键盘输入乐曲或者已存入的乐曲,并配以一个小扬声器。
其结构如图6-34所示,该设计产生的音乐选自"梁祝"片段。
图6-34 乐曲演奏电路结构方框图6.4.2 原理描述产生音乐的两个因素是音乐频率和音乐的持续时间,以纯硬件完成演奏电路比利用微处理器(CPU)来实现乐曲演奏要复杂的多如果不借助于功能强大的EDA工具和硬件描述语言,凭借传统的数字逻辑技术,即使最简单的演奏电路也难以实现。
根据6.4.1的设计要求,乐曲硬件演奏电路系统主要由数控分频器和乐曲存储模块组成。
数控分频器对FPGA的基准频率进行分频,得到与各个音阶对应的频率输出。
乐曲存储模块产生节拍控制和音阶选择信号,即在此模块中可存放一个乐曲曲谱真值表,由一个计数器来控制此真值表的输出,而由计数器的计数时钟信号作为乐曲节拍控制信号。
1 音名与频率的关系音乐的十二平均率规定:每两个八度音(如简谱中的中音1与高音1)之间的频率相差一倍.在两个八度音之间,又可分为十二个半音,每两个半音的频率比为4。
另外,音名A(简谱中的低音6)的频率为440Hz,音名B到C之间,E到F之间为半音,其余为全音,由此可以计算出简谱中从低音1到高音1之间每个音名的频率如表6-3所示.由于音阶频率多为非整数,而分频系数又不能为小数,故必须将得到的分频数四舍五入取整。
若基准频率过低,则由于分频系数过小,四舍五入取整后的误差较大,若基准频率过高,虽然误码差变小,但分频结构将变大。
实际的设计应综合考虑两方面的因素,在尽量减小频率误差的前提下取舍合适的基准频率。
本例中选取4MHz的基准频率,若无4MHz的时钟频率,实际上,只要各个音名间的相对品频率关系不变,C作1与D作1演奏出的音乐听起来都不会“走调”。
各音阶频率及相应的分频系数如表6-4所示。
使用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 ripple isgeneric (width: integer := 4);port(clk, rst: in std_logic;cnt: out std_logic_vector(width - 1 downto 0));end ripple;architecture a of ripple issignal cntQ: std_logic_vector(width - 1 downto 0);beginprocess(clk, rst)beginif (rst = '1') thencntQ <= (others => '0');elsif (clk'event and clk = '1') thencntQ <= cntQ + 1;end if ; end process ;cnt <= cntQ;end a;代码 1 加法计数器 VHDL 代码图 1 加法计数器 RTL 视图加法计数器的Test Bench 代码如下所示,在ModelSim 下进行功能仿真,仿真 波形结果如图 2所示。
SDA主机SCLSDA SCL SDA SCL SDA SCL 从机 1从机 2…从机 n2FPGA 与I 2C 总线器件接口电路设计利用 FPGA 模拟I 2C 总线协议对I 2C 总线接口器件AT24C256 进展读写操作。
利用按键输入读写命令和相应的地址、数据,对芯片进展读写操作,读写的数据用数码管显示。
一、I C 总线接口电路设计分析1. I 2C 总线协议I 2C 总线的两根通信线,一根是串行数据线SDA ,另一根是串行时钟线SCL 。
多个符合I 2C 总线标准的器件都可以通过同一条I 2C 总线进展通信,而不需要额外的地址译码器。
每个连接到总线上的器件都有一个唯一的地址作为识别的标志,都可以发送或接收数据。
I 2C 总线通信速率受主机把握,标准模式下可达 100kbit/s 。
一般具有I 2C 总线的器件其SDA 、SCL 引脚都为集电极〔或漏极〕开路构造。
因此实际使用时,SDA 和 SCL 信号线必需加 3~10K 的上拉电阻。
总线空闲时均保持高平。
I 2C 总线接法如图 1 所示。
VCC图 1 I2C 总线连接示意图(1) I 2C 的主机和从机,发送器和接收器产生 I 2C 总线时钟信号和起始、停顿把握信号的器件,称为主机,被主机寻址的器件称为从机。
任何将数据传送到I 2C 总线的器件称为发送器,任何从I 2C 总线接收数据的器件称为接收器。
主机和从机都可作为发送数据器件和接收数据器件。
(2) I 2C 总线上数据的有效性:时钟线SCL 为高电寻常,数据线SDA 的任何电平变化将被看作总线的起始或停顿信号;在数据传送过程中,当时钟线SCL 为高电寻常,数据线SDA 必需保持稳定状态,不允许有跳变; 数据线SDA 的状态只能在SCL 低电平期间才能转变。
即进展串行传送数据时,在 SCL 高电平期间传送位数据,低电平期间预备数据。
(3) 从机地址I 2C 总线不需要额外的片选信号或地址译码。
奇数分频器1 引言分频器在CPLD/FPGA设计中使用频率非常高,尽管目前大部分设计中采用芯片厂家集成的锁相环资源,但是对于要求奇数倍分频、小数倍分频的应用场合却往往不能满足要求。
硬件工程师希望有一种灵活的设计方法,根据需要,在实验室就能设计分频器并马上投入使用,更改频率时无需改动原器件或电路板,只需重新编程,在数分钟内即可完成。
对于偶数分频,使用一模N计数器模块即可实现,即每当模N计数器从0开始计数至N时,输出时钟进行翻转,同时使计数器复位,使之从0开始重新计数,以此循环即可实现。
但对于奇数分频,实现50%的占空比却是比较困难的。
下面给出占空比50%的奇数分频器的设计源程序和仿真结果。
2 VHDL程序LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;--添加库ENTITY fdiv IS --设计实体PORT( clk,reset : IN STD_LOGIC;--端口说明preset: IN INTEGER;--preset:分频预置数clkout : OUT STD_LOGIC);- -clkout :分频后得到的时钟END fdiv;ARCHITECTURE behave OF fdiv IS--设计构造体SIGNAL s1,s2 : STD_LOGIC;--内部信号s1,s2 SIGNAL cnt : INTEGER RANGE 0 TO preset-1;--模为preset的计数信号BEGINP1: PROCESS(clk,reset) --计数器BEGINIF reset='1' THENcnt<=0;ELSIF clk'event AND clk='1' THENIF cnt=0 THENcnt<=preset-1;ELSEcnt<=cnt-1;END IF;END IF;END PROCESS;P2: PROCESS(clk,reset) --信号1 BEGINIF reset='1' THENs1<='1';ELSIF clk'event AND clk='1' THENIF cnt=0 THEN --计数信号为0时,S1翻转s1<=NOT s1;ELSEs1<=s1;END IF;END IF;END PROCESS;P3: PROCESS(clk,reset) --信号2 BEGINIF reset='1' THENs2<='1';ELSIF clk'event AND clk='0' THENIF cnt=(preset-1)/2 THEN --计数信号为N时,S2翻转s2<=NOT s2;ELSEs2<=s2;END IF;END IF;END PROCESS;clkout<= s1 XOR s2; -- 异或输出END BEHA VE;程序说明:以上程序实现任意奇数为PRESET的50%占空比分频,计数器CNT的模值为PRESET,计数器是为了控制信号S1和信号S2,使两信号保持恒定的时间差。
题目: 基于VHDL的占空比50%的7分频电路设计姓名:学号:班级:指导教师:成绩:摘要:在数字逻辑电路设计中,分频器是一种基本电路,通常用来对某个给定频率的时钟进行分频,得到所需的时钟。
时序电路设计中需要各种各样的分频器来获得不同频率的时钟,其中以整数分频器最为常见。
整数分频可以简单的使用模n计数器实现,即随驱动时钟跳变n 次后就输出一个进位脉冲,然后立即被清零或置位,再开始新一轮的循环的计数。
模n计数器的进位脉冲的宽度一般与驱动时钟相同,这对于边沿驱动的时序逻辑并不会带来什么问题。
但是在某些需要使用电平逻辑的设计中,我们更希望分频时钟拥有50%,或者与驱动时钟相同的占空比。
这时就需要通过另外的逻辑方法来进行分频,或者使用PLL。
在基于CPLD(复杂可编程逻辑器件)/FPGA(现场可编程门阵列)的数字系统设计中,很容易实现由计数器或其级联构成各种形式的偶数分频及非等占空比的奇数分频,但对等占空比的奇数分频及半整数分频的实现较为困难。
本文利用VHDL(超高速集成电路硬件描述语言),通过Quartus II 7.1 开发平台,设计了一种能够实现占空比50%的7分频电路设计,这种设计方法原理简单,可重用性好,而且只需很少的逻辑宏单元。
关键词:VHDL 占空比分频器1、VHDL语言 (3)1.1 、VHDL语言的介绍 (3)1.2 、VHDL语言的特点 (3)2、分频电路的设计 (3)2.1分频电路的分类: (3)2.2 任意奇数倍(2N+1)分频 (4)2.3 占空比为 50%的分频 (4)3、占空比为50%的7分频电路的设计 (4)3.1、7分频电路的RTL视图,如下: (4)3.2、基于VHDL的占空比为50%的7分频电路的代码程序 (5)3.3、占空比为50%的7分频仿真 (6)4、心得体会 (7)5、参考文献 (8)1、VHDL语言1.1 、VHDL语言的介绍VHDL语言是一种用于电路设计的高级语言。
vhdl中generic的分频用法
在VHDL中,generic是一种允许用户在实例化时动态地指定数值
的机制。
它可以用于分频电路的设计,允许用户指定分频器的分频比。
分频器是一个电路,将输入时钟信号分频为一个较低频率的输出
信号。
通常情况下,分频比是一个整数数值。
在VHDL中,可以使用generic将分频比作为参数传递给分频器的实例化。
例如,假设我们要设计一个4分频器,将输入时钟信号分频为输
入时钟的1/4。
我们可以使用一个generic来指定这个分频比。
下面是一个使用generic实现的4分频器的伪代码示例:
```vhdl
entity Divider is
generic(
divide_ratio : positive := 4
);
port (
clk_in : in std_logic;
clk_out : out std_logic
);
end entity Divider;
architecture Behavioral of Divider is
begin
process(clk_in)
variable counter : positive range 0 to divide_ratio-1 := 0;
begin
if rising_edge(clk_in) then
counter := counter + 1;
if counter = divide_ratio-1 then
clk_out <= not clk_out;
counter := 0;
end if;
end if;
end process;
end architecture;
```
在这个例子中,我们定义了一个名为divide_ratio的generic,它的默认值为4。
这个generic确定了分频比。
在实例化时,用户可以选择不同的值来改变分频比。
在架构区,一个进程使用了一个变量counter来计数输入时钟的上升沿。
当counter达到divide_ratio-1时,表示已经达到了所需的分频比,然后将输出时钟信号取反,并重置counter为0。
这是一个简单的4分频器的例子,但是使用generic,可以很轻松地根据需要改变分频比。
例如,如果要设计一个10分频器,只需修改实例化语句中的divide_ratio的值为10即可。
总结起来,VHDL中的generic机制可以灵活地指定分频器的分频比,使得设计更具有通用性。
通过改变generic的值,可以在不修改代码的情况下实现不同分频比的分频器。