2013-04-29 6 views
0

Работает на дискретном косинусном преобразовании с использованием VHDL. Я пытаюсь преобразовать код VHDL из целого в стандартный логический вектор. Я применил некоторые методы, которые я читал в Интернете и из учебников, но это не сработало. Ниже приведен код, который я попробовал преобразовать. Мне хотелось бы, чтобы длина ввода была 8 бит, а длина вывода была 12 бит. Спасибо.дискретное косинусное преобразование с использованием VHDL

entity dct is 
    port (
      Clk :   in BIT; 
      Start :   in BIT; 
      Din :   in INTEGER; 
      Done :   out BIT; 
      Dout :   out INTEGER 
      ); 
end dct;  

architecture behavioral of dct is 
begin 
    process 
      type RF is array (0 to 7, 0 to 7) of INTEGER; 

      variable i, j, k  : INTEGER; 
      variable InBlock  : RF; 
      variable COSBlock  : RF; 
      variable TempBlock  : RF; 
      variable OutBlock  : RF; 
      variable A, B, P, Sum : INTEGER; 

    begin 

Вот один, который я пробовал после чтения некоторых книг, и я продолжаю получать ошибки.

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


entity dct is 
    port (
      Clk :   in std_logic; 
      Start :   in std_logic; 
      Din_temp:  in INTEGER; 
      temp := conv_std_logic_vector(Din_temp, 8); 
      Done :   out std_logic; 
      Dout_temp:  out INTEGER; 
      temp := conv_std_logic_vector(Dout_temp, 9)); 

end dct; 

architecture behavioral of dct is 
begin 
    process 
      type RF is matrix(0 to 7, 0 to 7) of ; 

      variable i, j, k  : std_logic_vector(7 downto 0); 
      variable InBlock  : RF; 
      variable COSBlock  : RF; 
      variable TempBlock  : RF; 
      variable OutBlock  : RF; 
      variable A, B, P, Sum : std_logic_vector(7 downto 0); 

    begin 

ответ

0

кажется, что вы объединили декларацию объекта с назначением сигнала; это не работает так! сохранить объект как есть и использовать функции преобразования типа внутри вашей архитектуры. Приведенный ниже пример показывает, что это для Дина и DOUT:

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

entity dct is 
port (
     Clk :   in BIT; 
     Start :   in BIT; 
     Din :   in INTEGER; 
     Done :   out BIT; 
     Dout :   out INTEGER 
     ); 
end dct;  

architecture behavioral of dct is 
    signal temp_din: std_logic_vector(7 downto 0); 
    signal temp_dout: std_logic_vector(11 downto 0); 

begin 

    temp_din<=std_logic_Vector(to_unsigned(Din,8)); 
    Dout<=to_integer(unsigned(temp_dout)); 
    ... 

конечно, вы можете также использовать std_logic_vector непосредственно в вашей организации:

entity dct is 
port (
     Clk :   in BIT; 
     Start :   in BIT; 
     Din :   in std_logic_Vector(7 downto 0); 
     Done :   out BIT; 
     Dout :   out std_logic_vector(11 downto 0) 
     ); 
end dct;  
0

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

Это хорошая практика, чтобы использовать дальнобойные целые числа: например, если Дин, Dout представляют собой значение в диапазоне от 0 до 255, создать либо новый целочисленный тип или подтип для них:

type Int_8 is new Integer range 0 to 255; -- or 
subtype Int_8 is Integer range 0 to 255; 

(The разница в том, что подтипы могут свободно смешиваться с другими целыми, но случайное смешивание нового типа с целым числом будет помечено компилятором как ошибка).

Преимущество этого в том, что синтез не будет пытаться создать 32-битные математические единицы, где требуется только 8 (или 3 или 19) бит. Обычно он делает, а затем обрезает лишние биты позже, так что он больше не стоит за воротами, он просто наводняет файлы отчетов сообщениями «обрезки избыточной логики» ...

Однако я предполагаю, что проблема заключается в взаимодействии это ядро ​​с другими частями дизайна, выполненное менее просвещенным образом, имеющее порты std_logic_vector.

Затем вы можете реализовать оболочку, чтобы адаптировать это ядро ​​DCT к среде std_logic_vector. Я использовал различные методы для разных сигналов порта: конверсии в картах портов более аккуратные, но некоторые инструменты имеют проблемы (ошибки), обрабатывающие их. Поэтому я использовал внутренние сигналы в качестве адаптеров для Start и Dout, чтобы показать, как вы можете обойти такие проблемы. В действительности, выберите тот или иной!

library IEEE; 
    use IEEE.std_logic_1164.all; 
    use IEEE.numeric_std.all; 

    entity std_lv_dct is 
     port (
       Clk :   in std_logic; 
       Start :   in std_logic; 
       Din :   in std_logic_vector(7 downto 0); 
       Done :   out std_logic; 
       Dout :   out std_logic_vector(11 downto 0); 
       ); 
    end std_lv_dct;  

    architecture wrapper of std_lv_dct is 
     Dout_int : integer range 0 to 4095; 
     Start_int : bit; 
    begin 

    -- internal signals as type adapters 
    Dout  <= std_logic_vector(to_unsigned(Dout_int),11); 
    Start_int <= to_bit(Start); 

    -- direct entity instantiation for the real core 
    Transform : entity work.dct 
     port map(
       Clk => to_bit(Clk), 
       Start => Start_int, 
       Din => to_integer(unsigned(Din)), 
       std_logic(Done) => Done, 
       Dout => Dout_int 
       ); 

    end architecture wrapper;