Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Автоматизация проектирования электронной компонентной базы

.pdf
Скачиваний:
1
Добавлен:
17.04.2023
Размер:
356.15 Кб
Скачать

ограничение на употребление конструкций языка в исходном коде. Требуется синтезируемая модель. Кроме того, чтобы многократно не переписывать поведенческую модель, следует четко представлять, какое Verilog-описание приведет к синтезу того или иного элемента схемы.

Ранее в статье было продемонстрировано, как работает Verilogсимулятор. Далее будут рассмотрены требования средств синтеза.

Врезультате синтеза любой элемент языка может быть синтезирован, проигнорирован, либо может вызвать ошибку. Конструкции языка могут поддерживаться полностью, частично или не поддерживаться вовсе.

Как уже упоминалось, иерархические имена, initial, fork-join или primitive, не поддерживаются. Временной контроль #nn игнорируется в синтезируемой модели. Событийный контроль поддерживается частично: только в блоках always.

Вдокументации к средству синтеза указывается, какие ограничения вводятся на элементы языка. Перед написанием модели следует ознакомиться с документацией. Кроме этого, существуют правила описания комбинаторной логики, последовательной логики, мультиплексоров, FSM и т. п.

Комбинаторная логика синтезируется из следующих конструкций: 1) непрерывное присвоение:

assign a=b+c&d; wire b={e,f} | g[1:0];

2) сигналы, описанные в функциях;

3) сигналы, описанные следующей или подобной конструкцией:

reg data_out;

always @(a or b or c) if (b)

data_out = a; else data_out = c;

то есть блок always, в списке чувствительности которого перечислены все входные сигналы.

Как можно видеть в третьем (а иногда и во втором) случае, объявление сигнала с ключевым словом reg не приводит к созданию регистра. Также комбинаторная логика синтезируется в случае case, если описаны все ветви. При этом получается не приоритетный набор (как в моделировании), а набор параллельных конструкций. Также case используется для синтеза мультиплексоров.

Последовательная логика имеет ограничения в синтезируемых конструкциях. Для описания регистра-защелки (latch) применяется следующая конструкция:

reg data_out;

always @(data_in or enable)

if (enable) data_out = data_in;

Для регистров, работающих по фронту/срезу сигнала, применяется описание с конструкциями posedge или negedge:

reg data_out;

always @(posedge clock) data_out <= data_in;

Чтобы добавить синхронный сброс, описание нужно дополнить сигналом установки/сброса, но не вносить эти сигналы в список чувствительности:

reg data_out;

always @(posedge clock) if (set_sig)

data_out <= 1'b1; else if (reset_sig) data_out <= 1'b0; else

data_out <= data_in;

Для асинхронной установки/сброса конструкция должна быть изменена, так чтобы эти сигналы попали в список чувствительности:

reg data_out;

always @(posedge clock or posedge set_sig or posedge reset_sig) if (set_sig)

data_out = 1'b1; else if (reset_sig) data_out = 1'b0; else

data_out = data_in;

Пользуясь этими принципами, можно описать триггер любого типа. Если сигнал имеет размерность, большую единицы, то синтезируются

устройства для каждого бита, а существующая логика или арифметика в подобных конструкциях синтезируется в комбинаторную схему.

Блок case, у которого расшифровываются не все входные воздействия, синтезируется в элемент последовательной логики. Также может использоваться для описания FSM (finite state machine). Поэтому кажется более правильным воспользоваться комбинаторным case и явно описать регистр для хранения результата (к примеру, для реализации FSM).

Ограничения, накладываемые средством синтеза на язык HDL, позволяют описывать логику работы схемы в виде комбинаторной логики и регистров для хранения результатов. Такое описание называется RTL (register transfer level) и иногда отделяется (по смыслу) от поведенческого. Основная идея, которую хотелось бы высказать в данной статье, — это то, что следует пользоваться RTL-описанием для моделирования и синтеза. Данный подход является эффективным методом ведения разработки. Так как «правильное» (написанное с применением правил, изложенных выше)

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

