VHDL Code für Arrays und Arithmetik

Arrays

Im folgenden ein Beispiel für Arrays - hier mit einem Schieberegister, das nach links und rechts schieben, sowie um 2 Stellen nach links rotieren kann.

library ieee;
use ieee.std_logic_1164.all;
 
entity shiftreg is 
  port (
    clk:               in  std_ulogic;
    reset_ni:          in  std_ulogic;
    load_i:            in  std_ulogic;
    shift_right_i:     in  std_ulogic;  -- "11111000" -> "01111100"
    shift_left_i:      in  std_ulogic;  -- "11111000" -> "11110000"
    rotate_left_by2_i: in  std_ulogic;  -- "11111000" -> "11100011"
    data_i:            in  std_ulogic_vector(7 downto 0);
    ser_o:             out std_ulogic   
  );
end; 
 
architecture rtl of shiftreg is
  signal sr     : std_ulogic_vector(7 downto 0);
  signal new_sr : std_ulogic_vector(7 downto 0);
begin 
  seq_p : process (clk_i, reset_ni)
  begin
    if reset_ni = '0' then
      sr <= "00000000";
    elsif rising_edge(clk_i) then 
      sr <= new_sr; 
    end if; 
  end process seq_p;  
 
  comb_p : process(load_i, sr, data_i, shift_left_i, shift_right_i, rotate_left_by2_i)
  begin
    new_sr <= sr;
    if load_i = '1' then
      new_sr <= data_i;
    elsif shift_right_i = '1' then
      new_sr(7) <= '0';
      new_sr(6 downto 0) <= sr(7 downto 1);
    elsif shift_left_i = '1' then
      new_sr <= sr(6 downto 0) & '0';
    elsif rotate_left_by2_i = '1' then
      new_sr <= sr(5 downto 0) & sr(7 downto 6);
    end if; 
  end process comb_p;
 
end architecture;
Signed und Unsigned

Mit dem IEEE numeric.std package können Vektoren auch als Zahlen interpretiert werden. Dies entspricht

use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
 
architecture rtl of compute is
  signal a, b    : std_ulogic_vector(15 downto 0);
  signal u, v, w : signed(15 downto 0);
  signal x, y, z : unsigned(15 downto 0);
begin
 
-- Umwandlung in verschiedene Typen durch Casts
-- Bei diesen Casts entstehen keine Schaltungen. Die Vektoren werden nur anders interpretiert.
u <= signed(a);
x <= unsigned(b);
b <= std_ulogic_vector(y);
 
-- Signed und Unsigned Typen werden Vektoren zugewiesen
u <= "1111000011110000";
x <= "1010101000001111"; 
 
-- Mit Signed und Unsigned Typen kann man rechnen
z <= x + y;
z <= x - y;
z <= x * y; 
z <= x + 13; 
u <= 17 + v;
 
-- Und man kann die Arrays vergleichen. Entweder Array mit Array oder Array mit Integer
 
z <= x when u > v else y;
z <= x when u = v else y;
z <= x when u <= 5 else y;
 
end architecutre;
Integer Zahlen

Es gibt in VHDL auch den Typen integer, der Zahlen darstellt. Mit integer können auch gerechnet und verglichen werden. Integer Zahlen können auch in die Typen signed und unsigned umgewandelt werden

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
 
architecture rtl of compute is
  signal a, b, c : integer range 0 to 230;
  signal u, v, w : signed(7 downto 0);
  signal x, y, z : unsigned(7 downto 0);
begin
 
a <= 5;
b <= a + 3 when c >= 5 else 9;
 
-- Umwandlung von Integer nach Signed und Unsigned
-- Bei der Umwandlung muss man angeben wieviele Elemente der Ausgangsvektor haben soll
x <= to_unsigned(a,8); -- 8 ist die Breite des Arrays x. 
u <= to_signed(a,8);
 
-- Umwandlung von signed, unsigned in integer
a <= to_integer(u);
b <= to_integer(x); 
 
end architecture;