2013-09-13 6 views
1

im довольно новый для языка vhdl, поэтому, пожалуйста, несите меня. Я просто сделал код vhdl для 1 битного сумматора, но у меня возникли проблемы с записью для 4-битного сумматора. Это то, что я получил до сих пор, если кто-нибудь может указать мне в правильном направлении, что посмотреть, что было бы потрясающе!4-битный сумматор в vhdl

код VHDL:

LIBRARY IEEE; 
USE IEEE.STD_LOGIC_1164.ALL; 

ENTITY Adder4 IS 
    GENERIC(CONSTANT N: INTEGER := 4); 
    PORT(
    a, b: IN STD_LOGIC_VECTOR(N-1 DOWNTO 0); -- Input SW[7..4]: a[3..0] inputs, 
               -- SW[3..0]: b[3..0] 
    sum: OUT STD_LOGIC_VECTOR(N-1 DOWNTO 0); -- Output LEDR[3..0] 
    cOut: OUT STD_LOGIC -- Output LEDR[4] 
); 
END Adder4; 

ARCHITECTURE imp OF Adder4 IS 
    COMPONENT Adder1 
    PORT(
    a, b, cIn : in STD_LOGIC; 
    sum, cOut : out STD_LOGIC); 
    END COMPONENT; 
    SIGNAL carry_sig: std_logic_vector(N DOWNTO 0); 
BEGIN 
    -- What to write here? 
END imp; 

ответ

1

Ну, первый вопрос, который мы должны задать, что должно схематическом выглядеть. Возможно, что-то вроде этого:

enter image description here

+0

да, это именно то, что выглядит как LOL. Я знаю кое-что, что мне нужно будет использовать PORT MAPS.Не знаю, как это сказать, потому что нет и/или xor ворот, как 1 бит сумматор. – Shawn

+0

Возможно, это поможет: http://electrosofts.com/vhdl/ –

+0

