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

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

43 minutes ago, Worldmaster said:

Не совсем понял.

VHDL (равно как и Verilog) поддерживает 2 набора операций и конструкций языка - первый набор синтезируемый. С его помощью описывают реальную схему. Второй - не синтезируемый. Он не может использоваться для описания схем, а используется (вместе с 1м набором) для создания верификационных тестов. Ваш 'голый' массив относится ко 2му набору. В схеме его так использовать нельзя.

43 minutes ago, Worldmaster said:

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

К тому, что нельзя передавать массив между модулями - можно только его порты (в виде набора сигналов чтения/записи). А уж где вы этот массив расположите - отдельным модулем или внутри какого то другого модуля, решать вам.

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


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

В 28.06.2023 в 15:00, xvr сказал:

К тому, что нельзя передавать массив между модулями - можно только его порты (в виде набора сигналов чтения/записи).

Ваще туплю. 

Ну вот же у меня есть компонент: 

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
        );

И тут я произвел связывание сигналов  fifo_buffer => fifo_buffer_src,

Я же понимаю что тут не передается по ссылке как в стандартном программировании.

В основной архитектуре я определил переменную signal fifo_buffer_src : DataBuffer; -- общий буфее приимоопередачи

То есть это получается не правильно? Я же потом делаю remap и переназначаю именно сигналы. Или нет??

 

 

В 28.06.2023 в 15:00, xvr сказал:

Он не может использоваться для описания схем, а используется (вместе с 1м набором) для создания верификационных тестов.

То есть вы хотите сказать что я не смогу зашить мой код в чип?? или он там не будет работать??

 

После написания кода у меня есть кнопка Synthesize: И если ее запустить то она пройдет все проверки и скажет что ок.

На фото показал.

 

 

 

unknown.png

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


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

49 minutes ago, Worldmaster said:

То есть это получается не правильно?

Это не хорошо. У вас физическая память и её порты оказались размазаны по 3м модулям. Что из этого сделает синтезатор предсказать трудно. Всё же рекомендуется физические и логические блоки держать на одном уровне иерархии. Это упростит жизнь и синтезатору и в первую очередь вам, как разработчику.

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

52 minutes ago, Worldmaster said:

То есть вы хотите сказать что я не смогу зашить мой код в чип??

Не сможете синтезировать.

52 minutes ago, Worldmaster said:

После написания кода у меня есть кнопка Synthesize: И если ее запустить то она пройдет все проверки и скажет что ок.

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

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


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

В 28.06.2023 в 16:43, xvr сказал:

Это не хорошо. У вас физическая память и её порты оказались размазаны по 3м модулям.

Ну хорошо. А как мне тогда сделать то что я хочу?? 

Я же изначально хотел чтобы этот буфер был исключительно в модуле который осуществляет передачу. 

 

И какие это 3 модуля? 

У меня всего один модуль который имеет у себя буфер:

entity USB_BRIDGE is 

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

 

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

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


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

Давайте так, как для самого начинающего. Не используйте двунаправленные порты внутри дизайна. Только на верхнем уровне. Перепишите ваш модуль так, чтобы вместо двунапревленного было два порта: входной и выходной.

У самой простой памяти всего пять портов: клок, шина адреса, шина данных на  запись, разрешение записи и шина данных на чтение. Вот от этого и танцуйте.

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


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

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

Не используйте двунаправленные порты внутри дизайна.

Вы имеете ввиду чтобы вместо одного 

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

Было два буфера TX RX ??

Типа отправлять с одного а читать потом в другой?? 

 

 

 

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


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

Начните с бумаги и карандаша и ластика. Рисуете схему на бумаге. Потом переносите её на код. Большинство вопросов отпадает уже на этом этапе.

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


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

7 hours ago, Worldmaster said:

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

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

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

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

 

мой Вам совет сделайте : 

Один буфер на прием другой на передачу. Проверьте на симуляции(через написание тестбенча), посмотрите RTL как Ваше описание понял синтезатор (наличие BRAM)

Затем опишете работу двунаправленного порта через FSM например - таким образом получите управление буферами

ниже описание двух портовой памяти - используйте как компонент - обратите внимание память двухклоковая, т.е. писать/читать можно на разных частотах (не забываем про CDC)...

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use IEEE.NUMERIC_STD.ALL;


