Лекция 1. DE0-Nano. Синтаксис Verilog. Управляющие автоматы (В.В. Подымов, М.С. Шуплецов - Лекции и семинары), страница 2
Описание файла
Файл "Лекция 1. DE0-Nano. Синтаксис Verilog. Управляющие автоматы" внутри архива находится в папке "В.В. Подымов, М.С. Шуплецов - Лекции и семинары". PDF-файл из архива "В.В. Подымов, М.С. Шуплецов - Лекции и семинары", который расположен в категории "". Всё это находится в предмете "пакеты проектирования сверхбольших интегральных схем" из 7 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 2 страницы из PDF
Width ( 3 ) ) (< arguments >)Iбез указания параметров — тогда подставляется значениепо умолчаниюr e g i s t e r r (< arguments >)Лекция 1Часть 2Управляющие автоматыВведение: зачем нужен управляющий автомат8loadresetclock1register8+Эта схема определяет то, как преобразуются данные, то естьоперационный автоматВ зависимости от того, что подаётся на входные сигналы load,reset, clock, данные, записанные в регистр, могутIоставаться такими же, как и былиIувеличиваться на единицуIсбрасываться в нольВведение: зачем нужен управляющий автомат8loadresetclock1register8+А как заставить регистр делать то, что мы хотим?1. Подвести ко входам регистра имеющиеся элементыуправления (в DE0-Nano — KEY[i], SW[i], CLOCK_50) иуправлять регистром, нажимая на кнопки и щёлкаявыключателями2.
Заставить схему делать эту работу за насIчто особенно полезно, если управляющих входов больше,чем элементов управления, а часто без этого в принципене обойтисьВведение: зачем нужен управляющий автомат8loadresetclock1register8+Схема, которая выставляет за нас управляющие сигналы нужным образом в нужные моменты времени — это управляющийавтоматПростенькая задачкаА как разработать подходящий управляющий автомат?Те, кто выпускались бакалаврами с нашей кафедры:вспоминаем далёкий первый курс, а заодно чуть менее далёкийчетвёртый — знания об автоматах-преобразователях с этихкурсов очень даже могут пригодитьсяНачнём с такой задачки: регистр должен посчитать числаот ноля до двух и остановитьсяМожно пошагово расписать последовательность действий,которые должен сделать регистр, чтобы эту задачку решить:1. записать в себя ноль2.
прибавить единицу3. прибавить единицу4. остановитьсяАвтоматыЧто такое автомат?IУ него есть конечное множество состоянийIОбщаясь с внешней средой, он переходит из одногосостояния в другое в дискретном времени (т.е. пошагово)IВ зависимости от текущего состояния, он выдаёт нечто навыход, то есть во внешнюю среду (автомат Мура)IСовершая переход, он также способен выдавать нечто навыход (автомат Мили)in1 /out3out0out1in3 /out5in2 /out4in4 /out6out2Автоматы1. записать в себя ноль2. прибавить единицу3. прибавить единицу4.
остановитьсяПопробуем записать этот алгоритм в автоматном видеОткуда взять дискретное время?Есть входной провод CLOCK_50, и можно дискретно отсчитывать моменты времени по передним фронтам приходящих отнего сигналовАвтоматы1. записать в себя ноль2. прибавить единицу3. прибавить единицу4. остановитьсяПопробуем записать этот алгоритм в автоматном видеОткуда взять состояния?Четыре пункта алгоритма — это, по большому счёту, четыре состояния:Iкаждый пункт точно описывает, что автомат долженпослать во внешнюю среду (то есть в операционныйавтомат )Iкаждый пункт может быть сделан за один такт времениАвтоматы1. записать в себя ноль2.
прибавить единицу3. прибавить единицу4. остановитьсяПопробуем записать этот алгоритм в автоматном видеКак соединить между собой эти состояния?По цепочке от предыдущего к следующему, не обращая внимания на то, что происходит во внешней средеАвтоматы1. записать в себя ноль2. прибавить единицу3. прибавить единицу4. остановитьсяПопробуем записать этот алгоритм в автоматном видеЧто когда выдавать на выход?При переходе ничего не нужно делать (в более сложных случаяхможет понадобиться, но не тут )В каждом состоянии достаточно выставить нужные сигналы навходах load и reset регистра:Iвыставляем reset = 0 — регистр сбрасывается(немедленно)Iвыставляем load = 0 — значение в регистреувеличивается (по переднему фронту CLOCK_50 )Автоматы1. записать в себя ноль2.
прибавить единицу3. прибавить единицу4. остановитьсяПопробуем записать этот алгоритм в автоматном видеДиаграмма автомата (диаграмма Мура?) автомата, описывающего алгоритм:resetloadload—Взаимодействие операционного иуправляющего автоматовИ как это всё будет выглядеть “в железе”?Чтобы всё заработало, достаточно заиметь и верно соединить:IIоперационный автомат: коробочку, в которой всё работаетоднозначно, кроме сигналов load, reset, clockуправляющий автомат:IIIдля нормальной работы требуется дискретное время(clock) и инициализация (reset)основное назначение — в нужное время в нужном порядкевыставлять сигналы load, resetтактовый генератор CLOCK_50resetclockУпр.Авт.CLOCK_50loadresetclockОп.Авт.Решение задачкиРегистр:inWidthloadresetclockregisterWidthoutmodule r e g i s t e r#(parameter Width = 8 )( i n p u t [ Width − 1 : 0 ] i n ,output reg [ Width − 1 : 0 ] out ,input load , r e s e t , c l o c k);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Решение задачкиСумматор:yxWidthWidthadderWidthomodule a d d e r#(parameter Width = 8 )( i n p u t [ Width − 1 : 0 ] x ,i n p u t [ Width − 1 : 0 ] y ,output [ Width − 1 : 0 ] o);assign o = x + y ;endmoduleРешение задачкиОперационный автомат (с выводом значения регистра в LED):loadresetclockcounter8xmodule c o u n t e r ( i n p u t l o a d , r e s e t , c l o c k ,output [ 7 : 0 ] x ) ;parameter Width = 8 ;w i r e [ Width − 1 : 0 ] i n , o u t ;r e g i s t e r r ( .
i n ( i n ) , . out ( out ) , . load ( load ) ,. reset ( reset ) , . clock ( clock ));a d d e r a ( . x ( o u t ) , . y ( 8 ’ b00000001 ) , . o ( i n ) ) ;assign x = out ;endmoduleРешение задачкиУправляющий автомат:resetclockfsmloado_resetmodule fsm ( i n p u t c l o c k , r e s e t ,output reg l o a d , o _ r e s e t ) ;reg [ 1 : 0 ] c _ s t a t e , n _ s t a t e ;always @( c _ s t a t e )case ( c _ s t a t e )2 ’ b00 :beginload = 1;o_reset = 0;n _ s t a t e = 2 ’ b01 ;endРешение задачкиУправляющий автомат:resetclock2 ’ b01 :beginload = 0;o_reset =n_state =end2 ’ b10 :beginload = 0;o_reset =n_state =endfsm1;2 ’ b10 ;1;2 ’ b11 ;loado_resetРешение задачкиУправляющий автомат:resetclockfsmloado_reset2 ’ b11 :beginload = 1;o_reset = 1;n _ s t a t e = 2 ’ b11 ;endendcasealways @( posedge c l o c k , negedge r e s e t )i f (~ r e s e t ) c _ s t a t e <= 0 ;e l s e c _ s t a t e <= n _ s t a t e ;endmoduleРешение задачкиГлавный модуль (reset выведен на KEY[1], и мы, нажимая наKEY[0], генерируем тактовые импульсы):module t o p ( SW, KEY , LED , CLOCK_50 ) ;i n p u t wi re [ 3 : 0 ] SW;i n p u t wi re [ 1 : 0 ] KEY ;output [ 7 : 0 ] LED ;i n p u t wi re CLOCK_50 ;wire load , r e s e t ;c o u n t e r op_aut ( .
l o a d ( l o a d ) , . r e s e t ( r e s e t ) ,. c l o c k (KEY [ 0 ] ) , . x (LED ) ) ;fsm c_aut ( . c l o c k (KEY [ 0 ] ) , . r e s e t (KEY [ 1 ] ) ,. load ( load ) , . o_reset ( r e s e t ) ) ;endmoduleА теперь задачка посложнееХочу, чтобы счётчик работал так:I выключателями SW составляю двоичную четырёхбитнуюзапись числаI кнопкой KEY[1] запускаю алгоритмI счётчик отсчитывает с ноля до составленного числа,прибавляет единицу и останавливаетсяВ чём здесь сложности?1.
Диаграмма Мура нелинейна (есть циклы)2. Управляющий автомат, чтобы знать, что делать, долженанализировать информацию из внешнего мира3. Передавать данные в управляющий автомат — плохо(управляющий автомат должен управлять,а не вычислять)4. Значит, нужно добавить в операционный автомат схему,работающую с данными (проверяющую, досчитал лирегистр до конца) и передающую результат работы вуправляющий автоматКак изменится операционный автоматБыло:8loadresetclockregister81+Как изменится операционный автоматСтало:8loadresetclockregister8num8≤1+ltnumIДобавился блок сравненияIДобавилась входная шина numIДобавился выходной сигнал ltnum — он будетпересылаться управляющему автоматуКак будет выглядеть управляющий автоматltnumclearload—∼ltnum—module fsm ( i n p u t c l o c k , r e s e t , ltnum ,output reg l o a d , o _ r e s e t ) ;...Как будет выглядеть управляющий автоматltnumclearload...2 ’ b00 :begino_reset = 0;load = 1;n _ s t a t e = 2 ’ b01 ;end...—∼ltnum—Как будет выглядеть управляющий автоматltnumclearload...2 ’ b01 :begino_reset = 1;load = 0;n _ s t a t e = 2 ’ b10 ;end...—∼ltnum—Как будет выглядеть управляющий автоматltnumclearload—∼ltnum...2 ’ b10 :begino_reset = 1;load = 1;i f ( ltnum ) n _ s t a t e = 2 ’ b01 ;e l s e n _ s t a t e = 2 ’ b11 ;end...—Как будет выглядеть управляющий автоматltnumclearload...2 ’ b11 :begino_reset = 1;load = 1;n _ s t a t e = 2 ’ b11 ;end...—∼ltnum—Как будет выглядеть взаимодействиеуправляющего и операционного автоматовSW4’b00004 4num8resetclockУпр.Авт.ltnumloadresetclockCLOCK_50А остальную часть решения додумайте самиОп.Авт.Конец лекции 1.