如何实现上升沿和下降沿都能触发?
我想在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; 等待高手 最好不要用双沿触发,如果想提高工作速度的话,可以对时钟进行倍频 这不是时钟,是电机上光耦+码盘给出的信号,码盘一个齿对应大概1cm,给个中间参考值0x8000,正转+,反转-。本来是上升沿触发,电机朝一个方向走走停停的误差小,但来回转动误差就很大了,不得已想双沿触发。
双沿触发究竟该如何实现呢,在quartus里试过几种方法都编译通不过,望高手指教。
明天试验,把信号取反变成两个信号,都上升沿触发。 送到两个脚,一个上升触发一个下降触发 两个process
一个里面rising_edge(clk)
一个里面falling_edge(clk)
貌似就可以了~ 是否需要用到这样的触发器 ?
DualEDGE 触发器
DualEDGE 触发器能力把设计中有效的同步操作速度提高到器件的限制带宽。换句话说就是,用给定的时钟速度,你可以让序贯设计在两倍的速度下工作,或者说同样的处理数量需要1/2的外部时钟频率。
全局部署分频的时钟,而在宏单元在本地得到翻倍的时钟
应将2倍速时钟用于双倍数据速度的应用
不需添加额外的延时
所有的 CoolRunner-II CPLD 均提供
图1
DualEDGE 触发器允许在双边沿上定时。
http://china.xilinx.com/products/coolrunner2/index.htm 开两个进程 我没表述清楚
前面还有一句
DATA <= count;
DATA是输出口
就因为这句,如果双沿触发,就会有输出依赖多个敏感信号的错误 对于编码器我是用高速时钟对他的A,B项信号进行扫描的。然后判断他是高电平还是低电平从而来判断位置的。 检测信号的上升沿和下降沿,将信号打入移位寄存器,检测相邻两位的变化。注意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 回复【9楼】sokou
对于编码器我是用高速时钟对他的a,b项信号进行扫描的。然后判断他是高电平还是低电平从而来判断位置的。
-----------------------------------------------------------------------
同意9楼 有时钟还是很好搞定的,我这个没有时钟。
想了个土办法,上升沿计数,mcu每次读取计数时记下此刻的电平状态。 没有时钟? 分开两个 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; 回复【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) 说个笨办法,仅限于低速度计数,宏多的话是可行的,我这样弄过。
一个上升沿触发计数器 一个下降沿触发计数器再将两个计数器值相加 回复【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; 回复【15楼】888888888888
-----------------------------------------------------------------------
居然和我想的一样 光电编码器输出的脉冲存在干扰,需要用FSM来实现计数和容错,这样得到的计数值才是准确可靠的。 这样的低速信号直接用高频时钟去采样就行了,分别得到上升沿和下降沿。。 为什么要双沿触发呢,上升沿触发不久OK了吗 coolrunner2的CPLD有专门的双沿触发器。必要时可以考虑。 用语法是不能有两个沿的,不用高速时间,还是有办法搞定的,QQ:609702901 将信号延时后再与原信号异或,上升沿和下降沿就都有脉冲了。 顶25楼 等待高手 16楼比较详细 顶16楼 双边沿触发,多不稳定呀,还是倍频靠谱
页:
[1]