搜索
bottom↓
回复: 30

如何实现上升沿和下降沿都能触发?

[复制链接]
(355732697)

出0入0汤圆

发表于 2010-7-12 19:24:26 | 显示全部楼层 |阅读模式
我想在clk的上升沿和下降沿都能计数,用rising_edge(clk) || falling_edge(clk)编译通不过,
所以采用电平触发,用modelsim仿真没问题,但是在板子上运行异常,不知道有啥好的办法没有?
    output_process: PROCESS (clk,reset)
    BEGIN
        IF reset = '0' THEN
            count <= X"0000";
            flag <= not clk;
        ELSIF (flag = clk) THEN
                     count <= count+ '1';
                     flag <= not flag;                               
        END IF;
    END PROCESS output_process;
(355723990)

出0入0汤圆

发表于 2010-7-12 21:49:33 | 显示全部楼层
等待高手
(355716725)

出0入0汤圆

发表于 2010-7-12 23:50:38 | 显示全部楼层
最好不要用双沿触发,如果想提高工作速度的话,可以对时钟进行倍频
(355714123)

出0入0汤圆

 楼主| 发表于 2010-7-13 00:34:00 | 显示全部楼层
这不是时钟,是电机上光耦+码盘给出的信号,码盘一个齿对应大概1cm,给个中间参考值0x8000,正转+,反转-。本来是上升沿触发,电机朝一个方向走走停停的误差小,但来回转动误差就很大了,不得已想双沿触发。

双沿触发究竟该如何实现呢,在quartus里试过几种方法都编译通不过,望高手指教。

明天试验,把信号取反变成两个信号,都上升沿触发。
(355693627)

出0入0汤圆

发表于 2010-7-13 06:15:36 | 显示全部楼层
送到两个脚,一个上升触发一个下降触发
(355693007)

出0入0汤圆

发表于 2010-7-13 06:25:56 | 显示全部楼层
两个process

一个里面rising_edge(clk)
一个里面falling_edge(clk)

貌似就可以了~
(355692132)

出0入0汤圆

发表于 2010-7-13 06:40:31 | 显示全部楼层
是否需要用到这样的触发器 ?


DualEDGE 触发器
DualEDGE 触发器能力把设计中有效的同步操作速度提高到器件的限制带宽。换句话说就是,用给定的时钟速度,你可以让序贯设计在两倍的速度下工作,或者说同样的处理数量需要1/2的外部时钟频率。
全局部署分频的时钟,而在宏单元在本地得到翻倍的时钟
应将2倍速时钟用于双倍数据速度的应用
不需添加额外的延时
所有的 CoolRunner-II CPLD 均提供
图1
DualEDGE 触发器允许在双边沿上定时。

http://china.xilinx.com/products/coolrunner2/index.htm
(355686388)

出0入0汤圆

发表于 2010-7-13 08:16:15 | 显示全部楼层
开两个进程
(355680034)

出0入0汤圆

 楼主| 发表于 2010-7-13 10:02:09 | 显示全部楼层
我没表述清楚
前面还有一句
DATA <= count;
DATA是输出口
就因为这句,如果双沿触发,就会有输出依赖多个敏感信号的错误
(355660427)

出0入0汤圆

发表于 2010-7-13 15:28:56 | 显示全部楼层
对于编码器我是用高速时钟对他的A,B项信号进行扫描的。然后判断他是高电平还是低电平从而来判断位置的。
(355417559)

出0入0汤圆

发表于 2010-7-16 10:56:44 | 显示全部楼层
检测信号的上升沿和下降沿,将信号打入移位寄存器,检测相邻两位的变化。注意FPGA时钟

