如何在FPGA内部产生准确的灵活的延时?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在FPGA内部产生准确的灵活的延时?相关的知识,希望对你有一定的参考价值。

FPGA设计中的延时电路的产生:在日常的电路设计中,有时候我们需要对信号进行延时处理来适应对外接口的时序关系,最经常也是最典型的情况是做处理机的接口;因为与处理的接口时序关系是异步的,而一个规范的FPGA设计应该是尽可能采用同步设计。那么遇到这种情况该如何处理呢?首先在FPGA中要产生延时,信号必须经过一定的物理资源。在硬件描述语言中有关键词Wait for xx ns,需要说明的是该语法是仅仅用于仿真而不能用于综合的,可综合的延时方法有:使信号经过逻辑门得到延时(如非门);使用器件提供的延时单元(如Altera公司的LCELL,Xilinx公司的);注意:当使用多级非门的时候综合器往往会将其优化掉,因为综合器会认为一个信号非两次还是它。需要说明的是在FPGA/CPLD内部结构是一种标准的宏单元,下图是Xilinx公司的Spartans II系列器件的一个标准宏单元。虽然不同的厂家的芯片宏单元的结构不同,但概括而言都是由一些组合逻辑外加一或二个触发器而构成。在实际应用中,当一个模块内的组合逻辑被使用了那么与其对应的触发器也就不能用了;同样如果触发器单元被用了那么组合逻辑单元也就废了。这就是有时候(特别是使用CPLD)虽然设计使用的资源并不多但布局布线器却报告资源不够使用的原因。 当需要对某一信号作一段延时时,初学者往往在此信号后串接一些非门或其它门电路,此方法在分离电路中是可行的。但在FPGA中,开发软件在综合设计时会将这些门当作冗余逻辑去掉,达不到延时的效果。用ALTERA公司的MaxplusII开发FPGA时,可以通过插入一些LCELL原语来产生一定的延时,但这样形成的延时在FPGA芯片中并不稳定,会随温度等外部环境的改变而改变,因此并不提倡这样做。在此,可以用高频时钟来驱动一移位寄存器,待延时信号作数据输入,按所需延时正确设置移位寄存器的级数,移位寄存器的输出即为延时后的信号。此方法产生的延时信号与原信号比有误差,误差大小由高频时钟的周期来决定。对于数据信号的延时,在输出端用数据时钟对延时后信号重新采样,就可以消除误差。

http://hi.baidu.com/woodeasyyang/blog/item/2675f7d3fc7a9c31970a16b2.html
参考技术A 关键是你的分辨率是多少?

数字信号处理的FPGA实现——混频器(Mixer)

  1. 设计思路

    在FPGA中实现一个简单的混频器电路,将两个625Khz的正弦波信号相乘输出。其中625Khz的本振信号由FPGA内部的NCO产生,625Khz的正弦波信号通过读取外部的激励文件(txt)产生。其中外部激励文件由matlab仿真程序产生。

  2. 实验效果

 

将两个625Khz混频后产生的信号中的直流分量滤除,输出1.25Mhz正弦波信号,为了方便观察实验现象对波形进行625_000分频。并且进行整形(过0检测)输出给led灯。

  1. matlab仿真

    实验代码

/*****************************************************

  * Module Name : edge_get.v

  * Engineer : maobitcoder

  * Target Device : EP2C8Q208C8

  * Tool versions : Vscode

  * Create Date : 20183320:09:14

  * Revision : v1.0

  * Description :实现双边沿检测 高电平输出

  *****************************************************/

module edge_get(

clk,

rst_n,

signal,

pos_edge,

neg_edge

);

 

input clk;

input rst_n;

input signal;

 

output pos_edge;

output neg_edge;

reg signal_r0;

reg signal_r1;

 

 

always @(posedge clk or negedge rst_n) begin

if (!rst_n) begin

signal_r0 <= 1‘b0;

signal_r1 <= 1‘b0;

end

else begin

signal_r0 <= signal;

signal_r1 <= signal_r0;

end

end

 

assign pos_edge = signal_r0 & ~signal_r1;

assign neg_edge = ~signal_r0 & signal_r1;

 

endmodule // edge_get

 

 

 

四,FPGA实现

 

以上是关于如何在FPGA内部产生准确的灵活的延时?的主要内容,如果未能解决你的问题,请参考以下文章

FPGA开发板自身产生一路信号,差分两路完全一样的方波,但其中一路延时10ns,请问如何设计程序?

FPGA 如果没有外部复位,如何产生复位信号,用来复位状态机,或者复位寄存器初值

fpga是如何复位的

51单片机延时函数计算问题以及如何准确延时

通过FPGA内部锁相环对恒温晶振的输出(32.768MHz)进行2倍频,输出的时钟精度会很低吗?误差大吗?谢谢~~

时钟复位篇