Arrays VHDL:可以同时移动数组元素吗?

Arrays VHDL:可以同时移动数组元素吗?,arrays,vhdl,insertion-sort,Arrays,Vhdl,Insertion Sort,为了便于学习,我想创建自己的插入排序实现。 正如您现在可能看到的,其中一个步骤要求将数组元素向右移动1。这里的主要困难在于该操作的范围必须是动态的 所以,如果sort_reg是从0到array_length的数组,我需要实现sort_reg(n)是的,一步就可以实现。您必须将元素存储在寄存器中,然后在同一上升沿为所有数组元素分配新值 让我们用两个std\u逻辑类型的信号a和b来做一个简单的例子。然后,此过程将在时钟的上升沿交换两个元素: process(clock) begin if ris

为了便于学习,我想创建自己的插入排序实现。 正如您现在可能看到的,其中一个步骤要求将数组元素向右移动1。这里的主要困难在于该操作的范围必须是动态的


所以,如果sort_reg是从0到array_length的数组,我需要实现sort_reg(n)是的,一步就可以实现。您必须将元素存储在寄存器中,然后在同一上升沿为所有数组元素分配新值

让我们用两个
std\u逻辑类型的信号a和b来做一个简单的例子。然后,此过程将在
时钟的上升沿交换两个元素:

process(clock)
begin
  if rising_edge(clock) then
    a <= b;
    b <= a;
  end if;
end process;
然后可以使用for循环来编写流程。 EDIT:在每个迭代步骤中,可以使用
if
语句检查元素是否应该实际移位。信号
n
m
的类型应为
无符号
(首选)或
整数
,范围为0到大小-1。 编辑2:示例更改为注释中所示的旋转

-- value to insert in case of rotation
value_to_insert <= sort_reg(to_integer(n)); -- to_integer required if type of 'n' is unsigned

process(clock)
begin
  if rising_edge(clock) then
    -- This loop is unrolled by the synthesis tool.
    for i in SIZE-1 downto 1 loop
      -- shift elements [n-1:m] to [n:m+1]
      if (i <= n) and (i >= m+1) then
        sort_reg(i) <= sort_reg(i-1);
      end if;

      -- insert new value
      if i = m then
        sort_reg(i) <= value_to_insert;
      end if;
    end loop;

    -- insert into position zero
    if m = 0 then
      sort_reg(0) <= value_to_insert;
    end if;
  end if;
end process;
--旋转时插入的值
值插入这个怎么样

sort_reg <= sort_reg(1 to sort_reg'high) & sort_reg(0);
在这种情况下,
sort_reg'high
是一个等于
N
的属性

在vhdl中,
&
用作串联运算符。它将两个向量/数组连接在一起,形成一个向量/数组

上面的示例仅移动1项。如果您想按
M
移位,可以使用类似的方法

sort_reg <= sort_reg(M to sort_reg'high) & sort_reg(0 to M-1);

sort\u reg请澄清哪个范围必须是动态的,
n
m
或两者都是?是的,我可能不够清楚,两者都需要是动态的。m是移动的成员的目标索引。这就是插入排序的工作原理:找到小于当前位置m的第一个成员n,并将其插入到m(n>m)。对于该porpuse,从m到n的范围必须移动到m+1到n。还忘了提到Zynq设备必须在Xilinx Vivado下进行合成,明白了吗。我扩展了我的例子。它与Quartus II合成,但我无法检查它是否与Vivado一起工作。如果(I=m+1)
,它是否应该是
?我现在意识到,我可能可以通过解释我希望旋转数组的动态范围来简化任务描述。(移位是其中的一个子操作)我实现了一个测试模块,该模块将整数数组m,n作为输入,并使用您建议的方法旋转范围m到n。我模拟了Vivado,看起来不错,谢谢@AndreyPro您是对的,但此
if
条件仅适用于注释中指定的范围。我现在已经拿了这个。但是,您原来的问题仍然使用另一个移位范围,即将元素n-1向下移位到n-m向上一个位置。请编辑你的问题以避免混淆。哦,我明白了。我在两种不同的意义上使用了m,把每个人都弄糊涂了:-/。对不起。我会澄清我对1号班次没问题。我将在FSM中使用它,所以很可能我会像sort\u reg\u next(I-1)一样分配它
signal sort_reg : some_array_type(0 to N);
sort_reg <= sort_reg(M to sort_reg'high) & sort_reg(0 to M-1);