@shawn Поскольку у вас есть размер порта std_logic_vector, объявленный с использованием общего N, вам нужно будет использовать один или несколько операторов выражений для создания экземпляров Adder1, в то время как Adder4 подразумевает только 4. Если вы могли бы устранить общий N, фиксирующий размеры вектора до 3 до 0, вы могли бы просто создать Adder1 четыре раза, подключая соответствующие входные и выходные данные из портов и carry_sig, как показано на диаграмме диаграммы. См. [VHDL: Создание иерархического дизайна] (http://www.altera.com/support/examples/vhdl/v_hier.html) для примера создания экземпляра с использованием Altera. – user1155120

3

В знак уважения к прекрасному ответу sharth на шанс, что ты намерен иметь N число Adder1s экземплярам в Adder4:

ARCHITECTURE imp OF Adder4 IS 
COMPONENT Adder1 
PORT(
a, b, cIn : in STD_LOGIC; 
sum, cOut : out STD_LOGIC); 
END COMPONENT; 
SIGNAL carry_sig: std_logic_vector(N-1 DOWNTO 0); 
signal carry_in: std_logic_vector(N-1 DOWNTO 0); 
BEGIN 
-- What to write here? 

    carry_in <= ((carry_sig(N-2 downto 0)) &'0'); 
Adders: 
for i in 0 to N-1 generate 
    begin 
    ADD1: 
     Adder1 port map (
      a => a(i), 
      b => b(i), 
      cIn => carry_in(i), 
      sum => sum(i), 
      cOut => carry_sig(i)    
     ); 
    end generate; 

Carry_Out: 
    cOut <= carry_sig(N-1); 

END imp; 

ARCHITECTURE gen OF Adder4 IS 
    COMPONENT Adder1 
    PORT(
     a, b, cIn : in STD_LOGIC; 
     sum, cOut : out STD_LOGIC); 
     END COMPONENT; 

SIGNAL carry_sig: std_logic_vector(N-1 DOWNTO 0); 

BEGIN 
-- What to write here? 

Adders: 
    for i in 0 to N-1 generate 
    ADD0:  
     if i = 0 generate 
     Add1: 
      Adder1 port map (
       a => a(i), 
       b => b(i), 
       cIn => '0', 
       sum => sum(i), 
       cOut => carry_sig(i)    
      ); 
     end generate; 
    ADDN: 
     if i /= 0 generate 
      Add1: 
      Adder1 port map (
       a => a(i), 
       b => b(i), 
       cIn => carry_sig(i-1), 
       sum => sum(i), 
       cOut => carry_sig(i) 
      );   
     end generate; 

    end generate; 

Carry_Out: 
    cOut <= carry_sig(N-1); 

END architecture; 

Я предпочитаю первую архитектуру (им), требуя второй std_logic_vector для carry_in, но значительно упрощая любую конструкцию генерации. Есть разница в иерархии между ними, и сначала легче читать.


Первая архитектура (имп) также показывает, как создать экземпляр Adder1 в четыре раза вручную, устраняя генерировать конструкцию и заменяя все (I) в диапазоне выражения для соответствующих выражений диапазона экземпляра Adder1 ((0), (1) , (2), (3), соответственно).

ручного воплощенный adder1s будет выглядеть примерно так:

-- Note in this case you'd likely declare all the std_logic_vector with 
-- ranges (3 downto 0) 


    SIGNAL carry_sig: std_logic_vector(3 DOWNTO 0); 
    signal carry_in: std_logic_vector(3 downto 0); 
BEGIN 
-- What to write here? 

    carry_in <= ((carry_sig(2 downto 0)) &'0'); 

    ADD0: 
     Adder1 port map (
      a => a(0), 
      b => b(0), 
      cIn => carry_in(0), 
      sum => sum(0), 
      cOut => carry_sig(0)    
     ); 

... 

    ADD3: 
     Adder1 port map (
      a => a(3), 
      b => b(3), 
      cIn => carry_in(3), 
      sum => sum(3), 
      cOut => carry_sig(3)    
     ); 

cOut <= carry_sig(3); -- or connect directly to cOut in ADD3 above 

Дополнительного carry_in вектор с помощью carry_sig регулируется вверх с значащей carry_in «0» позволяет легко писать. Также может быть проще читать, реализуя метод переноса в режиме ожидания, если отдельно вводить и выполнять сигналы.


испытательный стенд может также приспособить ширину N Adder4:

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.numeric_std.all; 

entity adder4_tb is 
     constant N: natural := 4; 
end entity; 

architecture tb of adder4_tb is 
    signal a,b,sum: std_logic_vector (N-1 downto 0); 
    signal carryout: std_logic; 

begin 

DUT: entity work.Adder4 
    generic map (N => N) -- associates formal N with actual N (a constant) 
    port map (
     a => a, 
     b => b, 
     sum => sum, 
     cOut => carryout 
    ); 

STIMULUS: 
    process 
    variable i,j: integer; 
    begin 
     for i in 0 to N*N-1 loop 
      for j in 0 to N*N-1 loop 
       a <= std_logic_vector(to_unsigned(i,N)); 
       b <= std_logic_vector(to_unsigned(j,N)); 
       wait for 10 ns;  -- so we can view waveform display 
      end loop; 
     end loop; 
     wait; -- end the simulation 
    end process; 
end architecture; 

Всего эта без учета нести время задержки дерева, которые могут быть затронуты реализациями или использованием быстрых кэррите схемы (например, нести смотреть вперед).

И это дает нам имитацию, которая выглядит как:

Adder4_tb Simulation Waveform

Или для более детального просмотра:

Adder4_tb Simulation Waveform, closeup

При использовании генерировать заявление архитектуры на основе, если вы изменили объявление из N у вас будет сумматор, который будет синтезировать и моделировать в переменных ширинах, указанных в N до тех пор, пока перенос пульсаций больше не будет работать для скорости входных данных (10 нс в e test bench).

Обратите внимание, что общая ассоциация карт его общего N формального с фактическим N, объявленным в тестовом стенде, означает в этом случае, что заявленное N в тестовом стенде также устанавливает ширину N в Adder4.

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