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

    

Flip-fl0p

Свой
  • Публикаций

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

  • Посещение

Репутация

0 Обычный

Информация о Flip-fl0p

Контакты

  • Сайт
    http://
  • ICQ
    226550164

Информация

  • Город
    Санкт-Петербург

Старые поля

  • skype
    Flip-fl0p
  • Vkontakte
    https://vk.com/id4024060

Посетители профиля

4 754 просмотра профиля
  1. А зачем вам вообще асинхронный сброс (снятие которого надо ещё синхронизировать с clk) ? Насколько я помню MAX II должен поддерживать инициализацию триггеров нулями. Тут можно вообще без сброса обойтись. Зачем на выходе триггеры ? Формируйте сигнал валидности данных, и все. Это ещё сэкономит 9 триггеров. Тем более у вас фактически готов сигнал валидности - это выход с детектора фронтов. Я бы описал так: library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity PULSE_MEASHURE is generic ( N : natural := 511; -- Размерность счетчика FREQ_CLK : natural := 48000000; -- Тактовая частота плис (Hz) MAX_FREQ_PERIOD : natural := 280000; -- Максимальная частота измеряемого при котором переключается на генератор (Hz) MIN_FREQ_PERIOD : natural := 230000 -- Минимальная частота пропускаемого измеряемого периода (Hz) ); port ( clk : in std_ulogic; -- порты входа тактовой частоты enable : in std_ulogic; -- сигнал включения/отключения signal_in : in std_ulogic; -- измеряемый сигнал, измеряется каждый полупериод Period : out integer range 0 to N; -- вывод числа тиков измеренного каждого полупериода Period_valid : out std_ulogic -- вывод числа тиков измеренного каждого полупериода ); end entity; architecture Behavioral of PULSE_MEASHURE is --============================================ -- Крайне желательно добавить атрибуты синтеза -- Чтобы САПР не "оптимизировал" их -- syncronizer0 Синхронизирует signal_in -- syncronizer1 Синхронизирует disable --============================================ signal syncronizer0 : std_logic_vector(1 downto 0) := (others => '0'); signal syncronizer1 : std_logic_vector(1 downto 0) := (others => '0'); --============================================ -- Детектирование фронта --============================================ signal edge_detector : std_ulogic := '0'; signal all_edge : std_ulogic := '0'; --==================================================================================================== -- Счетчик периода. Если коэф. Пересчета 2^n-1 (полный счетчик) то лучше объявить счетчик как Unsigned, -- т.к нет необходимости явного описания что делать при переполнении --==================================================================================================== signal pulse_counter : unsigned (8 downto 0) := (others => '0'); begin --============================================== -- Синхронизация signal_in с клоковым доменом -- Синхронизация disable с клоковым доменом --============================================== syncronizer_proc : process(clk) begin if (rising_edge(clk)) then syncronizer0 <= syncronizer0(syncronizer0'left - 1 downto 0) & signal_in; syncronizer1 <= syncronizer1(syncronizer1'left - 1 downto 0) & enable; end if; end process; --============================================== -- Детектирование фронтов --============================================== all_edge_detector : process(clk) begin if (rising_edge(clk)) then edge_detector <= syncronizer0(syncronizer0'left); end if; end process; all_edge <= edge_detector xor syncronizer0(syncronizer0'left); --============================================== -- Счетчик периода --============================================== pulse_counter_proc : process(clk) begin if(rising_edge(clk)) then pulse_counter <= pulse_counter + "1"; if (all_edge = '1') then pulse_counter <= (others => '0'); end if; end if; end process; Period <= to_integer(pulse_counter); period_valid <= all_edge when (syncronizer1(syncronizer1'left) = '1' ) else '0'; -- При отключении модуля, просто маскируем сигнал валидности end architecture;
  2. Ну так поставьте отдельный кварц тогда. Если мне не изменяет память мах2 может на 300 МГц работать если не включён триггер Шмидта.
  3. Так Вы попробуйте сделать по всем правилам. При этом выдавать сигналы управления раньше на столько тактов на сколько у Вас задерживаются данные в регистре-синхронизаторе. В итоге погрешность будет примерно 1 такт. А если ещё и частоту внутри ПЛИС поднять на pll, то можно добиться глитча существенно меньше 20 нс. Фактически точность измерения определяют крутизна фронта измеряемого сигнала и частота измерения.
  4. А вы заверните в протокол передачи ещё что-то типа FEC. Та-же самая корка от Xilinx кодер\декодер Рида-Соломона.
  5. Так если за раз (за такт) вы перекидываете 4 байта т.е 32 бита, то прямо таки напрашивается CRC32. 1 такт. 32 бита приняли, посчитали CRC. 2 такт. 32 бита приняли, посчитали CRC с учётом предыдущего CRC. 3 такт. 32 бита CRC приняли и сравнили с предыдущим CRC. И вроде все реально можно успеть считать в темпе приема.
  6. Магистерская выпускная квалификационная работа- это магистерская диссертация. К ней предъявляется ряд требований, одним из которых является научная новизна. Никакой новизны в запуске Linux на SoC нет. Вот ежели Вы придумаете какой нибудь заковыристый алгоритм, да ещё и реализуете его - тогда имеет смысл копать в эту тему.
  7. Вот один из вариантов решения задачи. Из готовых модулей его можно собрать минут за 5. library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; entity freq_meter is port ( clk : in std_ulogic; -- Частота основной логики измерения start : in std_ulogic; -- Запуск измерения meas_time : in std_ulogic_vector(31 downto 0); -- measurement_time meas_freq : in std_ulogic; -- Measured frequency result : out std_ulogic_vector(31 downto 0); -- measurement result result_valid : out std_ulogic -- Сигнал валидности result (сформируйте его уже сами) ); end entity; architecture RTL of freq_meter is signal prd_counter : unsigned(31 downto 0) := (others => '0'); -- Наш счетчик периода --===================================================================== -- Наш JK-триггер, можно без него, написав простенький автомат -- Но лично мне с триггером понятнее. --===================================================================== signal J : std_ulogic; -- Сигнал установки триггера signal K : std_ulogic; -- Сигнал сброса триггера signal Q : std_ulogic := '0'; -- Выход триггера signal syncronizer : std_ulogic_vector(2 downto 0) := (others => '0'); -- Синхронизатор с клоковым доменом meas_freq signal edge_detector : std_ulogic := '0'; -- DFF Для детектирования фронтов signal Redge : std_ulogic; -- Сигнал-флаг детектированного переднего фронта signal Fedge : std_ulogic; -- Сигнал-флаг детектированного заднего фронта signal meas_counter : unsigned(31 downto 0) := (others => '0'); -- Счетчик, который считает "пульсы" за период begin -- Алгоритм такой: пришла команда запуска - мы загружаем в вычитающий счетчик период измерения -- Одновременно с загрузкой данных в счетчик, мы усанавливаем наш JK триггер в единичку. -- Когда счетчик отсчитает наш период (от значения meas_time до 0) у нас сбросится JK триггер. -- Таким несложным способом мы формируем длинный сигнал пока у нас счетчик отсчитывает период --=============================================================================================== -- Счетчик с синхронной загрузкой. У меня это всегда отдельный модуль с параметрами --=============================================================================================== counter_sload : process(clk) begin if (rising_edge(clk)) then prd_counter <= prd_counter - "1"; -- Вычитающий счетчик if (start = '1') then -- Когда пришла команда начать измерения prd_counter <= unsigned(meas_time); -- Загружаем в счетчик период измерения end if; end if; end process; --=========================================================== -- JK триггер. У меня это отдельный модуль с параметарми --=========================================================== JKFF : process(clk) variable JplusK : unsigned(1 downto 0) := (others => '0'); begin if (rising_edge(clk)) then JplusK := J & K; case JplusK is when "00" => Q <= Q; when "01" => Q <= '0'; when "10" => Q <= '1'; when "11" => Q <= not Q; when others => null; end case; end if; end process; J <= start; -- Пришла команда запуска устанавливаем JK в единицу K <= '1' when (prd_counter = (31 downto 0 => '0')) else '0'; -- Счетчик отсчитал период - сбрасываем наш JK тригер --================================================================================== -- Сдвиговый регистр синхронизатор -- У меня это тоже отдельный модуль, с правильными атрибутами синтеза -- Этим регистром мы переносим наш длинный сигнал c JK триггера в домен meas_freq --================================================================================== process(meas_freq) begin if (rising_edge(meas_freq)) then syncronizer <= syncronizer(syncronizer'left - 1 downto 0) & q; end if; end process; --========================================================================= -- DFF Триггер для детектирования фронтов -- У меня это тоже отдельный модуль... --========================================================================= process(meas_freq) begin if (rising_edge(meas_freq)) then edge_detector <= syncronizer(syncronizer'left); end if; end process; Redge <= not edge_detector and syncronizer(syncronizer'left); -- Детектируем передний фронт Fedge <= not syncronizer(syncronizer'left) and edge_detector; -- Детектируем задний фронт --====================================================================== -- Считаем количество "пульсов" за период -- И опять, же у меня это всегда отдельный модуль с параметрами. --====================================================================== process(meas_freq) begin if (rising_edge(meas_freq)) then meas_counter <= meas_counter + "1"; if (Redge = '1') then -- Передним фронтом нашего длинного сигнала meas_counter <= (others => '0'); -- Сбрасываем счетчик (подготсвливаем для счета) end if; end if; end process; process(meas_freq) begin if (rising_edge(meas_freq)) then if (Fedge = '1') then -- Задним фронтом result <= std_ulogic_vector(meas_counter); -- Мы переписываем результат в отдельный триггер end if; end if; end process; -- Чтобы было совсем правильно, надо сформировать сигнал result_valid, который сообщает, что данные result правильные, и их можно забрать. -- Естественно, что result_valid должен быть синхронен домену CLK. -- А сам result можно не синхронизировать.... если будет result_valid. -- Но это уже сами. -- Вообще, есть много вариантов измерителя "пульсов" за период. Можно вообще попробовать применить счетчик Грея. -- Всё в Ваших руках end architecture;
  8. А Вы упертый товарищ... Какая-то у Вас странная забава. Задать вопрос, получить ответы. Но в итоге сделать по-своему и при этом неправильно... Да Ваш код может даже почти всегда считает правильно. Однако у него есть один серьезнейший недостаток: В момент совпадения фронта FREQ_IN и сигнала reset Вы на выходе иногда будете получать очень "странный" результат. Ну что же. Ждем от Вас новой темы с вопросом, почему Ваш "идеальный" код сбоит.
  9. Он хоть заработал ? Как в итоге Вы сделали ?
  10. Мда... Не очень красиво с Вашей стороны так говорить...
  11. Спросите на форуме у специалистов тех поддержки тогда.
  12. 8 дней прошло. А Вы так и не запустили проект на моделирование и проверку. Что Вы ещё хотите от нас услышать ?
  13. Дифференциальных стандартов много. И у каждого из них свои нюансы. Часть стандартов поддерживается непосредственно самой FPGA - тут надо читать описание на FPGA. При чем часто бывает, что для определенных стандартов есть только определенные выводы FPGA - опять же читать описание на FPGA. Для части неподдерживаемых стандартов можно применить специальные схемы согласования. Более того, некоторые FPGA не содержат внутри терминирующие резисторы, соответственно их придется ставить на плату. Вы лучше по-человечески сформулируйте задачу, которую поставили перед Вами. Тогда может получите более конкретный ответ на свой вопрос.
  14. Так почему же до сих пор, схема не запущена на симуляцию, и не была прочитана документация на элементы CB4CLE на CB4RLE ?