双边沿触发器

在编写这部分的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次还是本身 ; 这样同时解决上述两个问题.