Лекция 1. DE0-Nano. Синтаксис Verilog. Управляющие автоматы (В.В. Подымов, М.С. Шуплецов - Лекции и семинары)
Описание файла
Файл "Лекция 1. DE0-Nano. Синтаксис Verilog. Управляющие автоматы" внутри архива находится в папке "В.В. Подымов, М.С. Шуплецов - Лекции и семинары". PDF-файл из архива "В.В. Подымов, М.С. Шуплецов - Лекции и семинары", который расположен в категории "". Всё это находится в предмете "пакеты проектирования сверхбольших интегральных схем" из 7 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст из PDF
Пакеты проектированиясверхбольшихинтегральных схемЛектор:Подымов Владислав Васильевичe-mail:valdus@yandex.ruОсень 2016Лекция 1Часть 1Напоминание основЛогические значенияI0 — логический нольI1 — логическая единицаx — неопределённое значениеIIIнапример, в неинициализированном регистреz — состояние высокого импедансаIIоно нужно в основном для управления шиной, к которойподключено много независимых устройствв ближайшее время это значение нам не понадобитсяЛогические значенияЧто мы строим: схему, между узлами которой в реальномвремени передаются логические значениязначениеxУзел сети10задний фронт(negedge)передний фронт(posedge)времяI0 и 1 — это конкретные уровни напряженияIx — это абстракция: уровень напряжения,соответствующий неизвестному логическому значениюВвод-вывод DE0-NanoLED[7] . .
. LED[0] KEY[1] KEY[0]SW[3] . . . SW[0]CLOCK_50(и ещё GPIO, но они нам пока не нужны)Ввод-вывод DE0-NanoКак ведёт себя ввод-вывод DE0-Nano1KEY[i]010SW[i]Ввод-вывод DE0-NanoКак ведёт себя ввод-вывод DE0-NanoCLOCK_50102 · 10−8 секунд10LED[i]Verilog: модули и шины“Строительный блок” дизайна Verilog — модуль:входы(input)...теловыходы...(output)Входы и выходы (и многое другое) могут быть объединены вмассивы (индексация с ноля; при определении задаютсясмещения сначала последнего, потом первого элемента: [7:0]; востальном — как в C++)Массив проводов (входов, выходов и других) — это шина:A[2]A[1]A[0]B[1]B[0] ≡CA23BCVerilog: определение модуляЛучше всего описывать модуль в отдельном файле срасширением .v и названием, совпадающим с названиеммодуляabmod2Файл mod.v:module mod ( a , b , c ) ;input a ;input [ 1 : 0 ] b ;output [ 2 : 0 ] c ;// d e s c r i p t i o nendmodule// EMPTY LINE !3c(первый вариант )Verilog: определение модуляЛучше всего описывать модуль в отдельном файле срасширением .v и названием, совпадающим с названиеммодуляabФайл mod.v:module mod( input a ,input [ 1 : 0 ] b ,output [ 2 : 0 ] c);// d e s c r i p t i o nendmodule// EMPTY LINE !mod23c(второй вариант )Verilog: главный модульСреди модулей обязательно есть главный (top module): это иесть разрабатываемая схема, которая будет заливаться в FPGAПри работе с DE0-Nano главный модуль будет выглядеть так:CLOCK_50KEY2SW4Файл top.v:module t o p( i n p u t [ 1 : 0 ] KEY ,i n p u t [ 3 : 0 ] SW,i n p u t CLOCK_50 ,output [ 7 : 0 ] LED);// d e s c r i p t i o nendmoduletop8LEDVerilog: способы описания модуляОбычно различают два подхода к описанию модуля:Iструктурный: явно описать инстанциации (страшнаякалька с английского, будем называть их экземплярами)других модулей и связи между нимиIфункциональный: без явного описания структуры задатьвзаимосвязь входов и выходовСтруктурное описание:mm1m2m1Функциональное описание:~f (x1, x2, x3)Verilog: структурное описаниеэкземпляры модулейi1i2i3i1i2m1mm1m2m1oi1i2o1o2o3m2o1o2module m( i n p u t i 1 , i 2 , i 3 , output o1 , o2 , o3 ) ;wire w;m1 u p l e f t ( .
i 1 ( i 1 ) , . i 2 ( i 2 ) , . o (w ) ) ;m1 d o w n l e f t ( . i 1 ( i 2 ) , . i 2 ( i 3 ) , . o ( o3 ) ) ;m2 r i g h t ( . i 1 (w) , . i 2 ( o3 ) , . o1 ( o1 ) , . o2 ( o2 ) ) ;endmoduleВсе используемые имена (в том числе провода: wire)должны быть определены перед использованиемVerilog: структурное описаниенепрерывное присваиваниеiomodule t r i v i a l ( i n p u t i , output o ) ;assign o = i ;endmoduleassign провод = выражение; :Iв любой момент времени (с некоторой задержкой приизменении значения) на проводе должно быть значениевыраженияVerilog: выраженияЧто можно использовать при написании выражений:Iлогические операцииIIарифметические операцииIIнапример, a + b — это сложение двух чисел одинаковойбитности с переполнениемпобитовые операцииIIнапример, a && b — логическое Инапример, a & b — это побитовое И двух битовыхмассивов одинаковой длиныотношенияIнапример, a < b возвращает логическую 1, если число,двоичная запись которого есть a, меньше такового для b, илогический 0 иначеVerilog: выраженияЧто можно использовать при написании выражений:IконкатенацииIIредукцииIIнапример, &a — логическая 1, если все биты a — единицы,и логический 0 иначеусловияIIнапример, {a, b} — битовый массив, составленный из a иbнапример, cond ? a : b работает как в C++; condдолжно иметь логическое значение, а a и b должны иметьодинаковое число битконстантыIнапример, 0 — это логический ноль, а 5’b00110 —пятибитная двоичная запись числа 6(полный список операций спрашивайте у интернета)Verilog: функциональное описаниеблок alwaysОн выглядит так:always @( a or posedge b or negedge c )// s t a t e m e n tВ аргументе перечисляются места (например, провода), при изменении сигнала в которых должно производиться какое-то действиеВ данном случае:I при изменении логического значения в a,Iа также когда в b возникает передний фронт,Iа также когда в c возникает задний фронтДействие перезаписывает значения сигналов модуляПосле выполнения действия получившиеся значения сохраняются в проводах до следующего выполнения блокаVerilog: функциональное описаниеблок alwaysОн выглядит так:always @( a or posedge b or negedge c )begin// s e q u e n c e o f s t a t e m e n t sendДействий можно задавать много, и тогда их обычным программистским образом нужно соединить в составное действиеVerilog: функциональное описаниеблок alwaysОн выглядит так:always @( a , posedge b , negedge c )begin// s e q u e n c e o f s t a t e m e n t sendВ какой-то момент разработчики стандарта Verilog поняли, что“or” писать неудобно, так что разрешили вместо него ставитьзапятуюКакие же действия можно писать в always-блоке?Verilog: функциональное описаниеблокирующее присваиваниеalways @( b , c )beginb = c;a = b;c = a;endIПоследовательно делается следующее:IIIв b выставляется начальное значение из cв a выставляется изменённое значение из bв c выставляется изменённое значение из aБлокирующее присваивание моделирует последовательноевыполнение команд: пока присваивание не выполнено,следующие команды не выполняются(но в конечном итоге строится схема, просто она имеет хитруюструктуру с блоками памяти)Verilog: функциональное описаниенеблокирующее присваиваниеalwaysbeginb <=a <=c <=endI@( b , c )c;b;a;Одновременно делается следующее:IIIв b выставляется начальное значение из cв a выставляется начальное значение из bв c выставляется начальное значение из aВообще говоря, одновременности не бывает, но в реальнойсхеме эти действия будут выполнены близко по времени, иблоки памяти будут организованы так, чтобы выставлялисьименно начальные значенияVerilog: регистры переменныеПри выставлении сигналов в схеме могут понадобитьсядополнительные (неявные) ячейки памятиЧтобы компилятор имел возможность распознать такие местаи по необходимости синтезировать дополнительную память, вVerilog вводится понятие регистра переменной (терминологияменялась в стандарте)Всё, что появляется в присваиваниях (=, <=) слева, должнобыть обявлено как переменная:reg a , b , c ;always @( b , c )beginb = c; a = b; c = a;endВсё остальное может быть объявлено переменнойVerilog: регистры переменныеIимя не может одновременно быть переменной и проводомIв некоторых случаях (например, при встрече в левой частинепрерывного присваивания) имя не может бытьпеременнойIвсе входы и выходы являются проводами по умолчаниюIвсе входы обязаны быть проводамивыходы можно определять как переменные: достаточноIIIдописать в начале модуля reg <имя выхода>; илипри определении выхода написатьoutput reg <имя выхода>вместоoutput <имя выхода>Verilog: функциональное описаниеусловные переходыi f ( cond ) stmt ;e l s e stmt ;case ( a )3 ’ b000 : stmt ;3 ’ b010 : stmt ;3 ’ b011 : stmt ;d e f a u l t : stmt ;endcaseУсловные инструкции тоже можно писатьКак и инструкцию switch-caseОни интерпретируются обычным образом (примерно как вC++)Verilog: параметрыИногда бывает нужно написать несколько невероятно похожих,но всё же разных модулейНапример:module r e g i s t e r 3 ( i n p u t l o a d , r e s e t , c l o c k ,i n p u t [ 2 : 0 ] i n , output reg [ 2 : 0 ] o u t ) ;always @( posedge c l o c k , negedge r e s e t )i f (~ r e s e t ) o u t <= 0 ;e l s e i f (~ l o a d ) o u t <= i n ;endmodulemodule r e g i s t e r 5 ( i n p u t l o a d , r e s e t , c l o c k ,i n p u t [ 4 : 0 ] i n , output reg [ 4 : 0 ] o u t ) ;always @( posedge c l o c k , negedge r e s e t )i f (~ r e s e t ) o u t <= 0 ;e l s e i f (~ l o a d ) o u t <= i n ;endmodule...Verilog: параметрыЧтобы описать сразу всё разнообразие модулей, отличающихсятолько какими-то константными значениями (например,регистры — размером шины), достаточно описать один модульс соответствующими параметрами:module r e g i s t e r#(parameter Width = 5 )( input load , r e s e t , clock ,i n p u t [ Width − 1 : 0 ] i n ,output reg [ Width − 1 : 0 ] o u t);always @( posedge c l o c k , negedge r e s e t )i f (~ r e s e t ) o u t <= 0 ;e l s e i f (~ l o a d ) o u t <= i n ;endmoduleVerilog: параметрыЧтобы описать сразу всё разнообразие модулей, отличающихсятолько какими-то константными значениями (например,регистры — размером шины), достаточно описать один модульс соответствующими параметрами:Или так:module r e g i s t e r ( l o a d , r e s e t , c l o c k , i n , o u t ) ;parameter Width = 5 ;input load , r e s e t , c l o c k ;i n p u t [ Width − 1 : 0 ] i n ;output reg [ Width − 1 : 0 ] o u t ;always @( posedge c l o c k , negedge r e s e t )i f (~ r e s e t ) o u t <= 0 ;e l s e i f (~ l o a d ) o u t <= i n ;endmoduleVerilog: параметрыparameter Width = 5 ;Параметр можно писать вместо числа почти везде в модуле(нельзя — в константах на месте размера)Значение параметра по умолчанию указывается при егоопределении (здесь — 5)Экземпляр параметризованного модуля может быть вызвандвумя способами:Iс явным указанием параметров (указание параметров —такое же, как и входов-выходов)r e g i s t e r r #(.