原创 脉冲边沿检测(Verilog)

2009-3-24 20:02 9057 11 12 分类: FPGA/CPLD

脉冲边沿检测(Verilog<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


     在很多时候都要对输入脉冲进行边沿检测,如PS/2时序,ps2_data数据在ps2_clk时钟下降沿接收。


 


边沿检测Verilog程序代码:


module DetecEdge(clk,ps2_clk,rst_n,pos_ps2_clk,neg_ps2_clk);


 


input clk;             //输入时钟


input ps2_clk;         //输入要检测边沿的脉冲


input rst_n;           //复位信号


 


output pos_ps2_clk;    //上升沿标志位


output neg_ps2_clk;    //下降沿标志位


 


reg ps2_clk_r0,ps2_clk_r1,ps2_clk_r2;   //ps2_clk状态寄存器


 


always@(posedge clk or negedge rst_n)


    if(!rst_n)


            begin


                  ps2_clk_r0<=1'b0;


                      ps2_clk_r1<=1'b0;


                      ps2_clk_r2<=1'b0;


                end


         else                               //锁存状态


            begin


                  ps2_clk_r0<=ps2_clk;


                      ps2_clk_r1<=ps2_clk_r0;


                      ps2_clk_r2<=ps2_clk_r1;


                end


 


assign pos_ps2_clk=(~ps2_clk_r2)&ps2_clk_r1;    //上升沿检测


assign neg_ps2_clk=ps2_clk_r2&(~ps2_clk_r1);       //下降沿检测 


               


endmodule


 


布线布局后仿真波形如下图:


<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />


 

点击看大图 


 


可以注意到其中的移位寄存器用了非阻塞赋值(<=)


ps2_clk_r0<=ps2_clk;


ps2_clk_r1<=ps2_clk_r0;


ps2_clk_r2<=ps2_clk_r1;


如果用阻塞赋值的话,综合的时候会把其中两个寄存器去点,用阻塞赋值(=)


ps2_clk_r0=ps2_clk;


ps2_clk_r1=ps2_clk_r0;


ps2_clk_r2=ps2_clk_r1;


 


会出来这样的警告:


WARNING:Xst:646 - Signal <ps2_clk_r0> is assigned but never used.


    Register <ps2_clk_r2> equivalent to <ps2_clk_r1> has been removed


    Found 1-bit register for signal <ps2_clk_r1>.


 


WARNING:Xst:2677 - Node <ps2_clk_r1> of sequential type is unconnected in block <DetecEdge>.


 



点击看大图 


 


RTL可以看到,只剩ps2_clk_r1一个D触发器。


 



点击看大图  


    


        上图是非阻塞赋值综合后的RTL,可以看出,有三个D触发器做移位寄存器。通过移位,对边沿进行检测。


 


程序工程文件下载:https://static.assets-stash.eet-china.com/album/old-resources/2009/3/24/86bb5e63-8959-47c4-af52-10ac330554d3.rar


 


 


代码还有一种写法:


module DetecEdge(clk,ps2_clk,pos_ps2_clk,neg_ps2_clk);


 


input clk;              //输入时钟


input ps2_clk;         //输入要检测边沿的脉冲


 


output pos_ps2_clk;    //上升沿标志位


output neg_ps2_clk;    //下降沿标志位


 


reg [2:0] ps2_clkr;   //用一个fifo来采样ps2_clk信号;


 


always @(posedge clk)


        ps2_clkr <= {ps2_clkr[1:0], ps2_clk};


 


wire pos_ps2_clk = (ps2_clkr[2:1]==2'b01); // now we can detect ps2_clk rising edges


wire neg_ps2_clk = (ps2_clkr[2:1]==2'b10); // and falling edges


 


endmodule


 


布线布局后仿真波形和之前程序的仿真波形一样



点击看大图


 


 


程序文件下载:https://static.assets-stash.eet-china.com/album/old-resources/2009/3/24/5286d476-c43c-4b99-b658-5d53865ce19a.rar


 


参考资料:


1)verilogPS2键盘解码——特权s blog


http://blog.ednchina.com/ilove314/153929/message.aspx


2) [FPGA][Verilog][PS2]模拟PS2协议,丢掉4x4键盘,来用标准键盘吧!_阿虚的电子小屋


http://hi.baidu.com/aokikyon/blog/item/e46dc2368d9f76350a55a99a.html

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户1373959 2010-2-11 21:52

FAT32无法承受4GB以上的文件。

songmin2_301502101 2010-2-3 22:54

ISE11安装也有类似问题。需要文件系统是NTFS才能正确安装。

用户1395232 2009-3-25 17:31

圈子真小 阿虚的电子小屋 同学的..
相关推荐阅读
藤井树 2015-10-12 14:43
印制电路板的抗干扰设计 zz
印制电路板的抗干扰设计     作者:中船重工集团第707所 肖麟芬   摘   要:本文以印制电路板的电磁兼容性为核心,分析了电磁干扰的产生机理...
藤井树 2013-10-22 15:32
2010.5.30 黄草梁上包饺子一日登山活动——摘韭菜篇
        上次桃花节的时候也有野韭菜,那时候的我连草和韭菜叶分不清,才回去的韭菜也不敢吃,哈哈,这次可算真正见识了韭菜,黄草梁也叫韭菜梁,因为满山遍野都是野韭菜而闻名,比较圆比较粗的就是野韭...
藤井树 2013-10-22 15:28
2010.5.30 黄草梁上包饺子一日登山活动——包饺子篇
摘韭菜回来,大家已经忙开了 我也装模作样地“工作着” 哈哈,还不让我包,包饺子是技术活,一定要皮薄馅厚才有资格包,像我这样的只能旁观了 摘的韭菜应该足够了,旁边那个袋子是我摘来带回学校的 ...
藤井树 2013-08-09 15:19
datasheet下载网站整理(查IC芯片手册)【原创】
*************************************************************************         作为电子工程师,芯片的dat...
藤井树 2010-06-04 00:21
陈伟宁王辉一家捐助渠道(北京菲亚特—英菲尼迪)
       王辉的最新消息请关注 http://chenweining.org/       目前事故责任认定已经出来了——陈家全责。        发信人: program (程序), 信区: D...
藤井树 2010-06-01 13:43
2010.5.30 黄草梁上包饺子一日登山活动——美景篇
这天不得不说的是天空,蓝蓝的天空,白白的云    绿油油的山脊  我、洪涛哥哥、huangna妹妹还有她同事小艾走在黄草梁上    在蓝天白云下合影       阳光照过来,景色真美 象鼻山,走不...
EE直播间
更多
我要评论
1
11
关闭 站长推荐上一条 /3 下一条