2017-10-25 16 views
0

3ビットシリアル入力バブルソートを設計しようとしており、実際にソートするための出力を得ることができませんでした。並べ替えを行わないVHDLでの3ビットシリアル入力バブルソート

残念ながら、私はVHDLやプログラミング全般に精通していません。

私の潜在的な問題は、私がシグナルを使用して自分のプロセス内で割り当てる方法です。しかし、私はそれを修正しようとしたときにコンパイルすると、私の出力が壊れていた。

VHDLのバブルソートに関するもう1つの質問は、私がオフラインにしたいと考えた配列を使用していましたが、失敗しました。私が試みた主なことは、for i in ___ to ___ loopプロセスでした。

以下は、私が最近使っているコードとテストベンチです。

何かアドバイスや説明をいただければ幸いです。

library ieee; 
use ieee.std_logic_1164.all; 

entity bubble_sort_bs is 
    generic (
     width : integer := 3); 
    port ( 
     X0, X1, X2 : in std_logic; 
     Y0, Y1, Y2 : out std_logic; 
     clk, enable : in std_logic); 
end entity bubble_sort_bs; 

architecture bubble_sort_bs_behav of bubble_sort_bs is 
    signal comb_out : std_logic; 
    signal inp : std_logic_vector((width-1) downto 0); 
    signal inp1 : std_logic_vector((width-1) downto 0); 
    signal inp2 : std_logic_vector((width-1) downto 0); 
    signal pass_in, pass_out : std_logic_vector((width-1) downto 0); 
    signal outp : std_logic_vector((width-1) downto 0); --trash 
    signal x_vector : std_logic_vector((width-1) downto 0); 
begin 
    x_vector <= X0 & X1 & X2; 
    Y0 <= pass_out(2); 
    Y1 <= pass_out(1); 
    Y2 <= pass_out(0); 

    Output : process(all) 
    begin 
     if rising_edge(clk) then 
      if enable <= '1' then 
       inp1 <= x_vector; 
       inp2 <= pass_in; 
      end if; 
     end if; 

     if inp1 > inp2 then --x_vector 
      comb_out <= '1'; 
      outp <= inp1; 
      pass_in <= inp2; 
     elsif inp2 > inp1 then --x_vector 
      comb_out <= '0'; 
      outp <= inp2; 
      pass_in <= inp1; 
      ----inp2 <= inp1; 
     elsif inp2 = inp1 then 
      comb_out <= '0'; 
      outp <= inp2; 
      pass_in <= inp1; 
     end if; 
     pass_out <= outp; 
    end process Output; 
end architecture bubble_sort_bs_behav; 

テストベンチ:

library ieee; 
use ieee.std_logic_1164.all; 

entity bubble_sort_bs_tb is 
end entity bubble_sort_bs_tb; 

architecture tb_behav of bubble_sort_bs_tb is 
    component bubble_sort_bs 
     generic (
      width : integer); 
     port (
      X0, X1, X2 : in std_logic; 
      Y0, Y1, Y2 : out std_logic; 
      clk, enable : std_logic 
     ); 
    end component; 
    constant bit_width : integer := 3; 
    signal inp, outp : std_logic_vector((bit_width-1) downto 0); 
    signal t_clk, t_enable : std_logic := '0'; 
begin 
    U1 : bubble_sort_bs 
     generic map (bit_width) 
     port map (
      X0 => inp(0), 
      X1 => inp(1), 
      X2 => inp(2), 
      Y0 => outp(0), 
      Y1 => outp(1), 
      Y2 => outp(2), 
      clk => t_clk, 
      enable => t_enable 
     ); 

    t_clk <= not t_clk after 5 ns; 
    test_process : process 
    begin 
     inp <= "001"; 
     t_enable <= '1'; 
     wait for 20 ns; 

     inp <= "100"; 
     t_enable <= '1'; 
     wait for 20 ns; 

     inp <= "111"; 
     t_enable <= '1'; 
     wait for 20 ns; 

     inp <= "000"; 
     t_enable <= '1'; 
     wait for 20 ns; 

     wait; 
    end process; 
end tb_behav; 
+0

「一般的なプログラミングに精通していない」と言います。 VHDLはプログラミング言語ではありません_ハードウェア記述言語_です。 VHDLを書くときは、ハードウェアを設計しています。そうです、プロセスでシグナルを割り当てる方法は間違っています。しかし、実際には、あなたのコードは非常に混同されています。私はあなたが一歩踏み出してVHDL、特にコーディングスタイルを知っておくことをお勧めします。 –

+0

私の会社のウェブサイトで[this](https://www.doulos.com/knowhow/vhdl_designers_guide/an_example_design_entity/)を読んでみてください。 「A Mix Of Use Tips」になるまで「次へ」をクリックし、少なくとも「Sequential Processes」のヒントを確認してください。 –

答えて

0

オーケーあなたのコードと間違って複数のものがあります。 まず、入力からx_vectorへのマッピングには、ビットが反転されています。これも出力で行います。
pass_inは決して値を取得しないため、最初の比較inp1 > inp2が常にtrueになります。実際に何をしているのかは、それを何も比較しない入力信号を与えてから、それをクロックサイクル後に戻すことです。 See Picture.
バブルソートを行うには、少なくとも最初に2つの入力が必要です。

他の人によると、続行する前にVHDLに詳しい方はチュートリアルを試してみてください。 asic-world tutorialをお勧めします。
幸運を祈る!

関連する問題