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

FAQ по языкам описания аппаратуры

В операторе 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый день, уважаемые форумчане.

 

Не могли бы Вы мне подсказать один момент:

Допустим у меня есть рабочий проект 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 меня не понял....

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пытался по-по всякому объявить его при помощи директивы USE.
Причём тут use? Use используется для модулей уже готовой библиотеки. Для вашего модуля нужно сделать отдельную библиотеку для Квартуса. Как это сделать и можно ли это сделать в принципе, я не знаю.

Наверное, как-то это можно сделать через файл qip, как для ядер.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Большинство авторов книг по VHDL пишут, что есть три стиля описания схем:

- Структурное

- Поведенческое

- Потоковое

Что такое структурное описание вопросов не возникает.

А вот в чём разница между потоковым описанием и поведенческим в книгах толком и не раскрыта. Никак не могу уловить суть. Хотя это знание и никак не влияет на конечный результат, но хочется понимать какой смысл заложен в эти фразы.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Неужели так просто ? :wacko:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Большинство авторов книг по VHDL пишут, что есть три стиля описания схем:

- Структурное

- Поведенческое

- Потоковое

Что такое структурное описание вопросов не возникает.

А вот в чём разница между потоковым описанием и поведенческим в книгах толком и не раскрыта. Никак не могу уловить суть. Хотя это знание и никак не влияет на конечный результат, но хочется понимать какой смысл заложен в эти фразы.

Советую почитать главу 2 документации по Yosys там довольно подробно расписано про разницу в данных стилях. Там это называется уровнями абстракции: поведенческий (Behavioural Level) и RTL-уровень рассматриваются с точки зрения синтеза.

http://www.clifford.at/yosys/files/yosys_manual.pdf

Изменено пользователем Fitc

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Возник маленький вопрос при написании тестов на 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

wait без указания времени будет ждать вечность.

Спасибо ! Забыл, что можно оператор wait использовать...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А можно ли как-то значение типа 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

так автоматом же и формировать...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я похожее написал.

    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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

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