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またはロジックにする必要があります)、次のように書くことができます:

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

または同等に、edge の代わりに @(negedge clk または posedge clk) を使用できます。ただし、これは合成ツールを混乱させる可能性があります。おそらく、次のほうがより簡単です。

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 に答える