1

input0との値を入れ替えてinput1、小さい方を出力したい。Modelsim でプロジェクトをシミュレートすると、信号出力の波形が赤い線になります。私の間違いは何ですか?

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity MF is
    port (clk : in std_logic;
          input0: in std_logic_vector(2 downto 0);
          input1: in std_logic_vector(2 downto 0));
end MF;

architecture Behavioral of MF is
    signal bubble0: std_logic_vector(2 downto 0);
    signal bubble1: std_logic_vector(2 downto 0);                               

begin
    bubble0 <= input0;               
    bubble1 <= input1;
    output <= bubble0;                        -- my output
    process(clk)
    begin
        if rising_edge(clk) then
             if bubble0 > bubble1 then        -- swap
             bubble1 <= bubble0;
             bubble0 <= bubble1;
             end if;                                        
        end if;
    end process;
end Behavioral;
4

1 に答える 1

3

いくつかの問題があります。

1) 非同期およびプロセス内の両方で、 bubble0と bubble1 に値を割り当てています (これは、VHDL では合法である、各信号に複数のドライバーを使用する「バスの戦い」ですが、自分が何をしているのかを認識する必要があります。実行中...通常、これはトライステートバスを作成するために使用されますが、両方の割り当てが常に信号を駆動しているため、信号を解決するときに「未定義」状態になる可能性があります)。

2) プロセス内の if ステートメントのすべてのケースで、bubble0 と bubble1 に値を割り当てているわけではありません。

3) 数値の大きさについて 2 つの std_logic_vector 値を直接比較することはできません。最初にそれらを適切な数値型 (signed または unsigned など) にキャストする必要があります。

出力をどのように動作させたいかは正確にはわかりませんが、おそらく次のようなものがうまくいくでしょう...これにより、クロックの各立ち上がりエッジで適切にバブル信号が更新されます。

begin
    output <= bubble0;                        -- my output
    process(clk)
    begin
        if rising_edge(clk) then
             if unsigned(input0) > unsigned(input1) then        -- swap
                 bubble1 <= input0;
                 bubble0 <= input1;
             else
                 bubble0 <= input0;               
                 bubble1 <= input1;
             end if;                                        
        end if;
    end process;
end Behavioral;
于 2013-01-05T17:47:41.483 に答える