assign a_3_edge = a_3[2]^a_3[1]; // detect edge changes of signal a
always@(posedge clk or negedge reset_n)
begin
if(reset_n == 1'b0)
a_3 <= 3'b000;
else
a_3 <= {a_3[1:0],a};
end


always@(posedge clk or negedge reset_n)
begin
if(reset_n == 1'b0)
cnt <= 4'b0000;
else if(a_3_edge == 1'b1)
cnt <= cnt + 4'b0001;
end
(355414129)

出0入0汤圆

发表于 2010-7-16 11:53:54 | 显示全部楼层
回复【9楼】sokou
对于编码器我是用高速时钟对他的a,b项信号进行扫描的。然后判断他是高电平还是低电平从而来判断位置的。
-----------------------------------------------------------------------

同意9楼
(355280854)

出0入0汤圆

 楼主| 发表于 2010-7-18 00:55:09 | 显示全部楼层
有时钟还是很好搞定的,我这个没有时钟。
想了个土办法,上升沿计数,mcu每次读取计数时记下此刻的电平状态。
(355256245)

出0入0汤圆

发表于 2010-7-18 07:45:18 | 显示全部楼层
没有时钟?
(355226863)

出0入0汤圆

发表于 2010-7-18 15:55:00 | 显示全部楼层
分开两个 if, 不要用 elsif

process( clk )
begin
  if( clk = '0' and clk'event ) then

  end if;

  if( clk = '1' and clk'event ) then

  end if;
end process;
(355226754)

出0入0汤圆

发表于 2010-7-18 15:56:49 | 显示全部楼层
回复【14楼】zzsoft

分开两个 if, 不要用 elsif
process( clk )
begin
  if( clk = '0' and clk'event ) then  
  end if;
  if( clk = '1' and clk'event ) then
  end if;
end process;
-----------------------------------------------------------------------

楼上没法综合的,按楼主的意思,确实需要两个进程,一上升一下降,分别得到两个中间输出,最后用或门组合输出,XILINX的双沿DDR驱动结构示意图就是这样的

(原文件名:双沿.JPG)
(355225816)

出0入0汤圆

发表于 2010-7-18 16:12:27 | 显示全部楼层
说个笨办法,仅限于低速度计数,宏多的话是可行的,我这样弄过。

一个上升沿触发计数器   一个下降沿触发计数器  再将两个计数器值相加
(355225328)

出0入0汤圆

发表于 2010-7-18 16:20:35 | 显示全部楼层
回复【15楼】888888888888  
-----------------------------------------------------------------------

不能综合,是因为 两个 if 做  同一个 signal 做 <= ,要综合必须要 两个 signal.

process(clk)
begin
  if(clk = '0' and clk'event) then
    nc <= count + 1;
  end if;

  if(clk = '1' and clk'event) then
    c <= count + 1;
  end if;
end process;

count <= nc when clk = '0' else
         c;
(355225229)

出0入0汤圆

发表于 2010-7-18 16:22:14 | 显示全部楼层
回复【15楼】888888888888  
-----------------------------------------------------------------------

居然和我想的一样
(354727966)

出0入0汤圆

发表于 2010-7-24 10:29:57 | 显示全部楼层
光电编码器输出的脉冲存在干扰,需要用FSM来实现计数和容错,这样得到的计数值才是准确可靠的。
(354727690)

出0入0汤圆

发表于 2010-7-24 10:34:33 | 显示全部楼层
这样的低速信号直接用高频时钟去采样就行了,分别得到上升沿和下降沿。。
(350147569)

出0入0汤圆

发表于 2010-9-15 10:49:54 | 显示全部楼层
为什么要双沿触发呢,上升沿触发不久OK了吗
(350132877)

出0入0汤圆

发表于 2010-9-15 14:54:46 | 显示全部楼层
coolrunner2的CPLD有专门的双沿触发器。必要时可以考虑。
(348934163)

出0入0汤圆

发表于 2010-9-29 11:53:20 | 显示全部楼层
用语法是不能有两个沿的,不用高速时间,还是有办法搞定的,QQ:609702901
(348930348)

出0入0汤圆

发表于 2010-9-29 12:56:55 | 显示全部楼层
将信号延时后再与原信号异或,上升沿和下降沿就都有脉冲了。
(348850947)

出0入0汤圆

发表于 2010-9-30 11:00:16 | 显示全部楼层
顶25楼
(211546639)

出0入0汤圆

发表于 2015-2-5 15:05:24 | 显示全部楼层
等待高手
(211546572)

出0入0汤圆

发表于 2015-2-5 15:06:31 | 显示全部楼层
16楼比较详细 顶16楼
(207935344)

出0入0汤圆

发表于 2015-3-19 10:13:39 | 显示全部楼层
双边沿触发,多不稳定呀,还是倍频靠谱
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子论坛 ( 公安交互式论坛备案:44190002001997 粤ICP备09047143号 )

GMT+8, 2021-10-20 02:02

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表