VHDL中的3位串行输入冒泡排序不排序

时间:2017-10-25 03:40:22

标签: sorting vhdl bubble-sort

我正在尝试设计一个3位串行输入冒泡排序,并且无法将输出实际排序。

不幸的是,我对VHDL或一般的编程不是很熟悉。

我已经读过,我的潜在问题是我使用信号并在我的过程中分配它们的方式。但是,当我尝试纠正它并将其编译时,我的输出被打破了。

还有一个关于VHDL中使用数组的冒泡排序的问题,我也试图将其作为基础,但也没有成功。我尝试的主要内容是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;

1 个答案:

答案 0 :(得分:0)

好的,你的代码有很多问题。 首先,从输入到x_vector的映射具有相反的位,您也可以在输出中执行此操作。
下一个pass_in永远不会得到一个值,导致您的第一个比较inp1 > inp2始终为真。那么你实际做的是给出一个输入信号,将它与任何东西进行比较,然后在一个时钟周期后返回它。 See Picture.
要进行冒泡排序,您至少需要在开头有两个输入。

正如其他人所说,在继续之前尝试一些教程以更熟悉VHDL。我可以推荐asic-world tutorial
祝你好运!