用EPM240怎么实现输入系列信号延迟输出?
本帖最后由 mrbpost 于 2012-5-9 21:54 编辑输入为系列高底电平信号,怎么利用EPM240将系列高底电平信号延迟T(十几毫秒)时间输出,EPM240仅仅实现系列数字信号的延迟输出而不改变信号的频率.
谢谢各位提供的思路,晶振是1MHZ,输入信号的的频率在19MS~21MS之间变化,要求每个周波延迟18MS输出,可以做到吗?因为要求延迟误差是几微秒,所以晶振用1MHZ。
用另一个高的频率的信号 多打几拍几可以了 本帖最后由 wangguanfu 于 2012-5-9 18:13 编辑
输出Fo_1MHZ比Fi_1MZ延迟300nS(3个F_10MHZ周期) 这个恐怕EPM240搞不定吧。需要用一颗大容量缓存芯片做FIFO存储,同时要计算有多少路信号,每秒采样多少次。比如4路100MHz采样,则1s需要200MByte的容量,10ms也需要2MB的容量。 n个D触发器 + 同频时钟 这个有意思了,我正好最近也在想这个问题。我不光想实现这个延迟,还想这个延迟可控;不光延迟可控,还想上升沿延迟和下降沿延迟不一样,都可控。有哪位大虾有什么好思路吗? 刚看了3楼回复
刚开始打算 周期整数倍 由n决定,小于一个周期的由同频时钟的相位决定。但相位难以控制(要控制的话又变成3楼那种了),故3楼最优,延迟时间误差由高频的频率决定 本帖最后由 wangguanfu 于 2012-5-9 21:05 编辑
wye11083 发表于 2012-5-9 18:48 static/image/common/back.gif
这个恐怕EPM240搞不定吧。需要用一颗大容量缓存芯片做FIFO存储,同时要计算有多少路信号,每秒采样多少次。 ...
仔细看了你的要求 呵呵 思路就有问题 水哥 发表于 2012-5-9 20:15 static/image/common/back.gif
这个有意思了,我正好最近也在想这个问题。我不光想实现这个延迟,还想这个延迟可控;不光延迟可控,还想上 ...
把我3楼的电路扩展下 做成边沿检测然后分别对上/下沿打N拍就是了 wangguanfu 发表于 2012-5-9 20:58 static/image/common/back.gif
仔细看了你的要求 呵呵 思路就有问题
我的思路是没有问题的。你要看清LZ写的是延时十几ms,不是几个周期!
wye11083 发表于 2012-5-9 21:10 static/image/common/back.gif
我的思路是没有问题的。你要看清LZ写的是延时十几ms,不是几个周期!
LZ用240 又没说基频频率 他说十几ms。配合他的图,可以理解成基频一个周期时间也不小于十几ms!! 怎么可能是用100MHZ去采样呢 wangguanfu 发表于 2012-5-9 21:16 static/image/common/back.gif
LZ用240 又没说基频频率 他说十几ms。配合他的图,可以理解成基频一个周期时间也不小于十几ms!! 怎么可 ...
wangguanfu的方法在理论上是可行的。
但是要在延时10mS的基础上,保证几个uS的误差,触发器则需要:0.018/(1/1000000)=18000个。显然EPM240的资源达不到。
还得用wye11083的方法才行。 wangguanfu 发表于 2012-5-9 21:16 static/image/common/back.gif
LZ用240 又没说基频频率 他说十几ms。配合他的图,可以理解成基频一个周期时间也不小于十几ms!! 怎么可 ...
也是,看他的图是20ms,延时18ms的话,如果以1ms步进,用1K的频率就够了。 wangguanfu 发表于 2012-5-9 21:16 static/image/common/back.gif
LZ用240 又没说基频频率 他说十几ms。配合他的图,可以理解成基频一个周期时间也不小于十几ms!! 怎么可 ...
因为我现在做的都是100M以上的信号,所以理所当然的是高频了。 本帖最后由 dragon_hn 于 2012-5-10 09:11 编辑
看清楼主的要求啦:要求延迟误差是几微秒!
所以照这个要求,最直接的是用18000个D触发器。
不过也有其他简便方法,因为楼主的输入信号频率很低,所以可以通过捕获输入信号的上下边沿用计数器来实现。 本帖最后由 dragon_hn 于 2012-5-10 09:21 编辑
题意:输入信号的的频率在19MS~21MS之间变化,要求每个周波延迟18MS输出,延迟误差是几微秒。
根据楼主的意思,只需要保存一个脉冲的上升沿和下降沿时间即可。
思路:
IF(1MHz时钟上升沿) THEN
IF (输入信号上升沿) THEN 上升沿计数器清零。END IF;
IF (输入信号下降沿) THEN 下降沿计数器清零。END IF;
IF (上升沿计数器==18000) THEN 输出信号置1.END IF;
IF (下降沿计数器==18000) THEN 输出信号置0.END IF;
END IF;
dragon_hn 发表于 2012-5-10 09:06 static/image/common/back.gif
看清楼主的要求啦:要求延迟误差是几微秒!
所以照这个要求,最直接的是用18000个D触发器。
不过也有其他简 ...
18000个D触发器?有钱人啊 最主要的是看,要求的实际延时精度 与 理论延迟精度的误差是多少?
决定是否采用CPLD,FPGA,还是 单片机!
可参看12楼的分析 wangguanfu 发表于 2012-5-10 09:27 static/image/common/back.gif
18000个D触发器?有钱人啊
18000个D触发器用FPGA不是什么难事。
照我下面的方法:
边沿检测用2个D触发器
每个计数器用17个D触发器。
输出用1个D触发器。
总共只需要2+17+17+1=37个D触发器,用EPM240完全胜任。 dragon_hn 发表于 2012-5-10 09:55 static/image/common/back.gif
18000个D触发器用FPGA不是什么难事。
照我下面的方法:
非常感谢以上各位网友提供的意见方案,我根据回复情况总结了三种方案:
1,用多个D触发器实现延时,但由于EPM240的资源不够,显然做不到误差微秒的要求。
2,将波形采样存储,18MS后再读取输出,EPM240的RAM有限,需要外加缓存。
3,按照网友dragon_hn 提供的方案,写了一段代码如下:
/**************************************************************
* File Name : signal_delay.v
* Author :
* Version : Quartus II 9.1 SP2
* CreateDate : 2012/5/10
* Description : phase compensation
**************************************************************/
/* pin allocation :
* function :
*************************************************************/
module signal_delay( Rst,CLOCK_1M,A_ZRE0_CROSS,A_ZRE0_CROSS_MOVE);
input CLOCK_1M;// 时钟
input A_ZRE0_CROSS; // 输入信号
input Rst;
output A_ZRE0_CROSS_MOVE; // 延迟输出信号
/**************************************************************
*Description :定时器1,时长:
* pin allocation:
**************************************************************/
parameter UP_TIMER_VAL=131071; //
reg up_timer18ms_enable;
reg up_timer18ms_cnt; //
wire up_timer18ms_over;
always @(posedge CLOCK_1M or negedge Rst)
if (!Rst)
up_timer18ms_cnt <=0;
else
up_timer18ms_cnt<= up_timer18ms_cnt + 1'b1;
/**************************************************************
* Description :定时器2,时长:
* pin allocation:
**************************************************************/
parameter DOWN_TIMER_VAL =131071;
reg down_timer18ms_enable;
reg down_timer18ms_cnt; //
wire down_timer18ms_over;
always @(posedge CLOCK_1M)
if (!Rst)
down_timer18ms_cnt <= 0; //
else
down_timer18ms_cnt <= down_timer18ms_cnt+ 1'b1;
/**************************************************************
* Description : 上升沿定时器清零
* pin allocation:
**************************************************************/
always @(posedge A_ZRE0_CROSS)
up_timer18ms_cnt <= 0;
/**************************************************************
* Description :下降 沿定时器清零
* pin allocation:
**************************************************************/
always @(negedge A_ZRE0_CROSS)
down_timer18ms_cnt <= 0;
/**************************************************************
* Description :
* pin allocation:A_ZRE0_CROSS-->pin12 , A_ZRE0_CROSS_MOVE -->pin42
**************************************************************/
regA_ZRE0_CROSS_MOVE;
always @(posedge CLOCK_1M)
if(up_timer18ms_cnt==17999) //
A_ZRE0_CROSS_MOVE <=1;
//end
else if(down_timer18ms_cnt==17999)
A_ZRE0_CROSS_MOVE <=0;
endmodule
为什么编译出错,Can't resolve multiple constant drivers for net "up_timer18ms_cnt " at signal_delay.v(25) ,根据百度提示是两个进程不能对一个变量赋值,对CPLD不是很懂,VERILOG也是刚看了一些指令,希望大家多指教,怎么来改正这段代码实现输出信号延时要求,尤其希望网友dragon_hn根据你的思路给予指导,十分谢谢。
mrbpost 发表于 2012-5-10 22:28 static/image/common/back.gif
非常感谢以上各位网友提供的意见方案,我根据回复情况总结了三种方案:
1,用多个D触发器实现延时,但由 ...
有知道的网友可以指点一下吗? ENTITY NEW_DELAY IS
PORT(
CLK : IN STD_LOGIC; -- 1MHz
DIN : IN STD_LOGIC; -- 输入信号
DOT : OUT STD_LOGIC -- 输出信号
);
END ENTITY NEW_DELAY;
ARCHITECTURE FUNC OF NEW_DELAY IS
SIGNAL DOT_XX : STD_LOGIC;
BEGIN
PROCESS(CLK)
VARIABLE CNT1T0 : STD_LOGIC_VECTOR(16 DOWNTO 0);
VARIABLE CNT0T1 : STD_LOGIC_VECTOR(16 DOWNTO 0);
VARIABLE DIN_SV : STD_LOGIC;
BEGIN
IF (CLK'EVENT AND CLK = '1') THEN
IF(DIN='0' AND DIN_SV='1') THEN
CNT1T0:="00000000000000000";
ELSE
CNT1T0:=CNT1T0+1;
END IF;
IF(DIN='1' AND DIN_SV='0') THEN
CNT0T1:="00000000000000000";
ELSE
CNT0T1:=CNT0T1+1;
END IF;
IF(CNT1T0=18000) THEN
DOT_XX<='0';
END IF;
IF(CNT0T1=18000) THEN
DOT_XX<='1';
END IF;
DIN_SV:=DIN;
END IF;
END PROCESS;
DOT<=DOT_XX;
END ARCHITECTURE FUNC;
VHDL程序,已经仿真通过,手工敲进电脑,然后可以转成verilog dragon_hn 发表于 2012-5-12 21:13 static/image/common/back.gif
ENTITY NEW_DELAY IS
PORT(
谢谢网友dragon_hn ,按照您的方案和提供的代码,用240已经实现了六路信号延迟功能。 markCPLD信号延时功能
页:
[1]