同步器
一、RTL代码
/**********************************************************
程序名称:同步器
简要说明:异步输入脉冲宽度小于时钟周期的信号,输出一个时钟周期的同步脉冲信号
编 写:武书肖
最后更新:2015年4月12日星期日
**********************************************************/
module synch(synch_in,synch_out,clk,rst);
input clk,rst,synch_in;
output synch_out;
reg q1,q2,synch_out;
wire rst_q1_q2=(!synch_in&&synch_out)||rst;
always @(posedgesynch_in or posedge rst_q1_q2)
begin
if(rst_q1_q2) q1<=0;
else q1<=1;
end
always @(posedge clk orposedge rst_q1_q2)
begin
if(rst_q1_q2) q2<=0;
else q2<=q1;
end
always @(posedge clk orposedge rst)
begin
if(rst) synch_out<=0;
else synch_out<=q2;
end
endmodule
二、RTLNetlist
三、Testbench
`timescale 1 ns/ 1 ps
module synch_vlg_tst();
reg clk;
reg rst;
reg synch_in;
wire synch_out;
synch i1 (
.clk(clk),
.rst(rst),
.synch_in(synch_in),
.synch_out(synch_out)
);
initial
begin
clk=0;
rst=0;
#20 rst=1;
#100 rst=0;
#10000 $stop;
end
initial
begin
synch_in=0;
#330 synch_in=1;
#50 synch_in=0;
#500 synch_in=1;
#50 synch_in=0;
end
always #50 clk=~clk;
endmodule
-
仿真结果
由仿真结果可看出,输入是一个小于时钟周期的窄脉冲异步信号,输出是宽度为一个时钟周期的同步脉冲信号,满足设计要求。