|
|
  |
FAQ по языкам описания аппаратуры |
|
|
|
Nov 17 2016, 07:24
|

В поисках себя...
   
Группа: Свой
Сообщений: 729
Регистрация: 11-06-13
Из: Санкт-Петербург
Пользователь №: 77 140

|
Цитата(andrew_b @ Nov 17 2016, 10:03)  В операторе 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 надо применять о большой осторожностью. Но вот больше ничего конкретного, чего надо остерегаться, написано не было. Вот и хотелось бы разобраться, а так ли страшен черт как его малюют ?
Сообщение отредактировал Flip-fl0p - Nov 17 2016, 07:25
|
|
|
|
|
Jan 11 2017, 20:35
|
Частый гость
 
Группа: Свой
Сообщений: 80
Регистрация: 21-10-11
Пользователь №: 67 894

|
Цитата(Flip-fl0p @ Jan 10 2017, 09:43)  Стыдно признаться, но у меня сейчас каша в голове. Собственно никак не могу понять смысл простейшей терминологии: Большинство авторов книг по VHDL пишут, что есть три стиля описания схем: - Структурное - Поведенческое - Потоковое Что такое структурное описание вопросов не возникает. А вот в чём разница между потоковым описанием и поведенческим в книгах толком и не раскрыта. Никак не могу уловить суть. Хотя это знание и никак не влияет на конечный результат, но хочется понимать какой смысл заложен в эти фразы. Советую почитать главу 2 документации по Yosys там довольно подробно расписано про разницу в данных стилях. Там это называется уровнями абстракции: поведенческий (Behavioural Level) и RTL-уровень рассматриваются с точки зрения синтеза. http://www.clifford.at/yosys/files/yosys_manual.pdf
Сообщение отредактировал Fitc - Jan 11 2017, 20:36
|
|
|
|
|
Jan 18 2017, 10:20
|

В поисках себя...
   
Группа: Свой
Сообщений: 729
Регистрация: 11-06-13
Из: Санкт-Петербург
Пользователь №: 77 140

|
Возник маленький вопрос при написании тестов на 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; Выглядит чуть более красиво, мне как-то не симпатизирует, поскольку не хочу заморачиваться с подсчётом времени и подстановкой в нужное мне время нужных значений сигналов.
Сообщение отредактировал Flip-fl0p - Jan 18 2017, 10:24
|
|
|
|
|
Feb 13 2017, 06:31
|

В поисках себя...
   
Группа: Свой
Сообщений: 729
Регистрация: 11-06-13
Из: Санкт-Петербург
Пользователь №: 77 140

|
А можно ли как-то значение типа 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' На вид не очень красиво, думаю потом подправлю на "красивый" вариант.
Сообщение отредактировал Flip-fl0p - Feb 13 2017, 09:09
|
|
|
|
|
Apr 5 2017, 13:23
|

В поисках себя...
   
Группа: Свой
Сообщений: 729
Регистрация: 11-06-13
Из: Санкт-Петербург
Пользователь №: 77 140

|
Цитата(andrew_b @ Apr 5 2017, 16:12)  Я похожее написал. Код 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;
Сообщение отредактировал Flip-fl0p - Apr 5 2017, 13:50
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|