Process vhdl中的气泡排序

Process vhdl中的气泡排序,process,vhdl,Process,Vhdl,有谁能帮我在给定一组数据作为输入的情况下为冒泡排序编写VHDL代码 我已将in_数组声明为包含15个数组元素的输入。我想按降序对它们进行排序 _数组中的是输入数组。 sorted_数组是输出数组。 in_array_sig是in_array类型的信号 我在进程内面临语句问题 下面是我的代码: architecture behav of Bubblesort is signal in_array_sig : bubble; signal temp : std_logic_vector(3

有谁能帮我在给定一组数据作为输入的情况下为冒泡排序编写VHDL代码

我已将in_数组声明为包含15个数组元素的输入。我想按降序对它们进行排序

_数组中的
是输入数组。
sorted_数组
是输出数组。
in_array_sig
是in_array类型的信号

我在进程内面临语句问题

下面是我的代码:

architecture behav of Bubblesort is
  signal in_array_sig : bubble;
  signal temp : std_logic_vector(3 downto 0);
  signal i : integer := 0;
begin

  in_array_sig <= in_array;

  proc1 : process(clk, reset)
  begin
    if reset = '0' then
      if (clk'event and clk = '1') then
        while (i <= 15) loop
          if (in_array_sig(i) < in_array_sig(i + 1)) then
            temp <= in_array_sig(i);
            in_array_sig(i) <= in_array_sig(i + 1);
            in_array_sig(i + 1) <= temp;
          end if;
          i <= i + 1;
        end loop;
      end if;
    end if;
  end process;

  sorted_array <= in_array_sig;

end behav;
Bubblesort的体系结构行为是
_阵列_sig中的信号:气泡;
信号温度:标准逻辑向量(3到0);
信号i:整数:=0;
开始
在_array _sig中,由于缺少a,因此很难给出所有阻止代码准确排序的因素的答案。这些可以按照您遇到的顺序进行描述

  proc1 : process(clk, reset)
  begin
    if reset = '0' then
      if (clk'event and clk = '1') then
        while (i <= 15) loop
          if (in_array_sig(i) < in_array_sig(i + 1)) then
            temp <= in_array_sig(i);
            in_array_sig(i) <= in_array_sig(i + 1);
            in_array_sig(i + 1) <= temp;
          end if;
          i <= i + 1;
        end loop;
      end if;
    end if;
  end process;
连同测试台:

library ieee;
use ieee.std_logic_1164.all;
use work.array_type.all;

entity bubblesort_tb is
end entity;

architecture fum of bubblesort_tb is
    signal clk:             std_logic := '0';
    signal reset:           std_logic := '0';
    signal in_array:        bubble :=
                   (x"F", x"E", x"D", x"C", x"B", x"A", x"9", x"8",
                    x"7", x"6", x"5", x"4", x"3", x"2", x"1", x"0");
    signal sorted_array:    bubble;
begin

DUT:
    entity work.bubblesort(foo)
        port map (
            clk => clk,
            reset => reset,
            in_array => in_array,
            sorted_array => sorted_array
        );
CLOCK:
    process
    begin
        wait for 10 ns;
        clk <= not clk;
        if now > 30 ns then
            wait;
        end if;
    end process;

end architecture;
ieee库;
使用ieee.std_logic_1164.all;
使用work.array_type.all;
实体bubblesort_tb是
终端实体;
bubblesort_tb的体系结构
信号时钟:标准逻辑:='0';
信号复位:标准逻辑:='0';
_阵列中的信号:气泡:=
(x“F”,x“E”,x“D”,x“C”,x“B”,x“A”,x“9”,x“8”,
x“7”、x“6”、x“5”、x“4”、x“3”、x“2”、x“1”、x“0”);
信号分选单元阵列:气泡;
开始
DUT:
实体工作。泡泡运动(foo)
港口地图(
时钟=>clk,
重置=>重置,
在\u数组中=>在\u数组中,
排序的数组=>排序的数组
);
时钟:
过程
开始
等待10纳秒;
时钟30纳秒
等待
如果结束;
结束过程;
终端架构;
我们得到:

一些有用的东西

reset as enable未包含在体系结构中的进程BSORT中,可以添加到带有时钟边缘条件的if语句中

在这里,我们在一篇关于描述硬件的评论中谈到了Matthew Taylor的观点

根据合成工具的不同,该过程可能作为硬件实现,也可能不作为硬件实现。如果没有,则需要中间变量来保存内部循环的每个连续迭代中使用的数组部分

还有一个问题是你在一个时钟周期内能做多少。最坏的情况是,延迟深度由15个元素比较和15个有条件交换元素对的2:2选择器组成

如果要选择与合成延迟不兼容的时钟速度,则需要重新设计实现,从软件循环模拟到跨连续时钟运行的实现

这可以很简单,通过使用enable来确定冒泡排序何时可以有效加载到已排序的数组寄存器中,从而允许更多的时钟周期。它可能更复杂,还允许使用不同的、性能更好的排序方法,或者对冒泡排序进行修改,以表示不需要检测更多的交换。

由于缺少a,因此很难提供所有阻止代码进行冒泡排序的因素的答案。这些可以按照您遇到的顺序进行描述

  proc1 : process(clk, reset)
  begin
    if reset = '0' then
      if (clk'event and clk = '1') then
        while (i <= 15) loop
          if (in_array_sig(i) < in_array_sig(i + 1)) then
            temp <= in_array_sig(i);
            in_array_sig(i) <= in_array_sig(i + 1);
            in_array_sig(i + 1) <= temp;
          end if;
          i <= i + 1;
        end loop;
      end if;
    end if;
  end process;
连同测试台:

library ieee;
use ieee.std_logic_1164.all;
use work.array_type.all;

entity bubblesort_tb is
end entity;

architecture fum of bubblesort_tb is
    signal clk:             std_logic := '0';
    signal reset:           std_logic := '0';
    signal in_array:        bubble :=
                   (x"F", x"E", x"D", x"C", x"B", x"A", x"9", x"8",
                    x"7", x"6", x"5", x"4", x"3", x"2", x"1", x"0");
    signal sorted_array:    bubble;
begin

DUT:
    entity work.bubblesort(foo)
        port map (
            clk => clk,
            reset => reset,
            in_array => in_array,
            sorted_array => sorted_array
        );
CLOCK:
    process
    begin
        wait for 10 ns;
        clk <= not clk;
        if now > 30 ns then
            wait;
        end if;
    end process;

end architecture;
ieee库;
使用ieee.std_logic_1164.all;
使用work.array_type.all;
实体bubblesort_tb是
终端实体;
bubblesort_tb的体系结构
信号时钟:标准逻辑:='0';
信号复位:标准逻辑:='0';
_阵列中的信号:气泡:=
(x“F”,x“E”,x“D”,x“C”,x“B”,x“A”,x“9”,x“8”,
x“7”、x“6”、x“5”、x“4”、x“3”、x“2”、x“1”、x“0”);
信号分选单元阵列:气泡;
开始
DUT:
实体工作。泡泡运动(foo)
港口地图(
时钟=>clk,
重置=>重置,
在\u数组中=>在\u数组中,
排序的数组=>排序的数组
);
时钟:
过程
开始
等待10纳秒;
时钟30纳秒
等待
如果结束;
结束过程;
终端架构;
我们得到:

一些有用的东西

reset as enable未包含在体系结构中的进程BSORT中,可以添加到带有时钟边缘条件的if语句中

在这里,我们在一篇关于描述硬件的评论中谈到了Matthew Taylor的观点

根据合成工具的不同,该过程可能作为硬件实现,也可能不作为硬件实现。如果没有,则需要中间变量来保存内部循环的每个连续迭代中使用的数组部分

还有一个问题是你在一个时钟周期内能做多少。最坏的情况是,延迟深度由15个元素比较和15个有条件交换元素对的2:2选择器组成

如果要选择与合成延迟不兼容的时钟速度,则需要重新设计实现,从软件循环模拟到跨连续时钟运行的实现


这可以很简单,通过使用enable来确定冒泡排序何时可以有效加载到已排序的数组寄存器中,从而允许更多的时钟周期。它可能更复杂,还允许使用不同的、性能更好的排序方法,或者对冒泡排序进行修改,以表示不需要检测更多的掉期。

“我面临问题”:请描述问题。您需要描述问题是什么,如@tramble\u jeff所说。但是,我确实看到了一个:您分配给<代码> TEMP
这行>代码> TEMP,您还需要考虑您所期望的硬件,具体地说,您需要多少个时钟周期来进行排序。MCVE可以从您的体系结构中重构,但问题描述除外:“它不工作”不是问题陈述。告诉我们预期的行为应该是什么。Matthew描述了模拟周期中信号更新的影响,请参阅。除了使temp成为流程stateme中声明的变量之外,还有其他一些事情需要更改