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

литература / Verilog_Examples_D

.pdf
Скачиваний:
0
Добавлен:
13.05.2026
Размер:
1.74 Mб
Скачать

(monostable or one-shot multivibrator), который выделяет фронт в момент его появления, он может отстать на 1 такт, но что делать – таковы правила игры.

Пример 23. Verilog-описание одновибратора.

module

monostable_multivibrator

 

(input

clk, reset,

 

 

output

reg reset_short);

 

always

@(posedge clk)

 

 

if (reset_short == 1)

reset_short

<= 0;

else if

(reset == 1)

reset_short

<= 1;

 

else

 

reset_short

<= 0;

endmodule

 

 

 

Рис. 22. RTL-схема, сгенерированная на основе кода в примере 23

4. Синтез машин с конечным числом состояний (Finite State Machines)

Кроме счетчиков и комбинационных схем важную часть проекта цифровой системы составляют устройства, способные иметь некоторые состояния, пребывать в них и переходить между ними в заданном (и необязательно циклически как у счетчика, см. рис. 23). В отечественной литературе до 90-х годов для таких устройств использовался термин

цифровой автомат, а в англоязычной литературе машины с конечным числом состояний

(Finite State Machines, FSMs) или просто машины состояний. Ввиду доминирования английской литературы по языку Verilog мы будем придерживаться английского термина «машина» и ее английской аббревиатуры FSM.

а)

б)

41

Рис. 23. Диаграмма состояний (а) цифрового автомата и (б) счетчика

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

Логика текущего состояния задается одним регистром с разрядностью, достаточной, чтобы охватить все возможные состояния разрабатываемой FSM-машины. Поскольку большинство FSM-машин требует, чтобы схемосинтезатор установил FSM-машину в известное начальное состояние, то для этой цели может быть использован или асинхронный, или синхронный сброс. В Verilog только оператор if может быть использован, чтобы описать поведение этого типа, и в случае асинхронного сброса в список чувствительности оператора always должны быть включены ключевые слова или posedgeили negedgeпо сигналу, тактирующему FSM-машину.

Логика следующего состояния лучше всего задается в Verilog, используя оператор caseв

блоке always для комбинационных схем. Данный оператор с селектором в виде текущего состояния должен описать все правила необходимых переходов из текущего состояния. Ветка по умолчанию этого оператора case освобождает вас от необходимости явно определять все возможные комбинации переменных состояний, поскольку обычно остаются несколько неиспользованных состояний, что не являются частью жизни FSM-машины. Это значительно упрощает борьбу с «тупиковыми» состояниями: куда попав однажды, FSM-машина выйти самостоятельно не может.

Способ генерации выходной логики, зависит от того, какого типа FSM-машину мы используем (Moore или Mealy), что покажем в следующих параграфах.

Для описания состояний и их кодирования может использоваться оператор parameter, поскольку он позволяет вносить изменения в назначении состояния в единственном месте, если это требуется при настройке кода. В этой главе мы покажем описание FSM-машин типа Moore и Mealy, используя Verilog-код.

4.1 Пример FSM-машины на языке Verilog

FSM-машина, представленная в Примере 24, при активации асинхронного сигнала сброса должна переводить машину к известному начальному состоянию. FSM-машина имеет единственный управляющий вход (up_down), два выхода (lasb и msb) и вход сброса.

42

Она может быть в четырех состояниях, которые назначаются двоичными значениями, используя оператор parameter. Внутренние регистровые переменные present_state

и next_state используются, чтобы описать переходы между состояниями. Переходы между состояниями описаны, используя оператор case в пределах блока always, который активизирован всякий раз, когда происходит изменение входного сигнала управления или текущего состояния. Другой оператор always используется, чтобы синхронизировать переходы между состояниями с тактовыми импульсами (по событию posedge) также как переход FSM в начальное состояние (когда происходит сброс). Схема такой FSM-машины приведена на рис. 24а. Обратите внимание на то, что FSMмашина сгенерирована в виде буферной выходной логики и двух закрытых блоков: комбинационного блока с названием next_state и регистра с названием present_state. Для понимания принципов работы этого блока в САПР Quartus II необходимо двойным щелчком левой кнопки мышки «зайти внутрь» блока FSM-машины present_state или next_state, после чего Quartus II сгенерирует схему переходов состояний данной машины конечных состояний, которая приведена на рис. 24б.

