HDLBits刷题总结——Dualedge
总结了各位大神的知识,浅浅记录~ ~
如有不对请指正,一起进步
这道题是实现双边沿采样
FPGA中没有实现时钟上升沿和下降沿同时采样的触发器,即always边沿触发时只有一个clk和一个reset
module top_module (
input clk,
input d,
output q
);
// q 在上升沿或者下降沿变化
// 双端沿检测
reg temp1,temp2;
always @( posedge clk) begin
temp1 <= d;
end
always @(negedge clk) begin
temp2 <= d;
end
//assign q = clk ? temp1 : temp2; 产生竞争冒险
// 圈1
//assign q = (temp2 & ~clk) | (temp1 & clk) | (temp1 & temp2); //虽然得到了同样的数值,但是映射到了不同的硬件电路上,因此出现不同的冒险
assign q = (temp2 | clk) & (temp1 | ~clk) & (temp1 | temp2); // 圈0
endmodule
竞争冒险问题
组合逻辑电路出现的是竞争冒险问题;
时序逻辑电路出现的是亚稳态问题。
竞争
在一个组合电路中,当某一个变量经过两条以上的路径到达输出端的时候,由于每条路径上的延迟时间的不同,到达终点的时间会有先有后,这一现象称为竞争。
冒险
在具有竞争现象的组合电路中,当某个变量发生变化时,真值表所描述的逻辑关系或者功能遭受到短暂的破坏,在输出端出现一个不应有的尖脉冲毛刺,这种现象叫冒险。
竞争与冒险的关系
竞争 —— 不一定会产生冒险
冒险 —— 一定存在竞争
冒险的分类
1型冒险:
真值为0的时候出现了1的尖峰
0型冒险:
真值为1的时候出现了0的尖峰
冒险的检测
公式法
逻辑表达式能转换为 A·(~A) ======== 出现1型冒险
逻辑表达式能转换为A+(~A) ======== 出现0型冒险
卡诺图法
利用卡诺图圈“1” / “0”,圈相切 ======== 出现冒险
冒险的消除
增加冗余项
引入额外的乘积项(与门)来覆盖冒险的输入对
增加滤波电容 (低通滤波)
假设毛刺是个高电平脉冲
△t很小或电容C很大(等价于给电容充电的时间很短 或者 电容充电非常慢) 电容还没有完成充电过程,电容就赶紧放电,因此毛刺消失。
C = Q/U
△t很大或电容C很小(等价于电容足够的时间充电,或者很容易完成充电) 电容可以充满电再放电,U冲到的电压和毛刺一样。
高通滤波电路:即输入信号中,频率越高的就越容易通过电路来到输出端,而频率较低的信号被滤除
低通滤波电路:即输入信号中,频率越低的越容易通过电路来到输出端,而频率较高的信号被滤除
引入封锁脉冲
引入负脉冲,在输入信号发生冒险的时间内,把可能产生的干扰脉冲的门堵住。
引入选通脉冲
在电路状态稳定后,再选通输出。