VHDL创建一个交替的零和一个

时间:2015-08-10 12:20:07

标签: vhdl


我想创建一个可变大小的std_logic_vector,比如size = y,交替0和1。
一个简单的解决方案是使用循环或使用时钟周期,但我正在处理的程序将无法使用它。
我基本上看起来像一个看起来像'其他'语句的解决方案,即(其他=>'0')。
任何帮助表示赞赏

4 个答案:

答案 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;