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

Maverick_

Модератор
  • Постов

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

Весь контент Maverick_


  1. Добрый день мне стыдно обращаться с таким простым вопросом... но я что то не могу понять. Пишу тестбенч (во вложении). Там есть процесс process (all) begin if (rst = '1') then reg_eof <= '0'; reg_eof1 <= '0'; elsif (clk'event and clk = '1') then if reg_cnt_data = std_logic_vector(to_unsigned((num_row_file), reg_cnt_data'length)) then reg_eof <= '1'; else reg_eof <= '0'; end if; if reg_cnt_data = std_logic_vector(to_unsigned((num_row_file-1), reg_cnt_data'length)) then reg_eof1 <= '1'; else reg_eof1 <= '0'; end if; end if; end process; Почему reg_eof1 занимает 2 такта, а reg_eof - 1 такт. ??? Не могу понять. Прошу помощи indata.txt top_vhd_tst_file.vhd
  2. Добрый день всем Натолкнулся на относительно простой алгоритм сжатия картинок. https://phoboslab.org/log/2021/12/qoi-specification В реализации на fpga тоже относительно прост...
  3. Можно на базе двухпортовой памяти организовать двойной буффер
  4. Добрый день

    Если видите что человек продает откровенный шлак, который долго не проработает, то пишите покупателю свои мысли в личку.

    Иначе продавец очень сильно злиться как сейчас...

     

    1. fpga_student

      fpga_student

       

      Юзеры что не должны знать про этот прикол ?

      Это офигенный осцилл и я выбивал его себе на работе год. А потом он сдох новый и я ничего не смог с ним сделать, после платного ремонта в Присте он проработал 2 дня(((

       

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

       

      И потом, это не просто Лекрой. Это еще и битый Лекрой. Как нужно всадить прибор, чтобы из него вырвать кусок ? Именно поэтому возможно на 20Gs прибор он ставит такой ценник.

       

      Возможно эта штука уже глючит....

       

  5. fpga_student и Maxim_S Прекратили ссориться!!!
  6. возможно это натолкнет на мысль - Ping Pong FIFO http://cospandesign.github.io/fpga,fifo/2016/05/02/ppfifo.html (работоспособность описания не проверял) PS Идея использовать плюсы двойного буфера (давблбуффер) . Для хранения данных со всех источников использовать даблбуфер. Хранить начальные адреса пакетов (вместе с длиной пакета) в отдельной памяти - можно это сделать для каждого источника отдельно. Чтобы оперативно можно производить пактное чтение с даблбуффера для каждого источника. Отдельно через регистр передавать количество пакетов записанных в даблбуффер. Сбрасывать указатели адресов памяти как только даблбуффер переключился, например. Это просто как мысли ...
  7. как самый простой способ фильтрации это обычная пауза. внешняя борьба с дребезгом например триггер шмидта...
  8. Спасибо, Мур такой термин как вертикальный счетчик слышу впервые :)
  9. Имеют, плюс еще надо учитывать пологие фронты...
  10. Я не уточнил - вопрос к деталировке. Уровень рисования цифровой схемы это счётчик, дешифратор, мультиплексор и так далее...
  11. Вот пример описание ШИМа (Широтно-импульсная модуляция (ШИМ, или Pulse-Width Modulation, PWM) Первый процесс описывает счетчик который считает 1 период ШИМ сигнала, второй процесс компаратор, третий процесс позволяет менять период сигнала шима и длительность нуля library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use IEEE.NUMERIC_STD.ALL; entity shim is generic ( N : natural := 3 ); Port ( clk : in STD_LOGIC; rst : in STD_LOGIC; en : in STD_LOGIC; --load : in STD_LOGIC; Period : in STD_LOGIC_VECTOR (N-1 downto 0); Duty_cycle : in STD_LOGIC_VECTOR (N-1 downto 0); ready_period : out STD_LOGIC; out_shim : out STD_LOGIC ); end shim; architecture Behavioral of shim is signal count_shim : STD_LOGIC_VECTOR (N-1 downto 0); signal reg_Period : STD_LOGIC_VECTOR (N-1 downto 0); signal reg_Duty_cycle : STD_LOGIC_VECTOR (N-1 downto 0); begin process (all) begin if rst = '1' then count_shim <= (others=>'0'); elsif(rising_edge(clk)) then if en = '1' then if count_shim = reg_Period then ready_period <= '1'; count_shim <= (others=>'0'); else count_shim <= count_shim + std_logic_vector( to_unsigned(1, count_shim'length )); ready_period <= '0'; end if; end if; end if; end process; process (all) begin if rst = '1' then out_shim <= '0'; elsif(rising_edge(clk)) then if count_shim < reg_Duty_cycle then out_shim <= '1' ; else out_shim <= '0'; end if; end if; end process; process (all) begin if rst = '1' then reg_Period <= (others=>'0'); reg_Duty_cycle <= (others=>'0'); elsif(rising_edge(clk)) then if ready_period = '1' then reg_Period <= Period; reg_Duty_cycle <= Duty_cycle; end if; end if; end process; end Behavioral; ниже пример схемы детектирования концевика (коментариев не даю) - как пример --detect_sensor library ieee; use ieee.std_logic_1164.all; --use ieee.std_logic_unsigned.all; use IEEE.NUMERIC_STD.ALL; entity detect_sensor is generic ( N : natural := 32 ); Port ( clk : in STD_LOGIC; rst : in STD_LOGIC; sensor : in STD_LOGIC; en_detect : in STD_LOGIC; sensor_rising : out STD_LOGIC; sensor_falling : out STD_LOGIC ); end detect_sensor; architecture Behavioral of detect_sensor is signal opto_sensor_shift_r : unsigned (N-1 downto 0); signal reg_sensor_falling, reg_sensor_rising : STD_LOGIC; begin sensor_rising <= reg_sensor_rising; sensor_falling <= reg_sensor_falling; process(all) begin if(rst = '1') then opto_sensor_shift_r <= (others=>'0'); elsif(rising_edge(clk)) then opto_sensor_shift_r <= opto_sensor_shift_r(N-2 downto 0) & sensor; end if; end process; process(all) begin if(rst = '1') then reg_sensor_rising <= '0'; reg_sensor_falling <= '0'; elsif(rising_edge(clk)) then if en_detect = '1' then if opto_sensor_shift_r((N-1) downto (N/2)) = to_unsigned(((2**(N/2))-1), N/2) and opto_sensor_shift_r((N/2-1) downto 0) = to_unsigned(0, N/2) then reg_sensor_rising <= '1'; else reg_sensor_rising <= '0'; end if; if opto_sensor_shift_r((N-1) downto (N/2)) = to_unsigned(0, N/2) and opto_sensor_shift_r((N/2-1) downto 0) = to_unsigned(((2**(N/2))-1), N/2) then reg_sensor_falling <= '1'; else reg_sensor_falling <= '0'; end if; end if; end if; end process; end Behavioral; Из-за этого я и пишу что нужно описывать цифровую схему ...
  12. я не категорично отношусь ))) просто по другому нельзя делать разработку на FPGA )))
  13. правильно, дальше на базе примитивной логики тригеров(регистров) и комбинационной логики (and or xor и другие логические операторы) надо описать на VHDL этот делитель частоты. Еще как помощь может быть для Вас это Template там Вы можете найти примеры описаний счетчиков, блоков памяти, FSM и другие... Далее написать тестбенч и проверить работу...
  14. Ок, начнем с простого, как Вы плаируете например с 50МГц сделать 100Гц? Может лучше работать на на тактовой частоте, есть же сигналы enable?
  15. Vhdl также как и verilog это как карандаш в руках хужника. Если художник не умеет рисовать, то карандаш не поможет. Предлагаю начать рисовать цифровую схему на листочке. Потом опишете ее на vhdl и промолелируете, т.е. проверите ее правильность работы. Когда симуляция покажет что схема работает тогда начнёте проверки на плате. Иначе никак... PS GRAFCET у FESTO и в TIA PORTAL это высокоуровневые языки от производителей. Сравнивать их с Vhdl/verilog не коректно мягко говоря. Наверное модули которые программируются с помощью этих языков сложные цифровые устройстава.
  16. Вы не правильно сформулировали вопрос, главный вопрос какую цифровую схему вы видите для реализации описания в FPGA вашей потребности Что насчет цифоровой схемы? С моделированием цифровых схем "дружите"? В современных платах FPGA тактовая частота подается от 50МГц и выше. Дальше Ваше описание цифровой схемы которое делит тактовую частоту до 100Гц (если Вы видите в этом необходимость), формирует импульсы для шаговых двигателей и обрабатывает концевики...
  17. На fpgadeveloper нет реализации (во всяком случае я ее не нашел). Там идет ссылка на сайт https://www.intelliprop.com/ipc-nv164-hi/ И я уверен что стоит эта корка не дешево...
  18. можно поподробнее пожалуйста особенно второй пункт с намеком на схемотехнику...
  19. Дополню задачу - внесу более четкость Выход каждого модуля это порт памяти с которого необходимо прочитать результат обработки после ready = '1' Давайте пока считать что только 1 ready = '1' может быть Предыдущий пост дополнил для ясности задачи
  20. des00 спасибо за подсказку... Добрый день. (update) есть несколько индентичных модулей (размножены с помощью generic). Модуль выдает ready как данные готовы. Все модули ready выдать одновремнно не могут - только один срабатывет Выход каждого модуля это порт памяти с которого необходимо прочитать результат обработки после ready = '1'. Вопрос как мне определить с какого модуля мне надо забрать данные и как построить мультиплексор к портам памяти (возможно есть другие красивые решения). Мое решение сложное - как по мне: ниже ход мыслей Объеденяем все ready от модулей в один регистр, далее module bitscan (req,sel); parameter WIDTH = 16; input [WIDTH-1:0] req; output [WIDTH-1:0] sel; assign sel = req & ~(req-1); endmodule (что делает этот модуль во вложении картинка) от результата отнимаем 1 и считаем количество едениц ответом и будет номер модуля с какого модуля мне надо забрать данные в котором сработал ready Потом мультиплексор ... library ieee ; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity mux4 is port( d0 : in std_logic_vector(1 downto 0); d1 : in std_logic_vector(1 downto 0); d2 : in std_logic_vector(1 downto 0); d3 : in std_logic_vector(1 downto 0); s : in std_logic_vector(1 downto 0); m : out std_logic_vector(1 downto 0)); end mux4; architecture rtl of mux4 is type t_array_mux is array (0 to 3) of std_logic_vector(1 downto 0); signal array_mux : t_array_mux; begin array_mux(0) <= d0; array_mux(1) <= d1; array_mux(2) <= d2; array_mux(3) <= d3; m <= array_mux(to_integer(unsigned(s))); end rtl; Для шины адреса и данных - необходимых для чтения из памяти (BRAM) Интересуют идеи по реализации.
  21. Насчет возможности с помощью Core Generator я знаю... Начал сомневаться что описать память с Chip select можно - только через Core Generator Вот еще архитектура для записи - вложение
  22. Добрый день подскажите пожалуйста как правильно описать двухпортовую память с CS(Chip select) (altera) такое решение 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; 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; мне кажется не коректным т.к. не задействуется порт CS (technology viewer) - вложение. Основной вопрос как осуществить доступ к нескольким портам памяти (BRAM) имея один вход: Шина данных Шина адреса Сигнал WE Решение через сигнал WE мне кажется не очень быстродейственным - большой mux. Мне надо соедениться с 16 памятями - чтобы их инициализировать Можно конечно сделать pipeline. Может у кого есть более оригинальные решения? PS Для avalon MM для соединения мастера со многими слейвами MM - все намного проще "Chip select signal to the slave. The slave port should ignore all other Avalon signal inputs unless chipselect is asserted."
×
×
  • Создать...