Как назначить данные для внутреннего порта ввода - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть FPGA, пытающаяся читать / записывать значения в SDRAM на том же чипе.То, что SDRAM видит как IN, верхний уровень видит как OUT и так далее.«Пути» SDRAM создаются и выводятся на верхний уровень.Эти пути не имеют направления.Тем не менее, я знаю, что верхний уровень читает и пишет в SDRAM.Я попробовал вариант показанного кода, и он скомпилирован.Приведенный ниже код является примером для передачи двух значений в SDRAM и считывания третьего значения.Я назначил направление для дорожек.Правильна ли моя логика в том, что она отправляет два значения и получает третье?

use IEEE.STD_LOGIC_UNSIGNED.ALL;- см. стр. 36 схемотехнического проекта с VHDL

port(
    -- ---------------------------------------------------------------------
    -- Global signals ------------------------------------------------------

    CLK   : in std_logic;
    RESET : in std_logic;

      A       : out std_logic_vector(15 downto 0);
      B       : out std_logic_vector(15 downto 0);
      C       : in  std_logic_vector(15 downto 0);

конечным объектом sigma_k_top;

архитектура rtl для function_top равна

signal cntr     : std_logic_vector(31 downto 0);
signal sig_A    : std_logic_vector(15 downto 0);
signal sig_B        : std_logic_vector(15 downto 0);
signal sig_C        : std_logic_vector(15 downto 0);

begin

sdram_inst : entity work.sdram

port map (
    CLK               => sdram_CLK_in, --CLK shared by all
    A                 => sdram_A_in, -- Write to sdram
    B                 => sdram_B_in,--  Write to sdram
    C                 => sdram_C_out, --Read from sdram
);

 transfer: process(CLK)
 begin
    IF rising_edge(CLK) then
        cntr <= cntr + 1;
        if cntr = 1000 then -- 
            sig_A  <= "1000000000000000";
            sig_B  <= "1000000000000000";
        end if;             

        if cntr = 1001 then
            if  C(0) = '1' then
                sig_A  <= sig_A - 1; -- Writing 
                sig_B  <= sig_B + 1; -- Writing
                xfer   <= C ;        -- Reading 
            end if;
        end if;
        if cntr > 2000 then
            cntr <= (others => '0');
        end if;

    END IF;

 end process;

-- -------------------------------------------------------------------------
-- Top-level ports ---------------------------------------------------------


 TEST_LED(7 downto 0)   <= xfer(7 downto 0); -- Making some sdram output visible
 A <= sig_A; -- Sending value to sdram
 B <= sig_B; -- Sending value to sdram

конец архитектуры RTL;

1 Ответ

0 голосов
/ 13 апреля 2019

Какие входы и выходы существуют в / из ОЗУ, могут различаться в зависимости от того, как вы собираетесь их использовать. Если ОЗУ действительно существует на самом чипе ПЛИС, примером может быть то, что вы хотите использовать простую однопортовую ОЗУ, например, в компоненте библиотеки ОЗУ блока Xilinx.

Как видно из кода, что sdram инстанцируется под верхним уровнем FPGA (ОЗУ содержится в чипе fpga), кажется, что входы / выходы ОЗУ также должны быть входами / выходами верхнего уровня , Было бы наоборот, если бы sdram находились вне ПЛИС (и, следовательно, вне верхнего уровня ПЛИС)

Как правило, ОЗУ, как правило, представляют собой последовательные элементы, требующие как минимум:

-Часы (обычно сигнал шириной 1 бит)

-Адрес (как правило, имеет ширину log2 (n) бит, где n - размер массива ОЗУ. Поэтому, если массив состоит из 64 элементов, вам потребуется как минимум 6 бит для адресации всего. Тот же адрес Сигнал может использоваться как для чтения, так и для записи, или, возможно, у вас будет 2 отдельных адресных сигнала.)

-A разрешение записи (в самом простом из это может быть 1-битный сигнал. Наиболее типичным использованием будет утверждение этого сигнала за 1 такт, чтобы обновить данные по текущему адресу адресного сигнала)

-data (ширина может варьироваться и может быть гибкой / настраиваемой на ПЛИС. Если вы хотите хранить 16-битные данные в каждой записи ОЗУ, которая должна быть абсолютно корректной. Это может быть один сигнал или 2 отдельных для чтения и записи данных).

Пока векторы сигналов, идущие в / из ОЗУ, имеют хотя бы эти базовые функции, кажется, что вы должны иметь возможность использовать его как минимум в качестве простой ОЗУ. Обратите внимание на то, что в вашем коде сигналы sdram_ * не объявлены и не связаны ни с чем, кроме самого экземпляра sdram.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...