名称:对一个方波的任意周期延迟设计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
419