提问人:sebi707 提问时间:6/21/2018 更新时间:6/28/2018 访问量:865
与方向无关的切片
Direction independent slicing
问:
我正在创建一个包含我经常使用的一些函数的包,并且某些函数需要对其参数进行切片。我通常对所有信号都使用方向,但有时信号会意外地改变方向,例如,附加零位 () 似乎会将方向更改为正。downto
sig & '0'
有没有办法对数组 (, , ) 进行独立于其方向的切片?例如,您将如何实现一个采用最低两位的函数?我想出的唯一实现使用了一个具有预期方向的附加常量:std_logic_vector
unsigned
signed
function take_two(x : std_logic_vector) return std_logic_vector is
constant cx : std_logic_vector(x'length-1 downto 0) := x;
begin
return cx(1 downto 0);
end function;
我也尝试过类似的东西,但 Quartus 不喜欢这样。x(x'low+1 downto x'low)
答:
0赞
JHBonarius
6/28/2018
#1
问题实际上不在于输入,而在于所需的输出。你喜欢什么?
如果你看一下函数是如何实现的,例如std_logic_1164-body.vhdl
,你的函数同样是这样的(在一个完整的例子中):
entity e is end entity;
library ieee;
architecture a of e is
use ieee.std_logic_1164.all;
signal test : std_logic_vector(7 downto 0) := "10010110";
signal output : std_logic_vector(2 downto 0);
function slice(s: STD_LOGIC_VECTOR; u, l : natural) return STD_LOGIC_VECTOR is
alias sv : STD_LOGIC_VECTOR (s'length-1 downto 0) is s;
variable result : STD_LOGIC_VECTOR (u downto l);
begin
for i in result'range loop
result(i) := sv(i);
end loop;
return result;
end function;
begin
output <= slice(test & '0', 5, 3); -- test becomes 'to' range.
-- output still becomes "101"
end architecture;
评论
alias
constant
(sig & '0')
'left
'right
'low
'high
'ascending
'reverse_range