Пример 24. Машина с конечным числом состояний

module state_machine (input up_down, clk, reset, output reg lsb, msb);

reg [1:0] present_state, next_state;

parameter [1:0] st_zero = 2’b11, st_one = 2’b01, st_two = 2’b10, st_three = 2’b00;

//Combinational part

always @(up_down or present_state) begin

case (present_state)

st_zero: if (up_down == 0) begin

next_state = st_one; lsb = 0; msb = 0; end

else

 

 

begin

next_state

= st_three; lsb = 1; msb = 1;

 

end

st_one: if (up_down == 0)

begin

next_state = st_two; lsb = 1; msb = 0;

 

end

else

 

 

begin

next_state = st_zero; lsb = 0; msb = 0;

 

end

st_two: if (up_down == 0)

begin

next_state

= st_three; lsb = 0; msb = 1;

43

end

else

begin

next_state = st_one; lsb = 1; msb = 0; end

st_three: if (up_down == 0) begin

next_state = st_zero; lsb = 1; msb = 1; end

else

begin

next_state = st_two; lsb = 0; msb = 1; end

endcase

end

//Sequential part

always @(posedge clk or posedge reset)

begin if (reset) next_state = st_zero; else

present_state = next_state;

end

endmodule

а)

б)

44

Рис. 24. а) RTL-схема машины с конечным числом состояний, сгенерированная на основе кода примера 24. б) диаграмма переходов, поясняющая логику переходов состояний FSMмашины present_state

4.2 FSM-машины типа Moore

Машина состояний типа Moore имеет выходы, которые являются функцией только текущего состояния. Общая структура FSM-машины типа Moore представлена на рис. 25 с двумя функциональными блоками, которые могут быть осуществлены как комбинационные схемы:

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

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

Рис. 25. RTL-схема машины состояний Moore

Выходы обеих этих функций (next_state_logic и output_logic) - это функции соответствующих текущих состояний на их входах. Третий блок - это регистр, который

45

сохраняет текущее состояние FSM-машины. FSM-машина типа Moore может быть представлена тремя always блоками так, что каждый из них соответствует одному из функциональных блоков на рис.25:

Пример 25. FSM-машина типа Moore

module moore1(d, a, clk) ( output reg d,

input a, input clk, input e);

reg b; // выход логики, определяющей следующее состояние reg c; // текущее состояние

// [..] обозначают размер выходной шины function [..] next_state_logic;

input a, c; begin

next_state_logic=a+c;

end endfunction

function [..] output_logic; input c, e;

begin

output_logic=c+e;

end endfunction

// генерация следующего состояния always @(a or c) begin

b = next_state_logic(a, c); end

// system output always @(c or e) begin

d = output_logic(c, e); end

// state transition

always @(posedge clk) begin

c = b; end

endmodule

Более компактное описание этой архитектуры могло быть написано следующим образом:

46

Пример 26. Verilog-описание FSM-машины типа Moore

module moore2 ( output reg d, input a, input clk, input e);

reg c; // текущее состояние

// [..] обозначают размер выходной шины function [..] next_state_logic;

input a, c; begin

next_state_logic= a+c;

end endfunction

function [..] output_logic; input c, e;

begin

output_logic= c+e;

end endfunction

// system output always @(c) begin

d = output_logic ( c ) ; end

// state transition

always @(posedge clk) begin

c = next_state_logic(a, c); end

endmodule // moore2

Результат синтезирования схемы этих двух кодов будет одинаков.

47

Рис. 26. Машина состояний Moore, реализованная на основе примеров 25 и 26

