搜索
bottom↓
回复: 4

【讨论】FPGA设计中几种沿触发的用法及其优缺点【有图】

[复制链接]

出0入0汤圆

发表于 2010-12-8 20:33:51 | 显示全部楼层 |阅读模式
在数字系统设计中,经常涉及到要在某个时钟的上升沿或下降沿进行数据处理,通过自己总结和看别人的程序,发现有好多种方法进行处理,现在我把这几种方法列举一下,大家讨论下他们的优缺点。

背景:假设初始条件A=0,B=0,要在信号A的上升沿将B置为1。

方法1 最简单也是最容易想到的

module Test(rst_n, A, B);
input rst_n;
input A;
output B;
reg B;
always @(posedge A or negedge rst_n)
        if(!rst_n)
                B <= 1'b0;
        else
                B <= 1'b1;
endmodule


方法1仿真波形 (原文件名:m1.png)


方法2 通过系统时钟
module Test(rst_n,clock, A, B);

input rst_n;
input clock;
input A;
output B;

reg B;

reg A_BUF,A_RISE;

always @(posedge clock or negedge rst_n)
        if(!rst_n)
          begin
                A_BUF <= 1'b0;
                A_RISE <= 1'b0;
          end
        else
          begin
                A_BUF <= A;
                A_RISE <= (~A_BUF) & A;
          end

always @ (posedge clock or negedge rst_n)
        if(!rst_n)
                B <= 1'b0;
        else if(A_RISE)
                        B <= 1'b1;
endmodule


方法2仿真波形 (原文件名:m2.png)

方法3 跟方法2很像,结果却不太一样
module Test(rst_n,clock, A, B);

input rst_n;
input clock;
input A;
output B;

reg B;

reg A_BUF;

always @(posedge clock or negedge rst_n)
        if(!rst_n)
          begin
                A_BUF <= 1'b0;
          end
        else
          begin
                A_BUF <= A;
          end

wire A_RISE = (~A_BUF) & A;
always @ (posedge clock or negedge rst_n)
        if(!rst_n)
                B <= 1'b0;
        else if(A_RISE)
                        B <= 1'b1;
endmodule


方法3仿真波形 (原文件名:m3.png)

方法4 使用系统时钟
module Test(rst_n,clock, A, B);

input rst_n;
input clock;
input A;
output B;

reg B;

reg[2:0] A_BUF;

always @(posedge clock or negedge rst_n)
        if(!rst_n)
          begin
                A_BUF <= 3'b000;
          end
        else
          begin
                A_BUF <= {A_BUF[1:0], A};
          end

wire A_RISE = (A_BUF[2:1] == 2'b01);

always @ (posedge clock or negedge rst_n)
        if(!rst_n)
                B <= 1'b0;
        else if(A_RISE)
                        B <= 1'b1;
endmodule


方法4仿真波形 (原文件名:m4.png)


目前我能想到的就这4种了,大家还有什么好的想法不妨一起交流下,呵呵

这些方法都能实现功能,只是反应时间上有区别。根据仿真结果来看,第一种结果最好,延时最短,但就是第一种我见到的用的最少,不知道为什么,这样用有什么缺点么????

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2010-12-8 21:26:45 | 显示全部楼层
除了第一种之外都称不上B在A的上升沿置1,本来你要做的就是一个D触发器,A接时钟,Q接B,D端接1。其它几种方法我认为是调板子的过程中发现时序不大合适,塞了几级触发器调节下延时。

出0入0汤圆

发表于 2010-12-8 21:26:59 | 显示全部楼层
第一种可能造成,误动作,如果一个干扰的话就会造成误动作


第2,3,4种没仔细分析了,反正就是构成一个数字滤波器啦。不过好像又有点不像,感觉仿真波形不对。

大概意思就是在时钟沿采样,看是否是高电平,如果是高电平计数器就增加,增加到了一定数量就 置位B

还有一种是在时钟周期采样,如果是高电平就增加计数器,如果下一个才有期如果变成低电平就复位计数器,知道连续n次是高电平就置位B

出0入0汤圆

发表于 2010-12-8 21:35:39 | 显示全部楼层
2楼说的也有可能。不过我常用CMOS电平,噪声容限很高的,要是高速都是差分

出0入0汤圆

发表于 2010-12-12 16:46:37 | 显示全部楼层
通过高频时钟来采样低频时钟的上升沿,这是常用的去毛刺抗干扰的做法。我注意到了楼主的复位电路采用的是异步复位,尽量也通过这样的方式改成同步复位不是更好。整个系统稳定性就高了许多。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 15:26

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

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