我想创建一个可变大小的std_logic_vector,比如size = y,交替0和1。
一个简单的解决方案是使用循环或使用时钟周期,但我正在处理的程序将无法使用它。
我基本上看起来像一个看起来像'其他'语句的解决方案,即(其他=>'0')。
任何帮助表示赞赏
答案 0 :(得分:2)
如果你知道你需要创建的所有SLV的最大尺寸,你可以这样做:
...
architecture rtl of my_entity is
constant MAX_SIZE : positive := 32;
constant PATTERN : std_logic_vector(MAX_SIZE-1 downto 0) := X"AAAAAAAA"; -- 10101... in hex
signal my_sig1 : std_logic_vector(15 downto 0);
signal my_sig2 : std_logic_vector(17 downto 0);
begin
...
my_sig1 <= PATTERN(my_sig1'range);
my_sig2 <= PATTERN(18 downto 1); -- phase shift
...
不像其他解决方案那样优雅或灵活,但它的另一个好处是可以通过调整切片范围来改变模式的相位。
答案 1 :(得分:1)
使用生成语句。
signal v : std_logic_vector (y-1 downto 0);
...
for i in v'range generate
v(i) <= '1' when i mod 2 = 1 else '0';
end generate;
答案 2 :(得分:1)
创建矢量的VHDL函数怎么样?
function createVector(size : POSITIVE) return STD_LOGIC_VECTOR is
variable temp : STD_LOGIC_VECTOR(size - 1 downto 0);
begin
for i in 0 to size - 1 loop
if (i mod 2 = 0) then
temp(i) := '0';
else
temp(i) := '1';
end if;
end loop;
return temp;
end function;
-- usage
mysignal <= createVector(12);
它使用模运算符来检查迭代器变量是偶数还是奇数。
答案 3 :(得分:1)
或者将起始值作为函数的参数。
function alternating_ones_and_zeros(length : natural; starts_with : std_logic) return std_logic_vector is
variable ret_val : std_logic_vector(length - 1 downto 0) := (others => starts_with);
begin
for i in length - 2 downto 0 loop
ret_val(i) := not ret_val(i+1);
end loop;
return ret_val;
end function alternating_ones_and_zeros;