chenzhengxi 发表于 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;

281229961 发表于 2010-7-12 21:49:33

等待高手

zkf0100007 发表于 2010-7-12 23:50:38

最好不要用双沿触发,如果想提高工作速度的话,可以对时钟进行倍频

chenzhengxi 发表于 2010-7-13 00:34:00

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

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

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

NJ8888 发表于 2010-7-13 06:15:36

送到两个脚,一个上升触发一个下降触发

real_sugar 发表于 2010-7-13 06:25:56

两个process

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

貌似就可以了~

shangdawei 发表于 2010-7-13 06:40:31

是否需要用到这样的触发器 ?


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

http://china.xilinx.com/products/coolrunner2/index.htm

yuhang 发表于 2010-7-13 08:16:15

开两个进程

chenzhengxi 发表于 2010-7-13 10:02:09

我没表述清楚
前面还有一句
DATA <= count;
DATA是输出口
就因为这句,如果双沿触发,就会有输出依赖多个敏感信号的错误

sokou 发表于 2010-7-13 15:28:56

对于编码器我是用高速时钟对他的A,B项信号进行扫描的。然后判断他是高电平还是低电平从而来判断位置的。

p.nicholas 发表于 2010-7-16 10:56:44

检测信号的上升沿和下降沿,将信号打入移位寄存器,检测相邻两位的变化。注意FPGA时钟

assign a_3_edge = a_3^a_3; // 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,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

suipeng70 发表于 2010-7-16 11:53:54

回复【9楼】sokou
对于编码器我是用高速时钟对他的a,b项信号进行扫描的。然后判断他是高电平还是低电平从而来判断位置的。
-----------------------------------------------------------------------

同意9楼

chenzhengxi 发表于 2010-7-18 00:55:09

有时钟还是很好搞定的,我这个没有时钟。
想了个土办法,上升沿计数,mcu每次读取计数时记下此刻的电平状态。

suipeng70 发表于 2010-7-18 07:45:18

没有时钟?

zzsoft 发表于 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;

NJ8888 发表于 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驱动结构示意图就是这样的
http://cache.amobbs.com/bbs_upload782111/files_31/ourdev_568777.JPG
(原文件名:双沿.JPG)

40130064 发表于 2010-7-18 16:12:27

说个笨办法,仅限于低速度计数,宏多的话是可行的,我这样弄过。

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

zzsoft 发表于 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;

zzsoft 发表于 2010-7-18 16:22:14

回复【15楼】888888888888
-----------------------------------------------------------------------

居然和我想的一样

yngufeng 发表于 2010-7-24 10:29:57

光电编码器输出的脉冲存在干扰,需要用FSM来实现计数和容错,这样得到的计数值才是准确可靠的。

seemrain 发表于 2010-7-24 10:34:33

这样的低速信号直接用高频时钟去采样就行了,分别得到上升沿和下降沿。。

lgcHR 发表于 2010-9-15 10:49:54

为什么要双沿触发呢,上升沿触发不久OK了吗

ngzhang 发表于 2010-9-15 14:54:46

coolrunner2的CPLD有专门的双沿触发器。必要时可以考虑。

SZSBS 发表于 2010-9-29 11:53:20

用语法是不能有两个沿的,不用高速时间,还是有办法搞定的,QQ:609702901

bd2rae 发表于 2010-9-29 12:56:55

将信号延时后再与原信号异或,上升沿和下降沿就都有脉冲了。

SZSBS 发表于 2010-9-30 11:00:16

顶25楼

Timerunner321 发表于 2015-2-5 15:05:24

等待高手

Timerunner321 发表于 2015-2-5 15:06:31

16楼比较详细 顶16楼

fx568000 发表于 2015-3-19 10:13:39

双边沿触发,多不稳定呀,还是倍频靠谱
页: [1]
查看完整版本: 如何实现上升沿和下降沿都能触发?