Фактически FSM-машина типа Moore может часто определяться в единственном функциональном блоке, когда система не требует никакой логики между входами системы и регистрами, или никакой логики между выходом системы и регистрами. В обоих из этих случаях достаточно единственного always блока для описания поведения FSM-машины в стиле, показанном в примере 26.

В обоих этих примерах используются функции, чтобы описать схемы, формирующие следующие состояния и выхода. Они могут быть также реализованы, используя любые блоки поведенческого описания, которые комбинируют входы и местные переменные для формирования ее выходной логики. Скобки [..], приведенные в примерах 25 и 26, позволяют обозначить необходимый размер (диапазон битов) выходной шины в рабочем коде.

Различные блоки always используются, чтобы отделить описание комбинационных логических блоков от последовательностных логических блоков, которые вместе образуют одну FSM-машину.

4.3 FSM-машины типа Mealy

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

Рис. 27. RTL-схема машины состояний Mealy

FSM-машина типа Mealy может быть представлена следующим общим примером на Verilog подобно машине Moore (пример 27).

Пример 27. Verilog-описание FSM-машины типа Mealy

module mealy (d, a, clk) output d;

48

input a; input clk; reg d;

reg c; // текущее состояние

function next_state_logic; input a, c;

begin

next_state_logic= a+c;

end endfunction

function output_logic; input a, c;

begin

output_logic= a-c;

end endfunction

always @(posedge clk)

c = next_state_logic(a, c);

always @(a, c)

d = output_logic(a, c) ;

endmodule // mealy

Рис. 28. RTL-схема машины состояний Mealy, реализованная на основе примера 27

Она содержит, по крайней мере, два блока always, один из которых предназначен для генерации следующего состояния, и другой – для генерации выхода FSM-машины.

49

5. Иерархические проекты в Quartus II

Файл проекта Verilog может быть объединен с другими файлами проекта Verilog и с другими файлами проекта от различных инструментов в иерархический проект на любом уровне проектной иерархии.

Помимо примитивов Verilog интегрированная среда проектирования Quartus II обеспечивает множество других примитивов и шин, макрофункций и функций библиотек параметризованных модулей (library of parameterized module, LPM), оптимизированных по архитектуре и для определенных задач. Программист/проектировщик может использовать операторы вставки экземпляра (instance) компонента, чтобы вставить случаи примитивов, макрофункций, LPMs также, как предварительно определенные пользователем компоненты. Более полный список компонентов может быть найден в соответствующих документах Altera, включая файлы помощи в среде Quartus II. В этой главе мы показываем ряд простых примеров, как эти компоненты могут быть вставлены в пользовательский модуль. Цель этого представления – только простое ознакомление с соответствующим синтаксисом Verilog и механизмом внесения экземпляра.

5.1 Функции, определенные пользователем

Verilog позволяет создавать определенные пользователем функции. Любой проектный файл Verilog может стать определенной пользователем функцией после компиляции и генерации. Пример 28 показывает файл reg8.v, в котором содержится проект 8-битового регистра. В случае, если вы захотите использовать его в Verilog-описании другого старшего по проектной иерархии Verilog-файла, то вам придется выполнить ряд несложных записей, показанных в примере 29.

Пример 28. Verilog описание 8-битного регистра

module reg8

( output reg [7:0]q, input [7:0] d, input ena, clk);

always @(posedge clk) if (ena) q = d; endmodule

Пример 29 показывает файл reg24.v, что является проектом на языке Verilog, который описывает модуль reg24, «вызывающий» (младший по проектной иерархии) модуль reg8, не требуя никакой декларации модуля (кроме его имени) внутри себя. Три экземпляра (instances или представителей) модуля reg8, включенные в модуль reg24, названы как regA, regB и regC. При обработке такого иерархического проекта программа чтения соединения узлов (netlist reader) в Verilog-коде в среде Quartus II автоматически обращается к файлу reg8.v для информации относительно названий входов и порядка их перечисления. Когда же вы не хотите перечислять портовые переменные в

50