Завершая рассмотрение синтезируемого (RTL) кода, следует упомянуть о директивах синтеза, не являющихся элементами языка Verilog. Они задаются в поле комментария и игнорируются при моделировании, но управляют средством синтеза, например:

// synopsis synthesis off

$write(«this string is ignored by synthesis»);

// synopsis synthesis on

Для уже упоминавшегося case существует директива синтеза (выбирающая синтез в последовательную или параллельную логику), которая может быть указана в поле комментария:

// ambit synthesis case = full | parallel | mux

Однако данный механизм нестандартен и его использование оправдано в редких случаях.

СОЗДАНИЕ ОПИСАНИЙ БЛОКОВ КОДИРОВАНИЯ ДЕКОДИРОВАНИЯ ХЭММИНГА

1. Создать Verilog описание блоков, осуществляющих кодирование – декодирование байта данных кодом Хэмминга. Проверить правильность их функционирования.

Исходные данные для блока кодирования: входной байт поступает на вход INPUT_DATA. Кодирование осуществляется по переднему фронту сигнала CLK. Выходной порт OUTPUT разрядности 12.

Формирование OUTPUT[11:0]

OUTPUT_CODE[11] – INPUT_DATA[7]

OUTPUT_CODE [10] – INPUT_DATA [6]

OUTPUT_CODE [9] – INPUT_DATA [5]

OUTPUT_CODE [8] – INPUT_DATA [4]

OUTPUT_CODE [7] – INPUT_DATA [7]^INPUT_DATA [6]^INPUT_DATA [5]^INPUT_DATA [4]

OUTPUT_CODE [6] – INPUT_DATA [3]

OUTPUT_CODE [5] – INPUT_DATA [2]

OUTPUT_CODE [4] – INPUT_DATA [1]

OUTPUT_CODE [3] – INPUT_DATA [7]^INPUT_DATA [3]^INPUT_DATA [2]^INPUT_DATA [1]

OUTPUT_CODE [2] – INPUT_DATA [0]

OUTPUT_CODE [1] – INPUT_DATA [6]^INPUT_DATA [5]^INPUT_DATA [3]^INPUT[2]^INPUT_DATA [0]

OUTPUT_CODE [0] – INPUT_DATA [6]^INPUT_DATA [4]^INPUT_DATA [3]^INPUT[1]^ _DATA INPUT[0]

Исходные данные для блока декодирования: входные данные поступают на вход INPUT_CODE [11:0]. Декодирование осуществляется по переднему фронту сигнала CLK. Выходной порт OUTPUT_DATA разрядности [7:0].

Формирование OUTPUT_DATA

OUTPUT_DATA[7] – INPUT_CODE[11]

OUTPUT_ DATA [6] – INPUT_ CODE [10]

OUTPUT_ DATA [5] – INPUT_ CODE [9]

OUTPUT_ DATA [4] – INPUT_ CODE [8]

OUTPUT_ DATA [3] – INPUT_ CODE [6]

OUTPUT_ DATA [2] – INPUT_ CODE [5]

OUTPUT_ DATA [1] – INPUT_ CODE [4]

OUTPUT_ DATA [0] – INPUT_ CODE [2]

Для определения ошибки и ее позиции рассчитывается синдром.

SND[0] = INPUT_CODE[10]^ INPUT_CODE[8]^ INPUT_CODE[6]^INPUT_CODE[4]^ INPUT_CODE[2]^ INPUT_CODE[0] SND[1] = INPUT_CODE[10]^ INPUT_CODE[9]^ INPUT_CODE[6]^INPUT_CODE[5]^ INPUT_CODE[2]^ INPUT_CODE[1] SND[2] = INPUT_CODE[11]^ INPUT_CODE[6]^ INPUT_CODE[5]^INPUT_CODE[4]^ INPUT_CODE[3]

