名称:对一个方波的任意周期延迟设计VHDL代码Quartus仿真
软件:Quartus
语言:VHDL
代码功能:
对一个方波的任意周期延迟
用EPM570T100硬件,实现对一个方波(占空比可能不是50%)的任意周期延迟(延迟时间不大于信号正半周时间),延迟周期数由16位总线设置;信号频率小于400Khz,时钟周期240Mhz。用vhdl语言编写,仿真和测试波形。软件用quartus9.0。
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
演示视频:
设计文档:
1. 工程文件
Quartus9.0版本
2. 程序文件
3. 程序编译
4. 仿真图
仿真图说明:图中time_set信号即为16位并行输入的延迟时间,图中可以看到可以按设计的值进行延迟,需要说明的是,由于输入的波形和时钟是异步的,故代码中使用了2级触发器进行打拍,以保证信号无亚稳态,所以实际输出的波形会比设置的延迟周期多2拍。比如设置time_set为9,实际延迟11个时钟后输出。可以按所需的减2进行设置,或者删除2级同步触发器也可以。
部分代码展示:
LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_unsigned.all; ENTITY delay_wave IS PORT ( clk : IN STD_LOGIC;--时钟 wave_in : IN STD_LOGIC;--输入方波 time_set : IN STD_LOGIC_VECTOR(15 DOWNTO 0);--输入16位延迟值 wave_out : OUT STD_LOGIC--输出波形 ); END delay_wave; ARCHITECTURE RTL OF delay_wave IS --内部信号定义 SIGNAL wave_buf0 : STD_LOGIC:='0'; SIGNAL wave_buf1 : STD_LOGIC:='0'; SIGNAL rst_n : STD_LOGIC:='1'; SIGNAL count_h : STD_LOGIC_VECTOR(15 DOWNTO 0):=x"0000"; SIGNAL count_l : STD_LOGIC_VECTOR(15 DOWNTO 0):=x"0000"; BEGIN rst_n <='1' ;--不复位 --D触发器打拍 PROCESS (clk, rst_n) BEGIN IF ((NOT(rst_n)) = '1') THEN wave_buf0 <= '0'; ELSIF (clk'EVENT AND clk = '1') THEN wave_buf0 <= wave_in; END IF; END PROCESS; --D触发器打拍 PROCESS (clk, rst_n) BEGIN IF ((NOT(rst_n)) = '1') THEN wave_buf1 <= '0'; ELSIF (clk'EVENT AND clk = '1') THEN wave_buf1 <= wave_buf0; END IF; END PROCESS; --使用2级D触发器打拍后的信号 --计数 PROCESS (clk, rst_n) BEGIN IF ((NOT(rst_n)) = '1') THEN count_h <= x"0000";--复位 ELSIF (clk'EVENT AND clk = '1') THEN IF (wave_buf1 = '1') THEN--计数高电平 if(count_h=x"FFFF")THEN count_h<=x"FFFF"; else count_h <= count_h + x"0001"; end if; ELSE count_h <= x"0000"; END IF; END IF;
点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=1379
761