2015-11-08 2 views
0

У меня есть следующий VHDL код для реализации сумматора, используя структурную архитектуру, поэтому сначала я должен сделать основной сумматор с использованием пакетом numeric_std в два VHD-файлов:структурный сумматор (2 вида) с numeric_std

это adder.vhd

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
use IEEE.NUMERIC_STD.ALL; 

entity adder is 
generic(
       g_width : natural := 32); 
port(
      cin : in std_logic; 
      op1 : in std_logic_vector (g_width-1 downto 0); 
      op2 : in std_logic_vector (g_width-1 downto 0); 
      add : out std_logic_vector (g_width downto 0)); 
end adder; 

, а затем rtl.vhd:

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

architecture rtl of adder is 

begin 

    add <= std_logic_vector(resize(unsigned(op1), g_width+1) + resize(unsigned(op2), g_width+1) + unsigned'(0=>cin)); 
end rtl; 

все это нормально здесь, но тогда я должен сделать еще один сумматор (cpa.vhd, которые имеют архитектуру сумматора с использованием экземпляров нового enitty fa.vhd (который новый файл) так вот код:

fa.vhd:

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
use IEEE.NUMERIC_STD.ALL; 

entity fa is 
port( ope1 : in std_logic; 
     ope2 : in std_logic; 
     cin : in std_logic; 
     cout : out std_logic; 
     sum : out std_logic); 
end entity fa; 

cpa.vhd:

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

architecture cpa of adder is 

component fa is 
port( ope1 : in std_logic; 
     ope2 : in std_logic; 
     cin : in std_logic; 
     cout : out std_logic; 
     sum : out std_logic); 
end component; 
signal carry : std_logic_vector(g_width downto 0); 

begin 

p_cpa : for i in 0 to g_width-1 generate 
    i_fa : fa port map(
          ope1=>op1(i), 
          ope2=>op2(i), 
          cin=>carry(i), 
          sum=>add(i), 
          cout=>carry(i+1)); 
end generate p_cpa; 
end cpa; 

так что проблема в том, что она не работает, когда я запускаю Тб, кажется беззнаковое:

waveform image

Я не знаю, где проблема.

я забыл TB:

library ieee; 

use ieee.std_logic_1164.all; 
use ieee.numeric_std.all; 
use std.textio.all; 

entity tb_adder is 
end tb_adder; 

architecture beh of tb_adder is 
    constant c_width : natural := 32; 
    constant c_upper_bound : natural := (2**16)-1; 
    component adder 
    generic(
     g_width : natural := 16 
    ); 
    port(
     cin : in std_logic; 
     op1 : in std_logic_vector(g_width-1 downto 0); 
     op2 : in std_logic_vector(g_width-1 downto 0); 
     add : out std_logic_vector(g_width downto 0) 
    ); 
    end component; 

-- Inputs 
    signal cin : std_logic; 
    signal op1 : std_logic_vector(c_width-1 downto 0) := (others => '0'); 
    signal op2 : std_logic_vector(c_width-1 downto 0) := (others => '0'); 

-- Outputs 
    signal res  : std_logic_vector(c_width downto 0); 
    signal res_xpct : std_logic_vector(c_width downto 0); 


begin 
--Instance 
    dut : adder generic map (
    g_width => c_width 
    ) 
    port map (
    cin => cin, 
    op1 => op1, 
    op2 => op2, 
    add => res 
    ); 

    cin <= '0'; 

    p_stim : process 
    variable v_i : natural := 0; 
    variable v_j : natural := 0; 
    begin 
    i_loop : for v_i in 0 to c_upper_bound loop 
     j_loop : for v_j in 0 to c_upper_bound loop 
     op1  <= std_logic_vector(to_unsigned(v_i, c_width)); 
     op2  <= std_logic_vector(to_unsigned(v_j, c_width)); 
     res_xpct <= std_logic_vector(to_unsigned(v_i + v_j, c_width+1)); 
     wait for 10 ns; 
     assert res = res_xpct 
      report "Error: wrong operation" 
      severity error; 
     wait for 10 ns; 
     end loop j_loop; 
    end loop i_loop; 
    wait; 
    end process p_stim; 

end beh; 

Спасибо за ваш ответ.

+0

Это не [минимальный, полный и проверенный пример] (http: // stackoverflow.com/help/mcve) без архитектуры для fa, в вашей форме сигналов отображаются все «U» ((«U» - Uninitialized)), что приводит к выводам всех «U», и вы не описали, что вы сделали для решения проблема до сих пор. Как 'adder' порт' cin' вводится в первый 'fa'' cin в 'p_cpa'? Требуется параллельное назначение 'carry (0) <= cin;'. Вам не нужны контекстные предложения, реплицируемые в архитектурах. Покажите свой тестовый стенд. – user1155120

+0

@kriptor, конечно, все сигналы не инициализированы, вы их не инициализировали. Вам нужно создать процесс на тестовом стенде, чтобы генерировать входные данные для логики, которую вы хотите протестировать. – Ian

ответ

0

Так что я написал рабочую fa архитектуру и испытательный стенд, и сделал несколько изменений в cpa архитектуры:

architecture foo of fa is  -- added architecture 
begin 
    sum <= ope1 xor ope2 xor cin; 
    cout <= (ope1 and ope2) or 
      (ope1 and cin) or 
      (ope2 and cin); 
end architecture; 

architecture cpa of adder is 

    component fa is 
     port ( 
      ope1: in std_logic; 
      ope2: in std_logic; 
      cin: in std_logic; 
      cout: out std_logic; 
      sum: out std_logic 
     ); 
    end component; 

    signal carry: std_logic_vector(g_width downto 0); 

begin 
    carry(0) <= cin; -- added hook up the carry in 
p_cpa: 
    for i in 0 to g_width-1 generate 
i_fa: 
    fa 
     port map (
      ope1 => op1(i), 
      ope2 => op2(i), 
      cin => carry(i), 
      sum => add(i), 
      cout => carry(i+1) 
     ); 
    end generate p_cpa; 
    add(g_width) <= carry(g_width); -- added hook up the carry out to the MSB 
end architecture cpa; 

Изменения в cpa архитектуры просто назначить cin к carry(0 и carry(32) к add(32), идея построить сумматор, совместимый с вашей архитектурой rtl;

испытательный стенд упражнения обе архитектуры одновременно:

library ieee; 
use ieee.std_logic_1164.all; 

entity adder_tb is 
end entity; 

architecture foo of adder_tb is 
    constant g_width: natural := 32; 
    signal cin:   std_logic; 
    signal op1:   std_logic_vector (g_width - 1 downto 0); 
    signal op2:   std_logic_vector (g_width - 1 downto 0); 
    signal add_rtl:  std_logic_vector (g_width downto 0); 
    signal add_cpa:  std_logic_vector (g_width downto 0); 
begin 

DUT_rtl: 
    entity work.adder (rtl) 
     generic map (g_width) 
     port map (
      cin => cin, 
      op1 => op1, 
      op2 => op2, 
      add => add_rtl 
     ); 

DUT_cpa: 
    entity work.adder (cpa) 
     generic map (g_width) 
     port map (
      cin => cin, 
      op1 => op1, 
      op2 => op2, 
      add => add_cpa 
     ); 

STIMULUS: 
    process 
    begin 
     wait for 10 ns; 
     cin <= '0'; 
     op1 <= x"feedface"; 
     op2 <= x"deadbeef"; 
     wait for 10 ns; 
     cin <= '1'; 
     wait for 10 ns; 
     wait; 
    end process; 

end architecture; 

И это дает нам:

adder_tb.png

Тот же результат на обоих сумматоров, который говорит нам два изменения, которые я сделал к архитектуре cpa были правильными.

Недостаточно информации в вашем вопросе, чтобы определить, почему входы на вашем сигнале являются «U».

В маленьком испытательном стенде, который я написал, они назначены в процессе STIMULUS.

Мой 64-битный калькулятор программистов сообщает, что результаты верны.

+0

Спасибо, что так много парней !! :) – kriptor

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

  • Нет связанных вопросов^_^