SND[3] = INPUT_CODE[11]^ INPUT_CODE[10]^ INPUT_CODE[9]^INPUT_CODE[8]^ INPUT_CODE[7]

Если синдром равен 4'b0000, значит ошибки нет. В противном случае, он указывает позицию ошибки в INPUT_CODE. Например, если синдром равен 4’b0101, то ошибка произошла в четвертом бите INPUT_CODE и для исправления надо просто проинвертировать четвертый бит.

OUTPUT_ DATA [1] – ~INPUT_ CODE [4]

СОЗДАНИЕ ОПИСАНИЙ БАЗОВЫХ ЯЧЕЕК

1. Создать Verilog описание инвертора и тестовый модуль для проверки правильности его функционирования (два разных модуля).

module inverter (Q,IN);

output Q; input IN;

reg Q;

always @(IN) Q = ~IN;

endmodule

module testbench;

reg Inv_in; wire Out;

initial begin

Inv_in=1’b0;

Примечание [s1]: Имя модуля Примечание [s2]: Список выводов модуля

Примечание [s3] : Описание типов выводов модуля

 

 

 

 

 

 

 

 

 

 

 

 

 

#100;

 

 

 

 

 

 

 

Примечание [s4] : Однократно

 

$stop;

 

 

 

 

 

 

повторяющийся процесс

 

 

 

 

 

 

 

 

 

 

 

End

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

always

 

Примечание [s5] : Задержка на 20

 

 

 

временных единиц

 

 

 

begin

 

 

 

 

 

 

 

 

 

 

 

 

 

 

#20;

 

 

 

 

 

 

 

 

 

 

 

 

Inv_in=~Inv_in;

 

 

 

 

End

 

 

 

Примечание [s6] : Название типа

 

 

 

 

 

 

 

 

 

 

подключенного модуля

 

 

 

 

 

 

 

 

 

 

Примечание [s7]: Уникальное имя

 

 

 

 

 

 

 

 

 

 

элемента схемы

inverter

 

I1

 

(.Q(Out),.IN(Inv_in));

 

 

Примечание [s7]: Подключение

 

 

 

 

 

 

 

 

 

 

выводов модуля к внутренним

 

 

 

 

 

 

 

 

 

 

сигналам testbench

endmodule

 

 

 

 

 

 

 

 

2. Создать Verilog описание элемента И-НЕ и тестовый модуль для проверки правильности его функционирования (два разных модуля).

Данные: название входных пинов элемента И-НЕ – IN1,IN2. Выходного – Q.

3. Создать Verilog описание flip-flop триггера и тестовый модуль для проверки правильности его функционирования (два разных модуля).

Данные: название пина данных – D, тактовый вход – C, выходной пин – NQ. Работа по положительному фронту, NQ равно инверсному значению D.

4. Создание Verilog описания 4-х разрядного сдвигового регистра на flip-flop и тестового модуля для его проверки. Схема устройства представлена ниже. Сделать два типа описания –когда сдвиговой регистр представляет собой соединение(netlist) четырех flip-flop (получается один модуль – сам flip-flop, второй – соединение четырех модулей flip-flop, третий модуль – testbench) и когда модуль сдвигового регистра состоит из 4-х процессов (получается только два модуля – сам сдвиговой регистр и testbench). Значение OUT[3:0] по умолчанию 0000b

СОЗДАНИЕ ОПИСАНИЙ БЛОКОВ ОЗУ и 32 – РАЗРЯДНОГО ТАЙМЕРА

1. Создать Verilog описание блока ОЗУ. Объем ОЗУ – 1Кб.

Входные данные:

Шина входных данных – DATA_IN, запись с нее побайтно. Шина выходных данных – DATA_OUT, выдача на нее побайтно. Тактовый сигнал – CLK.

Сигнал записи – WR. Запись осуществляется по положительному уровню

WR и CLK.

Чтение осуществляется по положительному уровню CLK

