【问题标题】:VHDL: assignment of parameterized busses in a processVHDL:进程中参数化总线的分配
【发布时间】:2014-02-14 17:43:14
【问题描述】:

作为一项学术练习,我正在设计一个具有某些限制的移位寄存器,其中一个是我必须使用给定数量的 d 型触发器(其数量来自泛型)。

如何使输入总线的宽度随着我拥有的触发器数量而变化?

这是最初的计划(使用 for 循环,使用 i 作为递增值),但我们无法在进程中使用 for 循环!

 else --SHIFT LEFT
 if (CTRL = "10") then


 internalInputBus (i+1) <= internalOutputBus(i);
 internalInputBus (0) <= SHIFT_IN;

 else --SHIFT RIGHT
 if (CTRL = "01")  then
 internalInputBus (i) <= internalOutputBus(i+1);
 internalInputBus (n-1) <= SHIFT_IN; --use interesting test length thing

【问题讨论】:

  • 当然你可以在进程中使用 FOR 循环。在进程之外,您可以使用 For .. Generate 语句。

标签: loops generics process vhdl xilinx


【解决方案1】:

因为您指定 i+1 用于左移,i-1 用于右移,我们可以推断您将范围表示为小端(向下)。

“寄存器”的大小可以通过泛型分配,用于匹配端口大小和任何内部数组值大小。

signal internalInputBus: std_logic_vector (REGSIZE-1 downto 0);

在您的流程声明中,向左移动

internalInputBus <= internalInputBus(REGSIZE-2 downto 0) & right_shift_input;

使用最右边的 REGSIZE-1 位和移位输入的连接运算符。

右移时

internalInputBus <= left_shift_input & internalInputBus(REGSIZE-1 downto 1);

我以前见过人们使用单班输入,但我自己从未找到过有意义的应用程序。如果没有内部三态信号,则在某处有一个隐含的多路复用器。

循环语句是过程语句中允许的顺序语句。我想你在结束边界方面遇到了麻烦。寻求解决方案将导致您类似于使用连接运算符。

上面两个连接运算符示例的左右边界将引导您了解如何使用不遍历所有元素的循环以及附加的赋值运算符来覆盖目标数组的所有元素。

-- LEFT
for i in REGSIZE-2 downto 0 loop
    internalInputBus(i+1) <= internalInputBus(i);
end loop;

internalInputBus(0) <= right_shift_input;

-- RIGHT
for i in REGIZE-1 downto 1 loop
    internalInputBus(i-1) <= internalInputBus(i);
end loop;
internalInputBus(REGSIZE-1) <= left_shift_input;

这些只是在我的脑海中完成的。买者自负。

请注意,没有干预等待的信号分配(如在循环语句中)可以读取您刚刚计划更新的值的当前值。如果您使用的是变量目标,则需要颠倒顺序以防止覆盖正在评估的下一个值。 (在这种情况下,在 -- RIGHT 示例中,for i in 1 to REGIZE-1 loop)。

【讨论】:

    【解决方案2】:

    您可以在一行中编写一个移位器。我已将您的信号重命名为 io 以节省输入并使基本点更清晰(我认为无论如何都可以!):

    i <= o(o'high-1 downto 0) & SHIFT_IN;
    

    这会获取信号 o,切掉最高位,并将新位放在“低”端,从而产生左移。

    同样,对于右移,删除最低位并将新位放在“高”端:

    i <= SHIFT_IN & o(o'high downto 1);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-12
      • 1970-01-01
      • 2012-09-02
      相关资源
      最近更新 更多