题目
- DualEdge
![在这里插入图片描述](https://img-blog.csdnimg.cn/57eb9eb1bc2e467abec0872e7d4693bb.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBASU1NVU5JWkU=,size_20,color_FFFFFF,t_70,g_se,x_16)
思路与算法
- 题目非常简单,可以简单的想到寄存两个状态,然后根据时钟电平的高低打出对应的输出即可。
- 趣解在于利用了a ^ b ^ b = a这个等式。上升沿到来的时候将q=d ^ neg ^ neg = d,下降沿的时候q = pos ^ d ^ pos = d。极其巧妙
代码实现
- 常规解法:
module top_module (
input clk,
input d,
output q
);
reg [1:0] tmp;
always @ (posedge clk) begin
tmp[0] <= d;
end
always @ (negedge clk) begin
tmp[1] <= d;
end
assign q = clk ? tmp[0] : tmp[1];
endmodule
- 趣解:
module top_module (
input clk,
input d,
output q
);
reg pos,neg;
always @ (posedge clk) begin
pos <= d ^ neg;
end
always @ (negedge clk) begin
neg <= d ^ pos;
end
assign q = pos ^ neg;
endmodule
写在最后
- 保持专注,天天开心~