2013-04-08 3 views
-2

Я пытаюсь использовать инструменты xilinx для определения и моделирования 8-разрядного сдвигателя в VHDL, который может сдвигать или поворачивать влево или вправо на 0,1,2 или 3-битные позиции. Я пытаюсь реализовать это на доске digilent basys 2.8 бит shifter -VHDL

Я только начинаю изучать программирование VHDL. Кто-нибудь может помочь? Может ли кто-нибудь показать мне, как должен выглядеть код vhdl?

+2

Звучит как домашнее задание для меня. Добавьте к этому, что есть огромные количества обучающих онлайн. Просто найдите его. – cb88

ответ

3

Функциональность сдвига и поворота можно найти в пакете numeric_std. Ниже приведен пример кода в качестве отправной точки:

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
use IEEE.numeric_std.all; 


entity EXAMPLE is 
Port ( 
    clk : in STD_LOGIC; -- master clock 
    enable : in std_logic; -- when '1' --> rotate 
    dir : in STD_LOGIC; -- when '1': right, when '0': left 
    nr : in STD_LOGIC_VECTOR (1 downto 0); -- number of steps to rotate 
    din : in STD_LOGIC_VECTOR (7 downto 0); -- in vector 
    dout : out STD_LOGIC_VECTOR (7 downto 0)); -- out vector 
end EXAMPLE; 

architecture Behavioral of EXAMPLE is 

begin 

shifter: process(clk) 
begin 
    if rising_edge(clk) then 
     if enable='1' then 
     if dir='0' then -- right 
      dout<=std_logic_vector(rotate_right(unsigned(din),to_integer(unsigned(nr)))); 
     else -- left 
      dout<=std_logic_vector(rotate_left(unsigned(din), to_integer(unsigned(nr)))); 
     end if; 
     end if; 

    end if; 
end process shifter; 
end Behavioral; 
1

Используйте функции, предназначенные для этой цели в ieee.numeric_std library.

Используйте (или литой) свой ввод подходящего типа signed или unsigned.


Вот «прототипы» этих функций, чтобы вы могли видеть, что получаете.

--============================================================================ 
    -- Shift and Rotate Functions 
    --============================================================================ 

    -- Id: S.1 
    function SHIFT_LEFT (ARG: UNSIGNED; COUNT: NATURAL) return UNSIGNED; 
    -- Result subtype: UNSIGNED(ARG'LENGTH-1 downto 0) 
    -- Result: Performs a shift-left on an UNSIGNED vector COUNT times. 
    --   The vacated positions are filled with '0'. 
    --   The COUNT leftmost elements are lost. 

    -- Id: S.2 
    function SHIFT_RIGHT (ARG: UNSIGNED; COUNT: NATURAL) return UNSIGNED; 
    -- Result subtype: UNSIGNED(ARG'LENGTH-1 downto 0) 
    -- Result: Performs a shift-right on an UNSIGNED vector COUNT times. 
    --   The vacated positions are filled with '0'. 
    --   The COUNT rightmost elements are lost. 

    -- Id: S.3 
    function SHIFT_LEFT (ARG: SIGNED; COUNT: NATURAL) return SIGNED; 
    -- Result subtype: SIGNED(ARG'LENGTH-1 downto 0) 
    -- Result: Performs a shift-left on a SIGNED vector COUNT times. 
    --   The vacated positions are filled with '0'. 
    --   The COUNT leftmost elements are lost. 

    -- Id: S.4 
    function SHIFT_RIGHT (ARG: SIGNED; COUNT: NATURAL) return SIGNED; 
    -- Result subtype: SIGNED(ARG'LENGTH-1 downto 0) 
    -- Result: Performs a shift-right on a SIGNED vector COUNT times. 
    --   The vacated positions are filled with the leftmost 
    --   element, ARG'LEFT. The COUNT rightmost elements are lost. 

    --============================================================================ 

    -- Id: S.5 
    function ROTATE_LEFT (ARG: UNSIGNED; COUNT: NATURAL) return UNSIGNED; 
    -- Result subtype: UNSIGNED(ARG'LENGTH-1 downto 0) 
    -- Result: Performs a rotate-left of an UNSIGNED vector COUNT times. 

    -- Id: S.6 
    function ROTATE_RIGHT (ARG: UNSIGNED; COUNT: NATURAL) return UNSIGNED; 
    -- Result subtype: UNSIGNED(ARG'LENGTH-1 downto 0) 
    -- Result: Performs a rotate-right of an UNSIGNED vector COUNT times. 

    -- Id: S.7 
    function ROTATE_LEFT (ARG: SIGNED; COUNT: NATURAL) return SIGNED; 
    -- Result subtype: SIGNED(ARG'LENGTH-1 downto 0) 
    -- Result: Performs a logical rotate-left of a SIGNED 
    --   vector COUNT times. 

    -- Id: S.8 
    function ROTATE_RIGHT (ARG: SIGNED; COUNT: NATURAL) return SIGNED; 
    -- Result subtype: SIGNED(ARG'LENGTH-1 downto 0) 
    -- Result: Performs a logical rotate-right of a SIGNED 
    --   vector COUNT times. 
2

Rotate Right = bitvector(0) & bitvector(7 downto 1); 
 
<br>Rotate Left = bitvector(6 downto 0) & bitvector(7);

Используйте конкатенация другие функции не синтезируют-состоянии.

Смежные вопросы