1

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

input clk, in1, in2;
output out;
always@ (posedge clk) begin out<=in1; end
always@(negedge clk) begin out<=in2; end

但是,这是不可综合的,因为多个驱动程序位于单独的 always 块中。有什么解决办法吗?

4

3 回答 3

6

这应该可以得到你想要的。这是否是一个好主意取决于你在做什么。

input clk, in1, in2;
output out;
assign out = clk ? in1 : in2;
于 2012-06-01T03:52:02.790 回答
1

正如其他人所提到的,使用时钟作为数据并不常见。使用 dwikle 的答案可以实现组合多路复用器,但是如果您真的想以失败告终(在这种情况下,输出应该是 reg 或 logic 类型,而原始代码中缺少该类型),那么您可以编写:

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;
于 2012-06-01T20:21:40.380 回答
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

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

于 2012-06-01T18:58:56.717 回答