entity bram_tdp is
generic (
    DATA    : integer := 32;
    ADDR    : integer := 12
);
port (
    -- Port A
    a_clk   : in  std_logic;
    --ena     : in  std_logic;
	 a_wr    : in  std_logic;
    a_addr  : in  std_logic_vector(ADDR-1 downto 0);
    a_din   : in  std_logic_vector(DATA-1 downto 0);
    a_dout  : out std_logic_vector(DATA-1 downto 0);

    -- Port B
    b_clk   : in  std_logic;
	 --enb     : in  std_logic;
    b_wr    : in  std_logic;
    b_addr  : in  std_logic_vector(ADDR-1 downto 0);
    b_din   : in  std_logic_vector(DATA-1 downto 0);
    b_dout  : out std_logic_vector(DATA-1 downto 0)
);
end bram_tdp;

architecture rtl of bram_tdp is
    -- Shared memory
    type mem_type is array ( (2**ADDR)-1 downto 0 ) of std_logic_vector(DATA-1 downto 0);
    
--    FUNCTION initialize_ram  return mem_type is variable result : mem_type;
--	 variable v_TEMP : std_logic_vector(((DATA/2)-1) downto 0);
--    BEGIN
--		v_TEMP := (others => '1');
--		FOR i IN ((2**ADDR)-1) DOWNTO 0 LOOP
--			result(i) := v_TEMP & std_logic_vector( to_unsigned(natural(i), natural'((DATA/2))));
--		END LOOP;
--    RETURN result;
--    END initialize_ram;

    FUNCTION initialize_ram  return mem_type is variable result : mem_type;
    BEGIN
		FOR i IN ((2**ADDR)-1) DOWNTO 0 LOOP
			result(i) := std_logic_vector( to_unsigned(natural(i), natural'((DATA))));
		END LOOP;
    RETURN result;
    END initialize_ram;
    
	 shared variable mem : mem_type := initialize_ram;
--    shared variable mem : mem_type := (others => (others => '0')); -- := initialize_ram;
begin

-- Port A
process(a_clk)
begin
    if(a_clk'event and a_clk='1') then
--       if ena = '1' then
		 if(a_wr='1') then
            mem(conv_integer(a_addr)) := a_din;
        end if;
        a_dout <= mem(conv_integer(a_addr));
--    end if;
	 end if;
end process;

-- Port B
process(b_clk)
begin
   if(b_clk'event and b_clk='1') then
---		  if enb = '1' then	
        if(b_wr='1') then
            mem(conv_integer(b_addr)) := b_din;
        end if;
        b_dout <= mem(conv_integer(b_addr));
--    end if;
	 end if;
end process;

end rtl;

описание двунаправленного порта - используйте как компонент


--
--  The following represents the connectivity of the registered
--    bi-directional I/O example
--                                    ______
--                                   |     |
--                           |-------|D    |
--                           |       |    Q|-----input_signal
--                           | clock_|\    |
--    ________________       |       |/    |
--   / top_level_port \______|       |_____|
--   \________________/      |
--                           |
--                           |     /|
--                           |____/ |____________________
--                                \ |          _____     |
--                      _____     |\|         |     |    |
--                     |     |    |   out_sig-|D   Q|----|
--   output_enable_sig-|D   Q|____|           |     |output_tmp_signal
--                     |     |          clock_|\    |
--               clock_|\    |                |/    |
--                     |/    |                |_____|
--                     |_____|
--
--
--  The following represents the connectivity of the unregistered
--    bi-directional I/O example
--
--                           |----------input_signal
--                           |
--                           |
--    ________________       |
--   / top_level_port \______|
--   \________________/      |
--                           |
--                           |     /|
--                           |____/ |______output_signal
--                                \ |
--                                |\|
--                                |
--                                |---output_enable_signal


library ieee;
use ieee.std_logic_1164.all;
entity top_bi_dir is
	port(T : in std_logic;
		  I : in std_logic;
		  O_NEW : out std_logic;
		  IO : inout std_logic);
end top_bi_dir;

architecture archi of top_bi_dir is
begin

	IO <= I when T = '0' else 'Z';
	O_NEW <= IO;

end archi;

PS смотрели реализацию

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


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

В 28.06.2023 в 17:32, Flip-fl0p сказал:

Начните с бумаги и карандаша и ластика. Рисуете схему на бумаге. Потом переносите её на код. Большинство вопросов отпадает уже на этом этапе.

Что рисовать то? У меня есть диаграмма получения данных с FT. В целом я ее реализовал. Если буфер делать как in то в симуляторе все идеально похоже на то что в даташите. Может даже будет работать и в железе.

До меня не доходит сама физика inout. Какой он блок формирует для него.

 

В 28.06.2023 в 18:32, Maverick_ сказал:

Проверьте на симуляции(через написание тестбенча), посмотрите RTL как Ваше описание понял синтезатор (наличие BRAM)

Затем опишете работу двунаправленного порта через FSM например - таким образом получите управление буферами

А можно по руски для чайников то?? 

Что за тестбенч?? Где его писать??

 

Сейчас я в редакторе GOWIN делаю схему, синтезирую ее, далее гружу в modelsim, назначаю тактирование и с шагом в 100ns смотрю что рисуют графики. 

Где и как смотреть что там получилось в GOWIN я не нашел. Может нужен отдельный софт?? 

 

В 28.06.2023 в 18:32, Maverick_ сказал:

ниже описание двух портовой памяти

Правильно ли я понгял что в результате синтеза компилятор сформирует из вентилей блок памяти??

 

В 28.06.2023 в 18:32, Maverick_ сказал:

PS смотрели реализацию

Смотрел, но тот код который я нашел для меня малопонятен. Он там на verilog и слишком его много. 

 

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


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

11 hours ago, Worldmaster said:

До меня не доходит сама физика inout. Какой он блок формирует для него.

inout можно сделать только на ножках микросхемы. Он формируется в блоке IOB (или как там он у GOWIN называется). Внутри микросхемы никаих inout'ов нет.

11 hours ago, Worldmaster said:

Где и как смотреть что там получилось в GOWIN я не нашел. Может нужен отдельный софт??

Есть там RTL viewer, Technology viewer, Netlist viewer или что-то похожее? F1 нажимать пробовали?

 

Если и дальше будете что-то делать методом тыка, далеко не уедете. Как говорили раньше в этих ваших Интернетах, "читайте доки, они рулез". Сейчас эта максима забыта, а жаль.

 

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


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

15 hours ago, Worldmaster said:

А можно по руски для чайников то?? 

Что за тестбенч?? Где его писать??

Смотрел, но тот код который я нашел для меня малопонятен. Он там на verilog и слишком его много. 

 

про тестбенч и почитайте про Finite state machines

Без моделирования далеко не "уедите" при разработке на FPGA

PS По ссылке я дал описание от производителя думаю оно рабочее и представленное описание формирует правильную циклограмму работы с микросхемой FT601.

 

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


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

19 hours ago, Worldmaster said:

Ну хорошо. А как мне тогда сделать то что я хочу??

Вы не того хотите 🙂 Посмотрите в Gowin  готовые макроблоки (там должно быть что то на эту тему), и найдите там готовое FIFO (2х клоковое). Не надо изобретать велосипед.

19 hours ago, Worldmaster said:

И какие это 3 модуля? 

 

Верхний уровень - сама память, ещё модуль где вы из неё читаете и 3й - где в неё пишете.

Должно быть так - память и процессы чтения и записи в одном модуле, управляющие сигналы и сигналы данных от этих процессов выдаются наружу через порты. Сама память никуда не выдаётся.

Но в вашем случае лучше взять готовое FIFO

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


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

В 29.06.2023 в 11:51, Maverick_ сказал:

Без моделирования далеко не "уедите" при разработке на FPGA

Ну я же для этого modelsim и взял. 

 

В 29.06.2023 в 12:01, xvr сказал:

 Посмотрите в Gowin  готовые макроблоки (там должно быть что то на эту тему), и найдите там готовое FIFO (2х клоковое). Не надо изобретать велосипед.

Там все шифрованое. По крайней мере если самому пилить то лучше понимаешь что к чему. Само по себе вроде бы компилится но совместно с моей архитектурой тут же начинает сыпать ошибками.

 

В 29.06.2023 в 11:51, Maverick_ сказал:

По ссылке я дал описание от производителя думаю оно рабочее и представленное описание формирует правильную циклограмму работы с микросхемой FT601.

Так циклограмма у меня соответствует заявленой производителем. Вопрос то в другом был. Но я вроде бы уже понял.

 

В 29.06.2023 в 08:48, andrew_b сказал:

Есть там RTL viewer, Technology viewer, Netlist viewer или что-то похожее? F1 нажимать пробовали?

F1 в плане помощи чтоли?? Не работает.

Нашел вот Schematic Viewer это он?

 

В 29.06.2023 в 08:48, andrew_b сказал:

Как говорили раньше в этих ваших Интернетах, "читайте доки, они рулез".

Чего вы все такие токсичные? Читаем мы интернеты, даже ChatGPT привлекли. Причем от GPT помощь даже продуктивнее получается. 

В 29.06.2023 в 08:48, andrew_b сказал:

Сейчас эта максима забыта, а жаль.

Мне кажется что пора все форумы прикрывать на корню раз у всех такое отношение. Регистрацию на форумах отменить а для остальных при попытке создать тему сразу футболить на "Давай я поищу в гугл за тебя".

Читаем мы все мануалы, и примеры смотрим но блин если возникает какой то вроде бы достаточно простой вопрос у кого можно уточнить?? Это было бы супер если бы все писали даташиты по примеру Microchip но не все так. Да и для них есть ERRATA то есть даже крутые мужЫки из мега конторы ошибаются и готовые модули могут работать не так как ожидается.

 

 

 

 

 

unknown.png

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


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

43 minutes ago, Worldmaster said:

Там все шифрованое.

Ну и что? Это же не мешает использовать готовые IP блоки в своём дизайне.

44 minutes ago, Worldmaster said:

По крайней мере если самому пилить то лучше понимаешь что к чему.

Можно с учебными целями запились своё FIFO, но в проекте лучше использовать готовое - оно по крайней мере работает 🙂

Кроме того, даже с учебными целями лучше использовать готовое - как минимум поймёте как выглядит более менее стандартный интерфейс FIFO, прежде чем пилить свой велосипед с квадратными колёсами 🙂

 

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


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

В 29.06.2023 в 13:56, Worldmaster сказал:

Ну я же для этого modelsim и взял. 

Вы его как и с чем едите? Гляньте: я в моих последних постах выкладывал полностью проект включая и моделирование: может, что пригодится? 

В 29.06.2023 в 13:56, Worldmaster сказал:

Там все шифрованое.

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

В 29.06.2023 в 13:56, Worldmaster сказал:

По крайней мере если самому пилить то лучше понимаешь что к чему.

Ну вот и я попробовал DPRAM на основе BSRAM попилить - результат пилки найдёте там же

В 29.06.2023 в 13:56, Worldmaster сказал:

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

Выкладывайте проект, как я: вдруг, кто и сподобиться, как для меня, скачать, скомпилировать и своими глазами увидеть, о чём речь?

В 29.06.2023 в 13:56, Worldmaster сказал:

Так циклограмма у меня соответствует заявленой производителем.

А это вы как проверяли? Просто глазами или табличку построили?

В 29.06.2023 в 13:56, Worldmaster сказал:

F1 в плане помощи чтоли?? Не работает.

Там много чего не работает. Или работает не так, как должно.

В 29.06.2023 в 13:56, Worldmaster сказал:

Чего вы все такие токсичные?

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

В 29.06.2023 в 13:56, Worldmaster сказал:

Читаем мы интернеты, даже ChatGPT привлекли

Вот это интересно. Просьба рассказать, как этим пользоваться, ибо давно засматриваюсь. Можно в ЛС. В ЛС можно и даже нужно вообще по любым вопросам - постараюсь помочь, ибо мне тут помогли столько, что считаю себя обязанным благодарить всех помогшим и вернуть сторицей эту помощь другим. Вам, например. Если 
1 вам эта помощь нужна и
2 я смогу её оказать
По п.2. буду стараться

В 29.06.2023 в 13:56, Worldmaster сказал:

Мне кажется что пора все форумы прикрывать на корню раз у всех такое отношение. Регистрацию на форумах отменить а для остальных при попытке создать тему сразу футболить на "Давай я поищу в гугл за тебя".

Мне кажется порою, что солдаты
С кровавых не пришедшие полей ....

В 29.06.2023 в 13:56, Worldmaster сказал:

но блин если возникает какой то вроде бы достаточно простой вопрос у кого можно уточнить??

Выше я ответил, а здесь же выскажусь совокупно: наберитесь терпения, как и IRL, и работайте. Здесь - часть жизни и работы. И это хорошо, что она есть. А расстрелять - это в 37 к товарищу Сталину )

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


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

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

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

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

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

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

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

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

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

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