题解 | #脉冲同步电路#
脉冲同步电路
https://www.nowcoder.com/practice/b7f37e6c55e24478aef4ec2d738bbf07
单bit同步电路: 脉冲检测: 结绳法
// 结绳法: 快->慢、 慢->快
// 第一种:利用脉冲边沿做时钟;采集到的信号做异步复位;
//第二种:利用脉冲的电平做选择器、异步复位置位;
//第二种:利用脉冲的电平做选择器、异步复位置位;
第二种:输出Q一直维持为1,直到下一个脉冲到来;ouptu异或,在第一次q=1,reg3reg4 1,0 输出为1;q保持不变,在第二个脉冲到来q=0, 0,1输出1 会一直锁存q,因此可以检测,延长脉冲
下面是第二种方法的程序:
下面是第二种方法的程序:
// data_in==1 之后 reg_fast的输出一直为1,直到下一次data_in ==1;reg_fast==0 延长脉冲
always@(posedge clk_fast or negedge rst_n) begin
if(!rst_n) begin
reg_fast <= 1'b0;
end
else
reg_fast <= fast_data;
end
assign fast_data = (data_in) ? (~ reg_fast) : reg_fast;
if(!rst_n) begin
reg_fast <= 1'b0;
end
else
reg_fast <= fast_data;
end
assign fast_data = (data_in) ? (~ reg_fast) : reg_fast;
// B时钟域下打两拍同步
// data_out的输出 由reg2,reg3异或得到,reg_fast的输出跳变时,才会输出1
always@(posedge clk_slow or negedge rst_n) begin
if(!rst_n) begin
reg1_slow <= 1'b0;
reg2_slow <= 1'b0;
reg3_slow <= 1'b0;
end
else begin
reg1_slow <= reg_fast;
reg2_slow <= reg1_slow;
reg3_slow <= reg2_slow;
end
end
assign dataout = reg3_slow ^ reg2_slow;
always@(posedge clk_slow or negedge rst_n) begin
if(!rst_n) begin
reg1_slow <= 1'b0;
reg2_slow <= 1'b0;
reg3_slow <= 1'b0;
end
else begin
reg1_slow <= reg_fast;
reg2_slow <= reg1_slow;
reg3_slow <= reg2_slow;
end
end
assign dataout = reg3_slow ^ reg2_slow;
// clkB需要等待3个clkb,完成输出并复位
// clkA_data的频率大于clkB的1/3,则clkA的变化无法被采样到
// 慢采快,结绳法适合数据较少的控制信息
// clkA_data的频率大于clkB的1/3,则clkA的变化无法被采样到
// 慢采快,结绳法适合数据较少的控制信息

