您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 基于verilog的边沿检测电路
在时序逻辑电路中,少不了“沿”。always块敏感信号中可以通过关键字posedge和negedge来提取信号的上升沿和下降沿。但是如果在程序块内部需要某个信号的上升沿或者下降沿、或者对于按钮触发的模块,由于按钮按下的持续时间很长,相当于一个电平信号,而不是脉冲信号,这时就需要边沿检测电路将其处理成单时钟周期宽度的脉冲信号。下面介绍几种基于verilog的边沿检测电路。(软件平台为quartus11.1,ModelSim-Altera10.0)方法1:①Verilog源码moduledetecEdge(clk,rst_n,din,pos_clk,neg_clk,doub_clk);inputclk,rst_n,din;outputpos_clk,neg_clk,doub_clk;regctl_this,ctl_last;always@(posedgeclkornegedgerst_n)//同步复位(注意与异步复位的区别)beginif(!rst_n)//低有效beginctl_this=0;ctl_last=0;endelsebegin//注意非阻塞赋值的作用ctl_this=din;//din的当前时钟值ctl_last=ctl_this;//din的前一个时钟值endend//assignpos_clk=(ctl_last==0&&ctl_this==1)?1:0;//上升沿检测//assignneg_clk=(ctl_last==1&&ctl_this==0)?1:0;//下降沿检测assignpos_clk=ctl_this&(!ctl_last);//上升沿检测assignneg_clk=ctl_last&(!ctl_this);//下降沿检测assigndoub_clk=ctl_last^ctl_this;//双边沿检测endmodule②RTL综合图③消耗资源④Modelsim仿真testbench源码:`timescale1ns/1psmoduletestbench;regclk,rst_n,din;wirepos_clk,neg_clk,doub_clk;//调用detecEdge模块detecEdgeinst(.clk(clk),.rst_n(rst_n),.din(din),.pos_clk(pos_clk),.neg_clk(neg_clk),.doub_clk(doub_clk));initial//输入信号初始化beginrst_n=0;clk=0;din=0;#50;rst_n=1;endalways#100din=~din;//输入激励always#5clk=~clk;//系统时钟endmodule仿真波形:由仿真结果知,当din上升沿到来时,pos_clk输出一个脉冲信号(宽度为1个clk),同理,当din下降沿到来时,neg_clk输出一个脉冲信号,doub_clk在din的上升沿和下降沿都输出脉冲信号。方法2:①Verilog源码moduledetecEdge(clk,rst_n,din,pos_clk,neg_clk,doub_clk);inputclk;inputrst_n;inputdin;outputpos_clk;outputneg_clk;outputdoub_clk;reg[2:0]ctl_r;//din状态寄存器always@(posedgeclkornegedgerst_n)//注意异步复位与同步复位if(!rst_n)//低有效beginctl_r=3'b000;endelsebeginctl_r={ctl_r[1:0],din};endassignpos_clk=(!ctl_r[2])&ctl_r[1];//上升沿检测assignneg_clk=(!ctl_r[1])&ctl_r[2];//下降沿检测assigndoub_clk=ctl_r[2]^ctl_r[1];//双边沿检测endmodule或者:moduledetecEdge(clk,rst_n,din,pos_clk,neg_clk,doub_clk);inputclk;inputrst_n;inputdin;outputpos_clk;outputneg_clk;outputdoub_clk;regctl_r0,ctl_r1,ctl_r2;always@(posedgeclkornegedgerst_n)if(!rst_n)//低有效beginctl_r0=1'b0;ctl_r1=1'b0;ctl_r2=1'b0;endelsebeginctl_r0=din;ctl_r1=ctl_r0;ctl_r2=ctl_r1;endassignpos_clk=(!ctl_r2)&ctl_r1;assignneg_clk=(!ctl_r1)&ctl_r2;assigndoub_clk=ctl_r1^ctl_r2;②RTL综合图③消耗资源④modelsim仿真testbench源码:`timescale1ns/1psmoduletestbench;regclk,rst_n,din;wirepos_clk,neg_clk,doub_clk;//调用detecEdge模块detecEdgeinst(.clk(clk),.rst_n(rst_n),.din(din),.pos_clk(pos_clk),.neg_clk(neg_clk),.doub_clk(doub_clk));initial//输入信号初始化beginrst_n=0;clk=0;din=0;#50;rst_n=1;endalways#100din=~din;//输入激励always#5clk=~clk;//系统时钟endmodule仿真波形:注意与方法1的仿真波形的区别。(方法2延迟了1个时钟周期)。
本文标题:基于verilog的边沿检测电路
链接地址:https://www.777doc.com/doc-1547460 .html