Как реализовать схему в коде VHDL и преобразовать типы данных из std_logic в бит

Я попытался реализовать сумматор, который намного быстрее, чем в среднем RCA. Поэтому я использовал библиотеку XILINX и нашел один простой сумматор adsu8. Я хочу встроить его в мой недавний код VHDL. но поэтому я должен придерживаться типа данных BIT и BIT_VECTOR. Теперь каждый раз, когда я синтезирую, выскакивает куча предупреждений:

: Xst: 2036 - Вставка OBUF в порт>, управляемый черным ящиком. Возможное несоответствие симуляции.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

-- entity of module
entity rca_8bit is
Port ( OP_A : in  BIT_VECTOR (7 downto 0);
       OP_B : in  BIT_VECTOR (7 downto 0);
       ADDSUB : in  BIT;
       SUM : out  BIT_VECTOR (7 downto 0);
          FLAGS : out BIT_VECTOR (4 downto 0));
end rca_8bit;

-- architecture describes behavior of module
architecture behavioral of rca_8bit is
-- sub-module is declared
component adsu8
    port ( A : in  STD_LOGIC_VECTOR (7 downto 0);
             B : in  STD_LOGIC_VECTOR (7 downto 0);
             CI : in BIT;
             S : out  STD_LOGIC_VECTOR (7 downto 0); 
             CO : out  BIT;
             OFL : out BIT);
end component;
-- some code to avoid the blackbox warning message of 
--  component adsu8 which is implemented from schematics  
attribute box_type : string; 
attribute box_type of adsu8 : component is "black_box"; 

-- additional wires std_logic
signal SIG_A,SIG_B,SIG_S : STD_LOGIC_VECTOR (7 downto 0); 

-- additional wires bit
signal  SIG_SUM : BIT_VECTOR (7 downto 0);
signal  SIG_FLAGS :  BIT_VECTOR (4 downto 0);
signal  SIG_CO,SIG_OFL : BIT;


begin
-- instantiate and do port map
AS8 : adsu8 port map (SIG_A,SIG_B,ADDSUB,SIG_S,SIG_CO,SIG_OFL);

-- convert and forward std_logic to bit
SIG_A <= to_stdlogicvector(OP_A);
SIG_B <= to_stdlogicvector(OP_B);
SIG_SUM <= to_bitvector(SIG_S);

-- assign result
SUM <= SIG_SUM;
-- generate flags
SIG_FLAGS(0) <= SIG_SUM(7) xor SIG_FLAGS(1);            -- S (N xor V)
SIG_FLAGS(1) <= SIG_OFL;                                -- V
SIG_FLAGS(2) <= SIG_SUM(7);                             -- N (MSB = 0)
SIG_FLAGS(3) <= '1' when SIG_SUM = "00000000" else '0'; -- Z
SIG_FLAGS(4) <= SIG_CO;                                 -- C
-- assign flags
FLAGS <= SIG_FLAGS;

end behavioral;

Я не так опытен в VHDL, но и не так уж и менее. Но эта проблема смущает меня и вызывает головную боль. Я благодарен за любое решение или информацию в правильном направлении.

Спасибо заранее и наилучшими пожеланиями

Tobi

1 ответ

В VHDL можно определить функции для преобразования из одного типа в другой. например, чтобы конвертировать std_logic в bit Вы можете написать эту функцию:

function std_logic_to_bit(t : std_logic) return bit is
    variable b : bit;

begin

    if (t = '1') then
        b := '1';
    else
        b := '0';
    end if;

    return b;
end;

конечно, можно написать также функцию, которая преобразует из std_logic в bit:

function bit_to_std_logic(t : bit) return std_logic is
    variable s : std_logic;

begin

    if (t = '1') then
        s := '1';
    else
        s := '0';
    end if;

    return s;
end function;

Это "фиктивные" функции, но они необходимы в VHDL, потому что без функций невозможно преобразовать один тип в другой.

Я надеюсь, что я помог.

Другие вопросы по тегам