【问题标题】:Slicing a STD_LOGIC_VECTOR and putting back together?切片 STD_LOGIC_VECTOR 并重新组合?
【发布时间】:2019-04-08 21:37:17
【问题描述】:

我已将 16 位 STD_LOGIC_VECTOR 切成 3 部分。我想保持前 8 个 MSB 不变,并将 8 个 LSB 分成 2 个半字节以对它们进行一些处理。 我可以做到这一切,并且处理一切都很好,但是当我尝试将它们全部放在一个 16 位 STD_LOGIC_VECTOR 输出中时,它只是保持 UUUU。有什么特别的方法可以把它重新组合起来吗?

    signal fullout : std_logic_vector(15 downto 0);
    signal Sbox1 : integer;
    signal Sbox2 : integer;
    signal tophalf : std_logic_vector(7 downto 0);
    signal secondnibble, firstnibble : std_logic_vector(3 downto 0); --break the LSH into 2 nibbles

  begin
   tophalf(7 downto 0) <= LUTin(15 downto 8);
   secondnibble(3 downto 0) <= LUTin(7 downto 4);
   -- Sbox1 <= to_integer(unsigned(secondnibble));
   firstnibble(3 downto 0) <= LUTin(3 downto 0);
   -- Sbox2 <= to_integer(unsigned(firstnibble));

  p1: process(LUTin)
  begin
  fullout(15 downto 8) <= tophalf(7 downto 0);
  fullout(7 downto 4) <= secondnibble(3 downto 0);
  fullout(3 downto 0) <= firstnibble(3 downto 0);

【问题讨论】:

  • 您的流程敏感度列表缺少流程本身的信号。我建议删除该进程,您不需要它。
  • 对不起,还有更多代码。如果我把这个过程拿出来,它就像你说的那样工作,但我想使用 case 语句使用第二个和第一个半字节来做一个查找表。然后将新的第二个和第一个半字节与上半部分添加到 fullout 以驱动 LUTout 输出端口。当我将 case 语句放回时,它需要重新输入过程,然后完整不会更新
  • 如图所示,Russell 是完全正确的。过程敏感度列表有一个无关的元素 LUT,并且缺少元素 tophalf、secondnibble 和 firstnibble。 VHDL 事件驱动流程执行恢复,您没有关注流程中正在评估的信号上的事件。在 LUT 之后,这些值可能会发生变化。问一个具体的问题。
  • 如果有以下代码

标签: vhdl slice


【解决方案1】:

始终初始化输出。在您的情况下,不清楚输出的是什么,所以这是我的猜测:

architecture xyz of zyx is
    signal fullout : std_logic_vector(15 downto 0) := (others =>'0');
    signal tophalf : std_logic_vector(7 downto 0):= (others =>'0');
    signal secondnibble, firstnibble : std_logic_vector(3 downto 0):= (others =>'0');
    .....
    begin
    ....
    end xyz;

【讨论】:

    猜你喜欢
    • 2012-05-09
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 1970-01-01
    • 1970-01-01
    • 2015-04-29
    相关资源
    最近更新 更多