Перейти к содержанию
    

Вопросы по моделированию VHDL ModelSim

Здравствуйте. Делаю программу для передачи данных через FT601. 

Возникли некоторые вопросы. Буду благодарен всем кто подскажет что тут не так.

В общем к делу:

 

Создал файл package где определил свои типы для проекта.

type DataBuffer is array (0 to MaxUSBBufferLength-1) of std_logic_vector(7 downto 0);

Далее определил буфер и связал его с буфером в компоненте:

signal fifo_buffer_src :DataBuffer; -- общий буфее приимоопередачи

 

Далее в самом коде сделал чтобы при первых 8 тактах буфер заполнялся значениями индекса от 0 до 8.

 

process (GCLK)
begin 
    if rising_edge(GCLK) then
        if CurrentState_src = Complete then
            test_cnt <= 0;
            StartWork_src <= '0'; -- disable transmision
        end if;

        if CurrentState_src = idle then
            if test_cnt >= MaxUSBBufferLength then
                RW_src <= '1'; -- write to bus
                ChannelNum_src <= "00000001";  -- write to channel number 
                StartWork_src <= '1'; -- enable transffr
            else
                --fifo_buffer_src(test_cnt) <= std_logic_vector(to_unsigned( test_cnt, fifo_buffer_src(test_cnt)'length));
                fifo_buffer_src(test_cnt) <= "10101010";
                test_cnt <= test_cnt+1;
            end if;
        end if;
        
    end if;  
end process; 

 

вот блок где происходит заполнение вообще не работает.

Цитата

--fifo_buffer_src(test_cnt) <= std_logic_vector(to_unsigned( test_cnt, fifo_buffer_src(test_cnt)'length));
fifo_buffer_src(test_cnt) <= "10101010";

 

проверяю работу в modelsim. В целом вроде бы отрабатывает так как и задумано но в буфере почему то всегда xx. 

Что я сделал не так то?? Вроде бы все компилится без ошибок.

 

 

Безымянный.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В приведенном коде криминала не видно.

Наличие X (а не U) на шине говорит о конфликте драйверов: на шину выставляются значения из разных мест. Замените std_logic на std_ulogic в определени  DataBuffer и посмотрите, что будет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 28.06.2023 в 08:33, andrew_b сказал:

Наличие X (а не U) на шине говорит о конфликте драйверов: на шину выставляются значения из разных мест.

Да нет у меня такого. Буфер inout но запись я провожу только в  одном месте.

 

В 28.06.2023 в 08:33, andrew_b сказал:

Замените std_logic на std_ulogic в определени  DataBuffer и посмотрите, что будет.

Заменил вот так: 

type DataBuffer is array (0 to MaxUSBBufferLength-1) of std_ulogic_vector(7 downto 0);

Modelsim отказался компилить с ошибкой: "non resolved signal has multiple source"

 

Вот полный код модуля. Заполняю же только один раз.

 

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_unsigned.all;
use IEEE.numeric_std.all;

library work;
use work.types_package.all;

entity top is 
port ( 
    FTDI_CLK: in std_logic;
    led: out std_logic;
    led2: out std_logic;
    btn: in std_logic;

    txe_src : in std_logic;
    rxe_src: in std_logic;
    wr_src: out std_logic;
    BE_src : inout std_logic_vector(3 downto 0);
    DATA_1_src : inout std_logic_vector(7 downto 0);
    DATA_2_src : inout std_logic_vector(7 downto 0);
    DATA_3_src : inout std_logic_vector(7 downto 0);
    DATA_4_src : inout std_logic_vector(7 downto 0)
);
end top;
 

architecture structural of top is
-- компоненты создаются с таким же именем как entity


component OSC
        generic (
            FREQ_DIV: in integer := 100;
            DEVICE: in string := "GW2A-18"
        );
        port (
            OSCOUT: out std_logic
        );
    end component;
-----------------------------------------------------------------------

component Debounce
        port (
            base_clk : in std_logic;
            btn_signal : in std_logic;
            out_signal : out std_logic
        );
    end component;
-----------------------------------------------------------------------

component Blinker
        generic (
            MaxDelay:INTEGER := 50_000_000  --frequency 
        );
        port (
            in_clk : in std_logic; 
            out_signal : out std_logic
        );
    end component;
-----------------------------------------------------------------------

component USB_BRIDGE  
  
        port (    
            in_clk : in std_logic;
            txe_n : in std_logic;
            rxf_n: in std_logic;
            wr_n: out std_logic;
            BE : inout std_logic_vector(3 downto 0);
            DATA_1 : inout std_logic_vector(7 downto 0);
            DATA_2 : inout std_logic_vector(7 downto 0);
            DATA_3 : inout std_logic_vector(7 downto 0);
            DATA_4 : inout std_logic_vector(7 downto 0);

            signal StartWork: std_logic;
            signal fifo_buffer :inout DataBuffer; -- общий буфее приимоопередачи
            signal RW: std_logic; -- чтение или запись
            signal ChannelNum: in std_logic_vector(7 downto 0); -- номер канала
            signal CurrentState: out machine_mode
        );
    end component;

-----------------------------------------------------------------------

signal debounce_out : std_logic;
signal state_out : std_logic;
signal GCLK : std_logic := '0';

-- параметры для пвключения передачи по USB 
signal StartWork_src: std_logic := '0';
signal fifo_buffer_src :DataBuffer; -- общий буфее приимоопередачи
signal RW_src: std_logic := '0'; -- чтение или запись
signal ChannelNum_src:   std_logic_vector(7 downto 0); -- номер канала
signal CurrentState_src:   machine_mode := idle;
signal test_cnt: integer:=0;
-----------------------------------------------------------------------

begin 
osc_inst: OSC
        generic map (
            FREQ_DIV => 2,
            DEVICE => "GW2AR-18"
        )
        port map (
            OSCOUT => GCLK
        );


BUTTON1: Debounce
        port map (
            base_clk => GCLK,
            btn_signal => btn,
            out_signal => debounce_out
        );
 led2 <= debounce_out;

LED1: Blinker
        generic map(
            MaxDelay => 5  
        )
         port map (
            in_clk => GCLK, 
            out_signal => state_out
        );

led <= state_out;
-----------------------------------------------------------------------

USBFIFO: USB_BRIDGE
        port map (
            in_clk => FTDI_CLK,     
            
            txe_n => txe_src,
            rxf_n => rxe_src,
            wr_n  => wr_src,
            BE => BE_src,
            DATA_1 => DATA_1_src,
            DATA_2 => DATA_2_src,
            DATA_3 => DATA_3_src,
            DATA_4 => DATA_4_src,

            StartWork => StartWork_src,
            fifo_buffer => fifo_buffer_src,
            RW => RW_src,
            ChannelNum => ChannelNum_src,
            CurrentState => CurrentState_src
        );


------------------------------------------------------------------------------
-- основннй ппоцесс ддя ооладкииооппавки

process (GCLK)
begin 
    if rising_edge(GCLK) then
        if CurrentState_src = Complete then
            test_cnt <= 0;
            StartWork_src <= '0'; -- disable transmision
        elsif CurrentState_src = idle then
            if test_cnt >= MaxUSBBufferLength then
                RW_src <= '1'; -- write to bus
                ChannelNum_src <= "00000001";  -- write to channel number 
                StartWork_src <= '1'; -- enable transffr
            else
                fifo_buffer_src(test_cnt) <= std_ulogic_vector(to_unsigned( test_cnt, fifo_buffer_src(test_cnt)'length));
                --fifo_buffer_src(test_cnt) <= "10101010";
                test_cnt <= test_cnt+1;
            end if;
        end if;        
    end if;  
end process; 


end architecture;
 

 

Ну точно. Изменил fifo_buffer как in и сразу стал нормально отображать.

Но тогда вопрос. А почему нельзя inout?? Или как правильно использовать inout сигналы?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

замените 

fifo_buffer_src(test_cnt) <= std_ulogic_vector(to_unsigned( test_cnt, fifo_buffer_src(test_cnt)'length));

на 

fifo_buffer_src(test_cnt) <= std_logic_vector(to_unsigned( test_cnt, fifo_buffer_src(test_cnt)'length));

зачем вам тип 

std_ulogic_vector

почему не использовать просто

std_logic_vector  ???

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 28.06.2023 в 09:45, Maverick_ сказал:

зачем вам тип 

Потому что выше было сказано:

В 28.06.2023 в 08:33, andrew_b сказал:

Замените std_logic на std_ulogic в определени  DataBuffer

 

Вот и заменил. Но std_logic_vector не меняет ситуации. Как правильно организовать общий буфер? Если это вообще возможно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

мой совет опишите отдельным компонентом двупортовую память и сделайте логику записи и чтения в буффер. Я б на Вашем месте сделал бы две памяти одна на запись, другая чтение с/в inout порта.

В данном Вашем описании Вы можете писать и читать одновременно потому что у Вас вход inout (можете сделать только вход и думаю все будет симулироваться). опишите корректно получение данных с inout порта. Управления переключения с чтения на запись и наоборот я в Вашем описании не вижу для буффера

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 28.06.2023 в 10:05, Maverick_ сказал:

Управления переключения с чтения на запись и наоборот я в Вашем описании не вижу для буффера

Как это сделать то? Есть пример какой нибудь простенький?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

58 minutes ago, Maverick_ said:

зачем вам тип 

std_ulogic_vector

почему не использовать просто

std_logic_vector  ???

Этот тип не даёт вам выстрелить себе в ногу. Советую узнать, что такое resolution function в VHDL.

@Worldmaster, как, по-вашим ожиданиям, работает порт inout?

 

6 minutes ago, Worldmaster said:

Как это сделать то? Есть пример какой нибудь простенький?

Поиск по форуму по слову inout.

Например:

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 28.06.2023 в 10:38, andrew_b сказал:

@Worldmaster, как, по-вашим ожиданиям, работает порт inout?

у FT601 порт двунаправленный. Если мне нужно считать данные то вначале я отправляю команду на чтение и потом должен считать нужное количество байт.

То есть при чтении буду данные с порта записывать в буфер. 

Если надо отправить то я предварительно в буфер запишу данные и потом при обработке транзакции выставляю команду на запись и отправляю данные из буфера в порт FT.

Это то что хотелось бы. Я в основном мыслю как разработчик С++. Тут наверное есть какие то нюансы. 

 

а при таком подходе: 

PORT ( Read_Write : in std_logic;
      Data_in_out : inout std_logic_vector(2 downto 0);
          Data_in : in std_logic_vector(2 downto 0);
         qata_out : out std_logic_vector(2 downto 0));
END test;

Получается что нужно в 3 раза больше памяти или нет?? 

Или тут логика другая?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 minute ago, Worldmaster said:

у FT601 порт двунаправленный. Если мне нужно считать данные то вначале я отправляю команду на чтение и потом должен считать нужное количество байт.

И у вас тоже порт двунаправленный. Но двунаправленным портом нужно управлять. Когда надо, делать выходом, входом он является всегда.

 

7 minutes ago, Worldmaster said:

Получается что нужно в 3 раза больше памяти или нет??

Непонятно, откуда взялось 3 раза.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 28.06.2023 в 11:08, andrew_b сказал:

Непонятно, откуда взялось 3 раза.

Ну вот же выделено 3 сигнала:

 Data_in_out : inout std_logic_vector(2 downto 0);
          Data_in : in std_logic_vector(2 downto 0);
         qata_out : out std_logic_vector(2 downto 0));

 

Как посмотреть какую схему он создаст из этого?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это просто пример использования двунаправленного порта.

3 minutes ago, Worldmaster said:

Как посмотреть какую схему он создаст из этого?

Отсинтезировать и посмотреть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 28.06.2023 в 11:21, andrew_b сказал:

Отсинтезировать и посмотреть.

У меня GOWIN FPGA Designer что то в нем нет такой функции. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, Worldmaster said:

Если надо отправить то я предварительно в буфер запишу данные и потом при обработке транзакции выставляю команду на запись и отправляю данные из буфера в порт FT.

 

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

В железе память вообще напрямую не доступна - только через порты, которых у неё ограниченное количество и с ограниченными возможностями. (Я сейчас не рассматриваю память, которую синтезатор может сделать на регистрах - у такой может быть практически любое количество портов).

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 28.06.2023 в 13:32, xvr сказал:

Вам это для только симуляции или синтезировать тоже будете?

Не совсем понял. Сейчас я хочу организовать для теста простую пересылку команд на комп и обратно. Ну и может попытаться как то наладить управление ПЛИС со стороны компа.

В 28.06.2023 в 13:32, xvr сказал:

Весь доступ снаружу идет через порты (эти самые сигналы).

Это вы к тому что надо сделать отдельный компонент чтоли?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...