双边沿触发器
在编写这部分的verilog代码时,第一思路是建立两个触发器,然后用assign 最后赋值给输出.如下:
module top_module(
input d,
input clk,
output q
);
reg q_pos,q_neg;
always @(posedge clk ) begin
q_pos <= d;
end
always @(negedge clk ) begin
q_neg <= d;
end
assign q = q_pos|q_neg;
endmodule
可想而知,上面这段代码最后assign 部分有错误.并不符合要求,遂改;
module top_module(
input d,
input clk,
output q
);
reg q_pos,q_neg;
always @(posedge clk ) begin
q_pos <= d;
end
always @(negedge clk ) begin
q_neg <= d;
end
assign q = clk ? q_pos : q_neg;
endmodule
这段代码解决了上述错误,通过在assign 中判断clk来赋值.但是由于性能并不是很好(?),再改!
module top_module(
input d,
input clk,
output q
);
always @(posedge clk ) begin
q_pos <= q_neg ^ d;
end
always @(negedge clk ) begin
q_neg <= q_pos ^ d;
end
assign q = q_pos^q_neg;
endmodule
这段code一开始没看懂,其中有一个盲区 : a^b^b = a ; 一个数连续异或另一数2次还是本身 ; 这样同时解决上述两个问题.
just for fun
- Post link: https://www.sccan.top/2021/09/23/FPGA/DDR/
- Copyright Notice: All articles in this blog are licensed under unless otherwise stated.