verilog mux在时钟边缘

时间:2012-06-01 03:29:58

标签: verilog mux

如何将时钟边沿用作多路复用器的选择器, 我想做什么:

input clk, in1, in2;
output out;
always@ (posedge clk) begin out<=in1; end
always@(negedge clk) begin out<=in2; end
但是,由于多个驱动程序位于不同的always块中,因此无法合成。有什么工作吗?

3 个答案:

答案 0 :(得分:6)

这应该可以满足您的需求。是否是一个好主意取决于你在做什么。

input clk, in1, in2;
output out;
assign out = clk ? in1 : in2;

答案 1 :(得分:1)

正如其他人所提到的,使用时钟作为数据并不常见。使用dwikle的答案可以实现组合多路复用器,但是如果你真的想要以翻牌结束(在这种情况下, out 应该是reg或逻辑类型,这在您的原始代码),然后您可以写:

always@(edge clk) 
begin
    unique case(clk)
        1'b0:    out <= in1;
        1'b1:    out <= in2;
    endcase
end

或等效地你可以使用@(negedge clk或posedge clk)而不是edge。 但是,这可能会使您的综合工具混淆。可能,以下内容更直接:

always@(posedge clk) 
    out1 <= in1;
always@(negedge clk) 
    out2 <= in2;
assign out = clk ? out1 : out2;

答案 2 :(得分:0)

像这样:

module mux1_2(input clk, d0, d1,
              input sel,
              output reg y);

    always@(posedge clk)
    begin
        case(sel)
            1'b0:    y <= d0;
            1'b1:    y <= d1;
        endcase
    end

endmodule

但是,您应该遵循其他人的建议。多路复用器是非常基本的组合设备,我没有看到任何需要在其上放置时钟的情况。