Flip-fl0p 4 17 ноября, 2016 Опубликовано 17 ноября, 2016 (изменено) · Жалоба В операторе case вы обязаны перечислить все возможные состояния. Если в каких-то из них ничего делать не надо, то и используется null. CASE PRESS_STATE IS WHEN IDLE => NULL; -- В состоянии ожидания ничего не делаем WHEN WAIT_FIFO_READING => NULL; -- В состоянии ожидания опустошения FIFO буфера мтарицы ничего не делаем WHEN OTHERS => NULL; Тут idle и wait_fifo_reading можно опустить, потому что есть others с таким же (без)действием. Спасибо. Забыл, что их можно опустить. Просто к чему я задал вопрос: Я ведь могу задать так: WHEN OTHERS => REQ_RD <= '0'; -- По умолчанию нет запроса на чтение REQ_WR <= '0'; -- По умолчанию нет запроса на чтение CNT_ENA <= '0'; -- Работа счетчиков запрещена RESET_ALL_COUNTER <= '0'; По сути ничего не меняется. Quartus количество ячеек не меняет. Где-то в книге читал (но не помню какой), что оператор NULL надо применять о большой осторожностью. Но вот больше ничего конкретного, чего надо остерегаться, написано не было. Вот и хотелось бы разобраться, а так ли страшен черт как его малюют ? Изменено 17 ноября, 2016 пользователем Flip-fl0p Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 25 ноября, 2016 Опубликовано 25 ноября, 2016 · Жалоба Добрый день, уважаемые форумчане. Не могли бы Вы мне подсказать один момент: Допустим у меня есть рабочий проект UART приёмника, состоящий из нескольких более мелких модулей. К примеру все файлы проекта UART приёмника расположенный папке С:\UART_RECEIVER Я хочу применить этот модуль в своем проекте MY_PROJECT. К примеру он будет расположен в папке С:\MY_PROJECT Когда я компилирую проект MY_PROJECT мне приходится чтобы Quartus не ругался: 1. Закинуть UART приёмника в папку с проектом MY_PROJECT т.е. С:\MY_PROJECT\UART_RECEIVER 2. Далее обвить проект UART в проекте верхнего уровня MY_PROJECT при помощи ENTITY WORK.UART 3. И каждый файл проекта UART добавить в текущий проект MY_PROJECT т.е для каждого файла выполнить File --> open затем project --> add curent file to project А можно ли как-то упростить процедуру прикрепления модуля UART приёмника ? Пытался по-по всякому объявить его при помощи директивы USE. Но Quartus меня не понял.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 25 ноября, 2016 Опубликовано 25 ноября, 2016 · Жалоба Пытался по-по всякому объявить его при помощи директивы USE.Причём тут use? Use используется для модулей уже готовой библиотеки. Для вашего модуля нужно сделать отдельную библиотеку для Квартуса. Как это сделать и можно ли это сделать в принципе, я не знаю. Наверное, как-то это можно сделать через файл qip, как для ядер. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 10 января, 2017 Опубликовано 10 января, 2017 · Жалоба Стыдно признаться, но у меня сейчас каша в голове. Собственно никак не могу понять смысл простейшей терминологии: Большинство авторов книг по VHDL пишут, что есть три стиля описания схем: - Структурное - Поведенческое - Потоковое Что такое структурное описание вопросов не возникает. А вот в чём разница между потоковым описанием и поведенческим в книгах толком и не раскрыта. Никак не могу уловить суть. Хотя это знание и никак не влияет на конечный результат, но хочется понимать какой смысл заложен в эти фразы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Poluektovich 0 10 января, 2017 Опубликовано 10 января, 2017 · Жалоба Потоковое описание (RTL) должно быть синтезопригодным, а поведенческое содержит несинтезируемые конструкции и используется для верификации. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 10 января, 2017 Опубликовано 10 января, 2017 · Жалоба Потоковое описание (RTL) должно быть синтезопригодным, а поведенческое содержит несинтезируемые конструкции и используется для верификации. Неужели так просто ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Fitc 0 11 января, 2017 Опубликовано 11 января, 2017 (изменено) · Жалоба Стыдно признаться, но у меня сейчас каша в голове. Собственно никак не могу понять смысл простейшей терминологии: Большинство авторов книг по VHDL пишут, что есть три стиля описания схем: - Структурное - Поведенческое - Потоковое Что такое структурное описание вопросов не возникает. А вот в чём разница между потоковым описанием и поведенческим в книгах толком и не раскрыта. Никак не могу уловить суть. Хотя это знание и никак не влияет на конечный результат, но хочется понимать какой смысл заложен в эти фразы. Советую почитать главу 2 документации по Yosys там довольно подробно расписано про разницу в данных стилях. Там это называется уровнями абстракции: поведенческий (Behavioural Level) и RTL-уровень рассматриваются с точки зрения синтеза. http://www.clifford.at/yosys/files/yosys_manual.pdf Изменено 11 января, 2017 пользователем Fitc Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 18 января, 2017 Опубликовано 18 января, 2017 (изменено) · Жалоба Возник маленький вопрос при написании тестов на VHDL. А как заставить условие выполняться только один раз ? Например у меня есть кусок кода тестбенча: COUNTER_PROC : PROCESS ( CLK ) VARIABLE COUNTER : INTEGER RANGE 0 TO 15; BEGIN IF (RISING_EDGE(CLK)) THEN IF (COUNTER = 15) THEN COUNTER := 0; ELSE COUNTER := COUNTER + 1; END IF; END IF; IF (COUNTER = 14) THEN LOAD_DATA <= "0111"; LOAD_ENA <= '1'; ELSE LOAD_DATA <= (OTHERS => '0'); LOAD_ENA <= '0'; END IF; END PROCESS; А если мне надо, чтобы данный процесс выполнился только один раз, как мне быть ? Я придумал вариант, что когда счётчик досчитал до конца он зацикливается, но мне этот вариант не нравится. Такое чувство, что можно описать как-то красивее, правильнее. IF (RISING_EDGE(CLK)) THEN IF (COUNTER = 15) THEN COUNTER := 15; ELSE COUNTER := COUNTER + 1; END IF; END IF; Решение ждать конкретное время: WAIT FOR 780 ns; Выглядит чуть более красиво, мне как-то не симпатизирует, поскольку не хочу заморачиваться с подсчётом времени и подстановкой в нужное мне время нужных значений сигналов. Изменено 18 января, 2017 пользователем Flip-fl0p Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 18 января, 2017 Опубликовано 18 января, 2017 · Жалоба wait без указания времени будет ждать вечность. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 18 января, 2017 Опубликовано 18 января, 2017 · Жалоба wait без указания времени будет ждать вечность. Спасибо ! Забыл, что можно оператор wait использовать... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 13 февраля, 2017 Опубликовано 13 февраля, 2017 (изменено) · Жалоба А можно ли как-то значение типа STD_LOGIC_VECTOR вывести на консоль Modelsim'a простыми способом ? Может есть какая хитрая библиотека для этого ? На данный момент не вижу альтернатив, кроме как написать собственную функцию для преобразования STD_LOGIC_VECTOR ----> STRING, что делать не очень хочется... UPD 12:00 Отвечу сам на свой вопрос. Для того, чтобы напечатать значение STD_LOGIC_VECTOR в консоль можно написать следующее: PRINTING_SLV_TO_CONSOLE : PROCESS ( CLOCKx7 ) BEGIN IF RISING_EDGE(CLOCKX7) THEN -- Печатаем значение вектора по каждому фронту частоты CLOCKx7 FOR i IN (DATA_REG'LENGTH-1) DOWNTO 0 LOOP -- Для всех разрядов вектора DATA_REG REPORT STD_LOGIC'IMAGE(DATA_REG(i)); -- Выводим значение каждого разряда начиная со старшего. END LOOP; REPORT ""&LF; -- После того, как все символы вектора напечатали перейдем на новую строку END IF; END PROCESS; В итоге на экране консоли будет следующее: # '0''0''0''0''1''1''0' # '0''0''0''1''1''0''0' # '0''0''1''1''0''0''0' # '0''1''1''0''0''0''0' # '1''1''0''0''0''0''0' # '1''0''0''0''0''0''1' # '0''0''0''0''0''1''1' На вид не очень красиво, думаю потом подправлю на "красивый" вариант. Изменено 13 февраля, 2017 пользователем Flip-fl0p Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 5 апреля, 2017 Опубликовано 5 апреля, 2017 · Жалоба Подскажите, как можно красиво сформировать единичный сигнал, каждый раз как происходит изменение состояний автомата ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 5 апреля, 2017 Опубликовано 5 апреля, 2017 · Жалоба Подскажите, как можно красиво сформировать единичный сигнал, каждый раз как происходит изменение состояний автомата ? так автоматом же и формировать... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 5 апреля, 2017 Опубликовано 5 апреля, 2017 · Жалоба Подскажите, как можно красиво сформировать единичный сигнал, каждый раз как происходит изменение состояний автомата ? process (clk) begin if rising_edge (clk)) then prev_state <= state; if (state = prev_state) then change <= '0'; else change <= '1'; end if; end if; end process; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 5 апреля, 2017 Опубликовано 5 апреля, 2017 (изменено) · Жалоба Я похожее написал. PROCESS ( CLK ) BEGIN IF (RISING_EDGE(CLK)) THEN ERROR_CNT_RST <= '0'; IF (PRESS_STATE /= NEXT_STATE) THEN ERROR_CNT_RST <= '1'; END IF; END IF; END PROCESS; Вот только получается беда. Поскольку NEXT_STATE - это комбинационная функция, то такой подход генерирует огромнейшее количество слоёв логики. Вроде бы идея сравнивать текущее состояние и прошедшее более красиво выглядит. PRESS_STATE_TO_NEXT_STATE_PROC : PROCESS ( CLK ) BEGIN IF (RISING_EDGE(CLK)) THEN PRESS_STATE <= NEXT_STATE; -- По каждому фронтму меняем состояние на то, которое вычислил автомат LAST_STATE <= PRESS_STATE; -- Запомним текущее состояние автомата IF (SRST = '1') THEN -- При активном синхронном сбросе PRESS_STATE <= IDLE; -- Переходим в состояние ожидания END IF; END IF; END PROCESS; PROCESS ( CLK ) BEGIN IF (RISING_EDGE(CLK)) THEN ERROR_CNT_RST <= '0'; IF (PRESS_STATE /= LAST_STATE) THEN ERROR_CNT_RST <= '1'; END IF; END IF; END PROCESS; Изменено 5 апреля, 2017 пользователем Flip-fl0p Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться