mrbpost 发表于 2012-5-9 17:56:54

用EPM240怎么实现输入系列信号延迟输出?

本帖最后由 mrbpost 于 2012-5-9 21:54 编辑

输入为系列高底电平信号,怎么利用EPM240将系列高底电平信号延迟T(十几毫秒)时间输出,EPM240仅仅实现系列数字信号的延迟输出而不改变信号的频率.

谢谢各位提供的思路,晶振是1MHZ,输入信号的的频率在19MS~21MS之间变化,要求每个周波延迟18MS输出,可以做到吗?因为要求延迟误差是几微秒,所以晶振用1MHZ。

wangguanfu 发表于 2012-5-9 18:02:01

用另一个高的频率的信号 多打几拍几可以了

wangguanfu 发表于 2012-5-9 18:11:34

本帖最后由 wangguanfu 于 2012-5-9 18:13 编辑

输出Fo_1MHZ比Fi_1MZ延迟300nS(3个F_10MHZ周期)

wye11083 发表于 2012-5-9 18:48:29

这个恐怕EPM240搞不定吧。需要用一颗大容量缓存芯片做FIFO存储,同时要计算有多少路信号,每秒采样多少次。比如4路100MHz采样,则1s需要200MByte的容量,10ms也需要2MB的容量。

xivisi 发表于 2012-5-9 19:28:58

n个D触发器 + 同频时钟

水哥 发表于 2012-5-9 20:15:11

这个有意思了,我正好最近也在想这个问题。我不光想实现这个延迟,还想这个延迟可控;不光延迟可控,还想上升沿延迟和下降沿延迟不一样,都可控。有哪位大虾有什么好思路吗?

xivisi 发表于 2012-5-9 20:28:44

刚看了3楼回复

刚开始打算 周期整数倍 由n决定,小于一个周期的由同频时钟的相位决定。但相位难以控制(要控制的话又变成3楼那种了),故3楼最优,延迟时间误差由高频的频率决定

wangguanfu 发表于 2012-5-9 20:58:37

本帖最后由 wangguanfu 于 2012-5-9 21:05 编辑

wye11083 发表于 2012-5-9 18:48 static/image/common/back.gif
这个恐怕EPM240搞不定吧。需要用一颗大容量缓存芯片做FIFO存储,同时要计算有多少路信号,每秒采样多少次。 ...

仔细看了你的要求 呵呵 思路就有问题

wangguanfu 发表于 2012-5-9 21:02:58

水哥 发表于 2012-5-9 20:15 static/image/common/back.gif
这个有意思了,我正好最近也在想这个问题。我不光想实现这个延迟,还想这个延迟可控;不光延迟可控,还想上 ...

把我3楼的电路扩展下 做成边沿检测然后分别对上/下沿打N拍就是了

wye11083 发表于 2012-5-9 21:10:07

wangguanfu 发表于 2012-5-9 20:58 static/image/common/back.gif
仔细看了你的要求 呵呵 思路就有问题

我的思路是没有问题的。你要看清LZ写的是延时十几ms,不是几个周期!

wangguanfu 发表于 2012-5-9 21:16:34

wye11083 发表于 2012-5-9 21:10 static/image/common/back.gif
我的思路是没有问题的。你要看清LZ写的是延时十几ms,不是几个周期!

LZ用240 又没说基频频率 他说十几ms。配合他的图,可以理解成基频一个周期时间也不小于十几ms!! 怎么可能是用100MHZ去采样呢

zhangalex88 发表于 2012-5-9 22:23:57

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的方法才行。

wye11083 发表于 2012-5-9 22:37:25

wangguanfu 发表于 2012-5-9 21:16 static/image/common/back.gif
LZ用240 又没说基频频率 他说十几ms。配合他的图,可以理解成基频一个周期时间也不小于十几ms!! 怎么可 ...

也是,看他的图是20ms,延时18ms的话,如果以1ms步进,用1K的频率就够了。

wye11083 发表于 2012-5-9 22:37:59

wangguanfu 发表于 2012-5-9 21:16 static/image/common/back.gif
LZ用240 又没说基频频率 他说十几ms。配合他的图,可以理解成基频一个周期时间也不小于十几ms!! 怎么可 ...

因为我现在做的都是100M以上的信号,所以理所当然的是高频了。

dragon_hn 发表于 2012-5-10 09:06:13

本帖最后由 dragon_hn 于 2012-5-10 09:11 编辑

看清楼主的要求啦:要求延迟误差是几微秒!
所以照这个要求,最直接的是用18000个D触发器。
不过也有其他简便方法,因为楼主的输入信号频率很低,所以可以通过捕获输入信号的上下边沿用计数器来实现。

dragon_hn 发表于 2012-5-10 09:17:22

本帖最后由 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;

wangguanfu 发表于 2012-5-10 09:27:05

dragon_hn 发表于 2012-5-10 09:06 static/image/common/back.gif
看清楼主的要求啦:要求延迟误差是几微秒!
所以照这个要求,最直接的是用18000个D触发器。
不过也有其他简 ...

18000个D触发器?有钱人啊

chinabn 发表于 2012-5-10 09:41:18

最主要的是看,要求的实际延时精度 与 理论延迟精度的误差是多少?
决定是否采用CPLD,FPGA,还是 单片机!

可参看12楼的分析

dragon_hn 发表于 2012-5-10 09:55:11

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完全胜任。

mrbpost 发表于 2012-5-10 22:28:58

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-12 12:39:24

mrbpost 发表于 2012-5-10 22:28 static/image/common/back.gif
非常感谢以上各位网友提供的意见方案,我根据回复情况总结了三种方案:

1,用多个D触发器实现延时,但由 ...

有知道的网友可以指点一下吗?

dragon_hn 发表于 2012-5-12 21:13:14

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

mrbpost 发表于 2012-5-15 20:11:11

dragon_hn 发表于 2012-5-12 21:13 static/image/common/back.gif
ENTITY NEW_DELAY IS

PORT(


谢谢网友dragon_hn ,按照您的方案和提供的代码,用240已经实现了六路信号延迟功能。

ddddd120 发表于 2014-3-24 22:51:13

markCPLD信号延时功能
页: [1]
查看完整版本: 用EPM240怎么实现输入系列信号延迟输出?