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

slkhome

Свой
  • Постов

    93
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные slkhome


  1. On 5/13/2022 at 5:16 PM, Flip-fl0p said:

    Подставил указанну строчку в *.ini и ничего не изменилось в выводе, вообще! 

    Подставил и в локальный и в глобальный *.ini - ничего.

    В чем может быть проблема?

  2. Короткие имена модулей.

    Короткие пути, без лишнего вложения. Можно проекты размесить в на виртуальном диске, почти в корне. Для винды использую команду: subst z: <path_to_sources>. При этом физически это все может лежать где угодно.

    Хранить в репозитории только исходники. Создать грамотный .gitignore.

     

     

  3. On 4/12/2022 at 3:09 PM, alexPec said:

    Всем доброго дня.

    Надо стало установить вивадо 2020.1. Перетащил простой тестовый проект с вивадо 2018.2 (по сути только mpsoc и память к нему lpddr4). Скомпилировал, получил bit-файл. Открываю hardware manager, тыкаю Program device - а он говорит PL is OFF, запрограммировать не могу. Тут же в виваде 2018.2 делаю абсолютно то же самое - все программируется. После программирования статус PL меняется на "Programmed".

    Какую галочку где не поставил?

    Саму ПЛИС находит вообще, hardware manager?

    Скиньте скрин окошка hw managera. Посмотрим чего к чему.

  4. На сколько помню, вродебы была такая проблема, что если установить Quartus, то программировать уже из под MaxPlus не получалось.

    Вот еще статейка, может поможет

    https://marsohod.org/home/index.php?option=com_content&view=article&id=90:bblpt&catid=11&Itemid=26

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

    Какие ошибки вываливаются? Опиши подробнее что происходит.

  6. Если тактовой частоты отдельно не передается:

    Как вариант, гнать в канале все время какую-нибудь случайную проследовательность, по которой подстраивать тактовую частоту приемника. И по ней уже принимать данные. 

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

    Подробности расскажете? Какая ПЛИС? Описание интерфейса? Протокола?

  7. На сколько понял, Вашу задачу - я бы завел некоторое количество счетчиков, которые бы следили за фактичеким состоянием буфера. Что-то вроде как в FIFO. А сам массив завел сразу достаточно большим, с учетом максимально возможной загрузки.

  8. Делал такой тестовый компонент для считывания кадра из файла и дальнейшей передачей для обработки в RTL:

    entity video_generator_f is 
      generic (
        --default BIN file for XGA mode
        TEST_IMAGE_BIN_FILE : string := "./test-image/test-image-1024-768.bin";       
        C_FRAMES_NUMBER : natural := 8;     --number of frames to generate
        C_TCO_delay : time := 1 ns;         --Time Clock to Output
        
        --Default values (VESA XGA mode)
        G_CLOCK_PERIOD    : time := 15.38 ns; --65 MHZ pixels clock
        G_H_ACTIVE        : integer := 1024;  -- pixels    
        G_H_SYNCH_WIDTH   : integer := 136;   -- Width, pixels
        G_H_TOTAL_WIDTH   : integer := 1344;  -- pixels    
        G_H_BACK_PORCH    : integer := 160;   -- pixels
        G_H_FRONT_PORCH   : integer := 24;    -- pixels
    
        G_V_ACTIVE        : integer := 768;   -- lines  
        G_V_SYNCH_WIDTH   : integer := 6;     -- lines      
        G_V_TOTAL_WIDTH   : integer := 806;   -- lines  
        G_V_BACK_PORCH    : integer := 29;    -- lines  
        G_V_FRONT_PORCH   : integer := 3      -- lines
      );
      port
      (
        signal VCLK  : out std_logic;
        signal R     : out std_logic_vector (7 downto 0);
        signal G     : out std_logic_vector (7 downto 0);
        signal B     : out std_logic_vector (7 downto 0);
        signal VSYNC : out std_logic;
        signal HSYNC : out std_logic;
        signal DE    : out std_logic
      );
    end entity video_generator_f;

     

  9. Мой опыт:

    Курили  RFC, Wiki, КиТ, Electronix

    1. Взяли корку с OpenCores Ethernet, допилили под себя (чистый Verilog)

    2. Сделали разбор ip4 (чистый Verilog)

    3. Сделали разбор UDP (чистый Verilog)

    4. Реализовали ARP ответы, таблицу (чистый Verilog)

    5. Подняли буфер на несколько (не помню на столько точно) пакетов, по приоритетам, арбитраж (чистый Verilog)

    Конечная цель железки ретрансляция пакетов UDP с подменой MAC, IP согласно заложенной конфигурации. Сама конфигурация прилетала в конфигурационном UDP пакете.

    Spartan-6

    Если актуально, пишите в личку. 

    Могу скинуть все или часть исходников, если не найдется противопоказаний.

  10. Помниться, такая трудность была. Она решаема! На данный момент уже давно с этим работа, поэтому подзабыл детали. Как вспомню решение, отпишусь. Для начала попробуйте сделать следующее, если поймете что я имею в виду:

    1 Проверить возможность записи в любую ячейку памяти из под отладчика (вероятно это у вас получается, судя по тому что написали выше вы)

    2 Проверить положение галочки "eNVM", на сколько я помню, в конфигураторе ядра памяти или вообще самого ядра процессора в Либеро. Возможно это выбор места, откуда должна стартовать программа ядра процессора. Не помню точно. На сколько вспомитается, это можно сделать и из под отладчика. Т.е. установить нужные биты в конфиг регистрах, и вызвать сброс только проц. ядра.

    3. Проверить куда смаплена ваша ДДР, и куда смаплен старт, т.е. физически как память была скажем на адресе 0хА0000000, так там и состанется, но этот адрес можно смапить на адрес 0х00000000. Т.е. адреса разные, а физичеки будет доступ к одному и тому же.

    4 Проверить, загрузилась ли программа вообще в ДДР.

    5 Возможно после всех этих манипуляций, придется загрузить программу в ДДР, и вызвать сброс проц. ядра, без сброса всей микросхемы SM2.

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

    Еще были какие-то танцы с бубнами с линкерскриптом. Т.е. пришлось ручками править чего-то в линкере, чтобы все работало как хочется. В автомате он генерирует не корректно.

    Не судите строго, воспоминания обрывочные.

    Написал только потому, что в свое время было очень мало информации по SM2. Приходилось много экспериментировать.

  11. В общем все получилось!!! Поставил по 2 триггера по входу внешних сигналов (miso и miosio), по котрым есть некоторые переходы, и подравил немного автомат, чтобы учесть эти триггеры, и все заработало стабильно! Спасибо всем большое!

     

    Более того если вы не поставите галочку создавать безопасный автомат, то ваше default состояние будет упразднено оптимизатором, во всяком случае в ISE об этом честно написано.

    Как называется этот пункт с этой галочкой?

  12. if (miso = '0') then

    next_state <= s21;

     

    спокойно можете попасть куда угодно проскочив 21 состояние, потому что в тот момент когда вы должны были перейти в 21 состояние, вы можете перейти в любое. Для этого достаточно сигналу мисо стать 0 поближе к клоку и все...

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

    process(cur_state, rdy, miso, miosio)

    begin

     

    next_state <= cur_state;

     

    и

     

    if rising_edge(clk) then

    ....

    elsif ce = '1' then

    ----------

    cur_state <= next_state;

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

  13. Обычное дело. Если входной сигнал имеет пологие фронты или дребезг на фронтах, то автомат их чудесно сожрет...

    Все дело в том, что за "Лет 15 работаю с этими девайсами" ПЛИСы стали на порядок быстрее. И то, что раньше не воспринималось, то теперь прекрасно ловится...

    Смотрите, какие сигналы дают лишние переходы и их фильтруйте небольшим цифровым фильторм...

    В том то и дело, что по внешним сигналам КА может перейти дальше по порядку состояний и дойти до проверки сигнала rdy, который синхронный, и по внутренним синхронным сигналам (rdy) он всеравно должен пойти по порядку, т.е. проскочить проверку сигнала rdy он не может ни как, но это происходит (наприме состояния s21 и s22, в которых проверяется только сигнал rdy, синхронный, внутренний сигнал ПЛИС).

  14. я чего-то не понимаю, у вас смена состояний автомат асинхронная что ли, по изменению входных сигналов?

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

     

    Я бы все же состояние s31 явно бы описал.

    А входные rdy, miosio, miso у Вас асинхронные относительно clk?

    Вообще описывал s31 и явно и так как в коде указано, но разницы никакой! Тем более что в вышенаписанных постах рекомендовали использовать и дефолтное условие.

    А вот сигналы miosio и miso действительно асинхронные - приходят с наружи от внешней микрухи. Сигнал rdy синхронный, приходит от интерфейсного блочка (компонента), так же написанного на VHDL и прикрученного между этим автоматом и внешней микрухой.

     

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

    Автомат синхронный по сигралу clk, да еще есть и сигнал се.

     

    Так до сих пор и не разобрались? Обаме бы ваши проблемы... :08:

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

     

    не внимательно читаете код, автомат не асинхронный.

     

    Автор использует классическое двухпроцессное описание КА (один процесс регистровая логика, второй комбинационная), правда он еще слишком явно добавил аналог сигнала clock_enable в регистровую часть.

     

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

    Вообще, года 2 назад, когда это все было написано и применялось в первый раз, все было замечательно. Да и сейчас вся информация по интерфейсу передается без искажений, т.е. корректно вырабатываются ЧИП селект, клоки и данные под них для микросхемы ФТДИ, вот только некоторые байты повторяются по нескольку раз, либо выпадают. Т.е. КА перескакивает некотроые состояния напроч, совершенно в хаотичном порядке, или вообще влетает в какие-то левые состояния и виснет.

    Написал достаточно много констрейнтов, и авомат стал работать стабильнее - пересатл влетать в неописанные, видимо, состояния, но среди описанных состояний перескакивает всеравно! Что делать вообще ума не приложу.

    Описывал этот автомат и через CASE и IF Then - результат один. А без таких простеньких КА более менее законченные не тривиальные устройства не сделать! Всетаки вдимо Абама тут приложился. Да и самое страшное что результат один - независимо от того Альтера это или Ксилинкс. Лет 15 работаю с этими девайсами - а с такой фигней встретился впервые!

    Может у кого еще есть какие-нибудь мысли этот счет?? Прошу поделитесь!

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

     

    Этот конечный автомат моделируется идельно, но когда загружую в ПЛИС - иногда влетает не в те состояния, которые были задуманы по поряюку работы. Анализатор максимальной частоты говорит что автомат может работать на частотах даже выше 300 МГц, но реально хоть на 80 хоть на 40 МГц работает со сбоями, и для примера, может из состояния S22 перепрыгнуть в состояние S2, а не в S3. Все это безобразие котролирую на осциллографе по выходным сигналам автомата.

    Меняю стратегию компилятора, меняется немного стабильность работы, но лиш меняется комбинации неправильных переходов. Констрейнты на клоки выполняются. Пробовал и в Ква и ИСЕ, поведение примерно одинаково - есть неожиданные переходы.

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

     

    ----------------------------------------------------------------------------------
    --
    --
    -- Машина состояний для работы с модулем FTDI
    --
    --
    ----------------------------------------------------------------------------------
    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    use IEEE.STD_LOGIC_ARITH.ALL;
    
    
    entity sm_ft1248_to_modem_f is
    generic (
    			CMD_WR			: std_logic_vector(7 downto 0)  := "01101001"; 
    			CMD_RD			: std_logic_vector(7 downto 0)  := "01101011";
    			CMD_RD_MOD_ST	: std_logic_vector(7 downto 0)  := "01101101";
    			CMD_WR_MOD_ST	: std_logic_vector(7 downto 0)  := "01101111";
    			CMD_RD_USB_ST	: std_logic_vector(7 downto 0)  := "11101001"
    		);
    Port ( 
    		-- INPUTS
    			clk			: in  STD_LOGIC := '0';	-- 
    			ce			: in  STD_LOGIC := '0';	-- 
    			sclr		: in  std_logic := '0';		-- 
    			clk_en		: in  STD_LOGIC := '0';	--
    			rdy			: in  STD_LOGIC := '0';	-- 
    			miosio		: in  STD_LOGIC := '0';	-- 
    			miso		: in  STD_LOGIC := '0';	-- 
    	   -- OUTPUTS
    			cmd				: out  STD_LOGIC_VECTOR (7 downto 0);	-- команда для передачи модулю FTDI
    			wr_rd			: out  STD_LOGIC;	-- чтения или записи 0 записи 1 чтерия
    			valid			: out  STD_LOGIC;	-- начала транзакции
    
    		-- TESTES
    		-- OUTPUT
    			test		: out STD_LOGIC_VECTOR (7 downto 0)			-- составной (композитный) сигнал для тестов
    	);
    end sm_ft1248_to_modem_f;
    
    architecture Behavioral of sm_ft1248_to_modem_f is
    
    
    
    type state_type is (s1, s2, s21, s22, s3, s31); -- , s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16);
    signal cur_state			: state_type; -- текущие состояния
    signal next_state			: state_type; -- следующие состояния
    
    signal N_wr_rd				: std_logic; -- следующее состояние сигнала 1 записи 0 чтерия
    signal rg_wr_rd				: std_logic; -- текущее состояние сигнала
    
    signal N_valid				: std_logic; -- следующее состояние сигнала
    signal rg_valid				: std_logic; -- текущее состояние сигнала
    
    signal N_cmd				: STD_LOGIC_VECTOR (7 downto 0); -- следующее состояние сигнала
    signal rg_cmd				: STD_LOGIC_VECTOR (7 downto 0); -- текущее состояние сигнала
    signal EN_cmd				: std_logic; -- сигнал разрешения изменения значение команды
    
    signal N_test				: STD_LOGIC_VECTOR (7 downto 0); -- следующее состояние порта
    signal rg_test				: STD_LOGIC_VECTOR (7 downto 0); -- текущее состояние порта
    
    attribute syn_encoding				  : string;
    attribute syn_encoding of state_type : type is "SEQUENTIAL"; -- SEQUENTIAL ONE-HOT JOHNSON GRAY COMPACT
    begin
    
    
    --------------------------------------------------------------
    ---======= 	смена текущего состояния с.машины
    --------------------------------------------------------------
    process(clk, sclr, next_state, N_valid, N_test, cur_state, rg_valid, rg_test)
    begin
    	if rising_edge(clk) then
    		if sclr = '1' then
    		----------
    			cur_state <= s1;
    			rg_valid <= '0';
    			rg_wr_rd <= '0';
    			rg_test <= (others => '0');
    			rg_cmd <= (others => '0');
    		----------
    		elsif ce = '1' then
    		----------
    			cur_state <= next_state;
    			---------------
    			rg_valid <= N_valid;
    			---------------
    			---------------	
    			rg_test <= N_test;
    			---------------	
    			if EN_cmd = '1' then
    				rg_cmd <= N_cmd;
    				rg_wr_rd <= N_wr_rd;
    			else
    				rg_cmd <= rg_cmd;
    				rg_wr_rd <= rg_wr_rd;
    			end if;					
    		----------
    		else
    		----------
    			cur_state <= cur_state;
    			---------------
    			rg_valid <= rg_valid;
    			---------------	
    			rg_wr_rd <= rg_wr_rd;
    			---------------	
    			rg_test <= rg_test;
    			---------------	
    			rg_cmd <= rg_cmd;
    		----------
    		end if;
    	end if;
    end process;
    --============================================================
    --============================================================
    
    
    --------------------------------------------------------------
    ---======= 	выбор нового состояния
    --------------------------------------------------------------
    process(cur_state, rdy, miso, miosio)
    begin
    
    	next_state <= cur_state;
    
    	case cur_state is
    		when s1 => 					-- 
    
    			if (rdy = '1') then
    				next_state <= s2;
    			end if;
    		when s2 =>
    
    			if (miso = '0') then		-- 
    				-------------------
    				next_state <= s21;		-- 
    			end if;
    
    		when s21 => 					-- 
    
    			if (rdy = '0') then
    				next_state <= s22;
    			end if;
    
    		when s22 => 					-- 
    
    			if (rdy = '1') then
    				next_state <= s3;
    			end if;
    
    		when s3 =>
    
    			if (miosio = '0') then  --
    				---------------------
    				next_state <= s31;
    			end if;
    
    		when others => 					--
    
    			if (rdy = '0') then
    				next_state <= s1;
    			end if;
    	end case;
    end process;
    
    --============================================================
    --============================================================
    
    
    --------------------------------------------------------------
    ---======= 	формирование выходных сигналов
    --------------------------------------------------------------
    process(cur_state, rdy, miso, miosio, rg_cmd, rg_test)
    begin
    
    	if cur_state = s2 and (miso = '0') then		-- 
    		-------------------
    		EN_cmd <= '1';
    		N_cmd <= CMD_RD;
    		N_wr_rd <= '1';
    		N_valid <= '1';
    
    	elsif cur_state = s3 and miosio = '0' then
    
    		EN_cmd <= '1';
    		N_cmd <= CMD_WR;
    		N_wr_rd <= '0';
    		N_valid <= '1';
    
    	else
    
    		N_valid <= '0';
    		N_wr_rd <= rg_wr_rd;
    		EN_cmd <= '0';
    		N_cmd <= rg_cmd; --
    
    	end if;
    
    end process;
    
    --============================================================
    --============================================================
    
    
    --------------------------------------------------------------
    ---======= 	выходы
    --------------------------------------------------------------
    
    
    wr_rd <= rg_wr_rd;
    
    valid <= rg_valid;
    
    cmd <= rg_cmd;
    
    test <= rg_test;
    
    --============================================================
    --============================================================
    
    
    end Behavioral;

  16. Там в DSP Builder есть такая функция - вставить HDL код, но потом всеравно порт назначается через вставление стандартного порта Билдера. А в перечне портов есть только входы или выходы, двунаправленных портов нет. И когда назначаешь к модулю с двунаправленным портом порт Билдера, он генерит код для компиляции, вставляет между модулем и пином компонент, у котого есть вход и выход, а внутри компонента они просто соединены. И получается в итоге пин с 3-м состоянием, но без обратного входного свойства.

    В итоге пока решения так и не нашел.

    У кого-нибудь получалось вообще чего-нибудь подобное делать в Симулинке?

  17. Прикинул несколько вариантов.

    Первый вариант - использовать 2 порта. 1 - как выход с третьим состоянием, 2 - как вход. В этом случае придется использовать 2 шара на плисине, которые будут соединяться по печати и совместно идти к внешнему устройству.

     

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

     

    Третий вариант - вставлять проект первого варианта как модуль в проект в Ква и уже там добавлять буфер с 3-мя состояниями. Но так подозреваю тоже будет не удобно сильно.

     

    Лично для меня самый простой пока вариант - первый.

     

    Но неужели нет других вариантов? Более удобных и простых.

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