Этот пример показывает полный рабочий процесс того, как сгенерировать компонент SystemVerilog DPI для буферного интерфейса FIFO, предназначенного, чтобы быть интегрированным с приемником UART. Интерфейс написан в MATLAB и экспортирован в симулятор HDL. Файлы SystemVerilog для приемника UART и его испытательного стенда также обеспечиваются.
В демонстративных целях этот пример использует Modelsim 10.3c в 64-битном Windows 7. Однако эта та же процедура может быть легко реплицирована для других систем и средств моделирования.
Продукты потребовали для этого примера:
MATLAB Coder®
Средства моделирования: Наставник Graphics® ModelSim®/QuestaSim® или Cadence® Incisive
Один из поддерживаемого компилятора C: Microsoft® Visual C ++ или GNU GCC
Универсальный асинхронный приемник и передатчик (UART) являются схемой, которая отправляет и получает данные через последовательную линию. UART обычно используется со стандартом RS-232 и содержит приемник и передатчик. Однако в этом примере только приемник используется.
Последовательная передача запускается со 'старт-бита', который является 0, сопровождается битами данных, и заканчивается 'битом четности' и 'стоп-битом'. Передача одного байта является показом в следующем рисунке:
Передача является асинхронной, которые означают, что нет никакой информации о часах, поэтому приемник и передатчик должны договориться о том, какая скорость в бодах, стоп-биты и бит четности используются. В этом примере один байт будет передан со скоростью в бодах 19 200, 1 стоп-бит и никакие биты четности.
Схема сверхдискретизации будет использоваться, чтобы оценить срединную точку бита данных на уровне 16 раз скорость в бодах, как показано на рисунке ниже.
Следующее схематическое иллюстрирует проект приемника UART.
Первый шаг должен записать код MATLAB, который удовлетворит требованиям вашего проекта, необходимо попытаться получить требования в испытательном стенде. В этом примере наш проект состоит из буфера метода "первым пришел - первым вышел" (FIFO) 8 слов.
Проект: FIFO_Buffer
Испытательный стенд: FIFO_Buffer_tb
Запустите испытательный стенд, чтобы убедиться, что нет никаких ошибок периода выполнения, фигура ниже должна быть построена.
FIFO_Buffer_tb
Обратите внимание на то, что испытательный стенд осуществляет проект следующим образом:
Такты <15: Запишите 6 байтов (запишите, что сигнал включил, считайте отключенный сигнал), затем Рид 6 байтов (сигнал чтения включил, запишите отключенный сигнал).
Такты> 15: Читайте и запишите одновременно. (Например: байт, который записан, читается за следующий такт).
Чтобы сгенерировать компонент выполняют следующую команду:
dpigen -testbench FIFO_Buffer_tb FIFO_Buffer -args {0,int8(0),0}
Фигура ниже показов соответствующие файлы для этого примера.
Если DPIGEN генерирует компонент DPI и его испытательный стенд, можно запустить испытательный стенд SystemVerilog путем выполнения шагов ниже:
Запустите ModelSim/QuestaSim в режиме GUI.
Измените свой текущий каталог в "dpi_tb" в соответствии с директорией генерации кода в вашем симуляторе HDL.
Введите следующую команду, чтобы запустить вашу симуляцию
do run_tb_mq.do
Следующие формы волны будут сгенерированы:
Обратите внимание на то, что это совпадает с нашим испытательным стендом MATLAB, где мы пишем 6 байтов и затем читаем их, сопровождаемый путем одновременной записи и чтения 8 байтов.
Когда симуляция заканчивается, необходимо видеть следующий текст, распечатанный в консоли:
**************TEST COMPLETED (PASSED)**************
После того, как поведение компонента DPI было проверено, пора интегрировать его в приемник UART. Следующий рисунок показывает файлы, требуемые для различных компонентов.
Чтобы осуществить приемник UART с интегрированным компонентом DPI, испытательный стенд, названный 'uart_rx_FIFO_tb.sv', был обеспечен. Чтобы интегрировать компонент, все, что необходимо, должно инстанцировать компонента в испытательном стенде как показано ниже:
// Instantiate DUT generated using MATLAB Based SystemVerilog DPI FIFO_Buffer_dpi u_FIFO_Buffer_dpi( .clk(clk), .clk_enable(clk_enable), .reset(reset), .wr(rx_done_tick), .w_data(dout), .rd(rd), .Empty(Empty), .r_data(r_data), .Full(Full) );
Чтобы симулировать проект успешно, убедитесь, что следующие файлы находятся в той же папке:
Подобно шагу 3, открытому Modelsim и запуску .do использование файла:
do run_tb.do
Следующие формы волны сгенерированы:
В испытательном стенде 6 букв ASCII ('MATLAB') переданы через последовательный сигнал 'rx' и записаны в буфер FIFO. После того, как 6-я передача буквы завершена, сигнал 'ул.', как утверждается, получает буквы ('MATLAB') назад в 'r_data'.
Pong P. Chu (2008), FPGA Prototyping by Verilog Examples. Hoboken, New Jersey: John Wiley & Sons, Inc.