Рассчитать требуемую размерность шины адреса – ADDR, необходимую для адресации данного объема памяти. Если есть необходимость введения дополнительных сигналов, сделать это самостоятельно

Массив памяти описывается следующим образом

reg [7:0] mem [255:0]; // 256 байт памяти.

2.Создать тестовое окружение для блока памяти.

3.Создать Verilog описание 32разрядного блока таймера – счетчика (на flipflop).

Входные данные:

Входная шина – COUNT_IN[31:0]

Шина выходной счета – COUNT_OUT[31:0] Сигнал записи в таймер с шины COUNT_IN – WR Сигнал асинхронного сброса таймера – RESET

Инкрементирование значения таймера каждый положительный фронт CLK

Инкрементирование описывается следующим образом:

COUNT_OUT<=COUNT_OUT+1;

4. Создать тестовое окружение для блока таймера-счетчика.

СОЗДАНИЕ ОПИСАНИЙ БЛОКА ПОСЛЕДОВАТЕЛЬНОЙ ВЫДАЧИ ДАННЫХ

1. Создать Verilog описание блока последовательной выдачи данных. Структурная схема разрабатываемого устройства представлена ниже.

Принцип работы:

В регистр данных записываются в параллельном виде данные, которые необходимо передать. WR_DATA – сигнал записи в регистр, CLK – тактовый

вход, RESET – сигнал сброса (по нему значение в регистре обнуляется). 8-ми разрядный счетчик каждый положительный фронт сигнала CLK инкрементируется и когда его значение становится равным FFh, то вырабатывается сигнал переполнения. В этот момент регистр сдвига осуществляет сдвиг данных вправо (в сторону младших разрядов), а «выпадающий» разряд передает на TxD. Т.о. происходит последовательная передача данных.

Если необходимо введение дополнительных сигналов, то ввести их самостоятельно.

2. Создать testbench разрабатываемого устройства и произвести проверку правильности его функционирования.

P.S. Стандарт описания Verilog можно найти по адресу

\\L356diamond\Docs_stud\1364_2001.pdf

СОЗДАНИЕ ОПИСАНИЙ БЛОКА ПОСЛЕДОВАТЕЛЬНОЙ ВЫДАЧИ ДАННЫХ

1. Модернизировать разработанное на предыдущем занятии устройство.

а) ввести возможность изменения скорости передачи. Для этого дополнить счетчик 8-ми разрядным регистром, в котором будет храниться число, по достижении которого счетчик будет обнуляться и одновременно передаваться бит информации.

б) ввести стартовый нулевой бит и стоповый единичный (т.е если данные 01011111, то порядок передачи по каналу связи 0-1-1-1-1-1-0-1-0-1)

в) передавать информацию только один раз. Т.е. на каждую запись регистра данных должно приходиться одна передача.

г) перед передачей кодировать информацию кодом Хэмминга (изучалось). Соответственно, передаваться информация будет с избыточными битами.

2.Создать тестовое описание разрабатываемого устройства.

3.Рассчитать максимальную и минимальную скорости передачи (байт/с) при входной тактовой частоте 50 МГц. Рассчитать скорость передачи полезной информации.

P.S. Стандарт описания Verilog можно найти по адресу

\\L356diamond\Docs_stud\1364_2001.pdf

СОЗДАНИЕ ОПИСАНИЙ БЛОКА ПОСЛЕДОВАТЕЛЬНОГО ПРИЕМА ДАННЫХ

1. Создать описание приемника сигналов для разработанного на предыдущих

занятиях передатчика. Прием – асинхронный, означает, что мы не знаем точного момента начала передачи информации. Известна только скорость передачи, значение которой хранится в регистре BAUDE_RATE. Определение начала передачи определяется по стартовому биту (переключение из 1 в 0).

P.S. Стандарт описания Verilog можно найти по адресу

\\L356diamond\Docs_stud\1364_2001.pdf