我想在VHDL中编写一个函数,它给出了std_logic_vector
的前几位并对它们做了一些东西,但似乎我的函数的索引仍然开始计算在整个底部向量。
我可以通过首先将我的矢量分配给临时信号并使用它来解决这个问题,但我担心我不明白这里发生了什么。
有人可以解释为什么a
和b
在下面没有获得相同的输出?
architecture rtl of inds is
function top_bit (c : std_logic_vector) return std_logic is
begin
return c(c'length-1);
end top_bit;
signal temp : std_logic_vector(2 downto 0);
begin
temp <= input(3 downto 1);
a <= top_bit(temp);
b <= top_bit(input(3 downto 1));
end rtl;
如果您向他们提供输入"0100"
,则会获得a='0', b='1'
。
如果您向他们提供输入"1000"
,则会获得a='1', b='0'
。
a=temp(2)=input(3)
和b=input(2)
input("length of c" -1)
。
我认为这没有道理,有人可以为我证明这一点。
编辑:如果您将声明行替换为:
function top_bit (c : std_logic_vector(2 downto 0)) return std_logic is
然后它就像我期待的那样工作。
我认为向量c
从它给出的向量中获取索引。
我希望看到一个函数,它接受一个向量的任意切片并返回该切片的最高位。
答案 0 :(得分:2)
您正在使用'length
属性,您可以使用'high
。我认为这可以满足您的要求。
我在这张桌子的墙上打印了http://www.csee.umbc.edu/portal/help/VHDL/attribute.html,作为可用属性的参考。
答案 1 :(得分:1)
问题是,c'length
返回向量的长度,该长度不一定是有效索引。例如,假设我声明了以下信号:
signal temp : std_logic_vector(7 downto 4);
这会导致调用top_bit
的范围错误。正如您在scary_jeff的回答评论中所述,并非所有向量都是x downto 0
。他们可能是x downto y
。或者他们甚至可以0 to x
或x to y
。假设c'length-1
是最高位,只有c
被声明为std_logic_vector(N-1 downto 0)
(您在答案中发现)。
正如澄清一样。 scary_jeff的回答是正确的方法。但是,您需要解决&#34; top_bit&#34;的含义。如果您获得to
向量,例如:
signal temp : std_logic_vector(4 to 7)
什么是顶级?第4位还是第7位?如果你使用'high
,你会得到第7位。这是最高位吗?如果您希望第4位成为最高位,则需要使用'low
。