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

Языки VHDL и VERILOG в проектировании цифровой аппаратуры

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
1 Мб
Скачать
☆
Приложение 2 281
Ключевое слово описателя типа Функциональные возможности
reg Векетор любого размера
integer 32-разрядная переменная со знаком
time 64-разрядная переменная со знаком
real èëè realtime Переменная с плавающей запятой
3.2. Вид соединение (цепь, связь)
Ключевое слово
описателя подвида
wire èëè tri Простой провод (соединение, связь, цепь)
wor èëè trior Монтажное ИЛИ
wand èëè triand Монтажное И
tri0 Привязкак0втретьем состоянии
tri1 Привязкак1втретьем состоянии
supply0 Постоянный 0 (сила источника питания)
supply1 Постоянная единица (сила источника питания)
trireg
Сохранение последнего значения сигнала на шине при установле­нии ее драйверов в третье состояние
Функциональные возможности
Этот вид данных описывает связи схемы (цепи, соединения).
Соединения передают и логические значения и логические веса сигналов.
Этот вид порта подразумевается по умолчанию в случае обьявления имени порта:
как выходного порта без указания типа reg. как входного или двунаправленного порта.
Подвиды соединений: wire, wor, wand, trio и др.
3.3. Другие виды данных
Âèä, òèï Функциональные возможности
parameter
specparam
event
localparam (VERILOG-2000)-локальная константа блока specify
genvar (VERILOG-2000)-локальная переменная целого типаблока generate
Параметры (константы) служат для хранения целых, реальных чи­сел, времени, задержек или массивов строк кода ASCII. Параметры могут изменяться при каждой конкретизации модуля
Определяемая в блоке specify константа, для хранения целых чи­сел, реальных чисел, времени, задержек или массивов символов ASCII
Флаг события. Часто используемый для синхронизирования парал лельных процессов в пределах модуля тип
-
282 Приложение 2
4. Объявление данных и область видимости
4.1. Объявление данных
Синтаксис
Тип_переменной signed размер имя_переменной, имя_переменной, ... ; Тип_переменной signed размер индентификатор_массива размер_массива; Тип_соединения signed размер #(задержка) имя, имяt, ... ; Тип_соединения(вес) signed размер #(задержка) èìÿ = продолжительность ; trireg (мощностной вес) signed размер #(задержка, разброс времени) èìÿ, èìÿ, ... ; parameter имя_константы = значение, имя_константы = значение, ... ; specparam имя_константы = значение, иям_константы = значение, ... ; event имя_события, имя_события, ... ;
Данные могут быть объявлены с описателями signed (необязательный пара­метр оператора объявления).
Размер (необязательный параметр) — это диапазон в квадратных скобках (от левой границы — старший бит к правой — младший бит) изменения индексов разрядов обьявленного данного.
Границы — должны быть целые числа, параметры целого типа или константное
16
целое выражение. Максимальная длина векторов по крайней мере 65,536 бит (2
)..
размер_массива определяется содержанием скобок [первый_адрес : послед­ний_адрес].
первый_адрес è последний_адрес должены быть целыми числами.
24
Максимальный размер массива — по крайней мере 16,777,216 слов (2
).
Задержка (необязательный параметр синтаксической конструкции) может быть только на соединениях (связях, цепях).
Синтаксис — #задержка | #(задержка) |
#(з_фронта,з_среза) | #(з_фронта,з_среза,з_переключения ) |
#(мин:тип:макс ) -для всех переключений |
#(мин_з_фронта :тип_з_фронта:макс_з_фронта, мин_з_среза :тип_з_сре­за:макс_з_среза) |
#(мин_з_фронта :тип_з_фронта:макс_з_фронта, мин_з_среза :тип_з_сре­за:макс_з_среза, мин_з_перекл :тип_з_перекл:макс_з_перекл)
Где сокращение мин_з означает МИНимальная Задержка, тип_з — типовая.
Вес-сила сигнала (необязательный параметр) определен как (сила1, сила0) или (сила0, сила1). См. веса-силы сигналов.
Время_хранения (необязательный параметр) определяет интервал времени, в течение которого соединение типа trireg будет хранить старое состояние (после того, как все его драйверы отключатся).
Синтаксис конструкции разброс_времени — задержка фронта, среза, вре мя_хранения.
-
Приложение 2 283
Примеры описаний данных
Примеры
обьявлений данных
wire a1, b1, c1; 3 скалярных соединения
tri1 [9:0] d;
reg [9:0] r; 10-разрядная переменная без знака (вектор)
reg [7:0] RAM [0:2048];
wire #(5.1,3.6) c; Соединение (цепь) с разной задержкой фронта и среза wire (strong1,pull0) s =
a+b+c; trireg (small) #(0,0,5)
r_bit; reg signed [5:0] R4 ;
reg [7:0] ee[0:4095][0:2]; reg [5:0] R3= 6'b111111
integer a,b; real r;
10-разрядное cоединение — (провод, шина), привязанная к источ­нику 1 при переходе в третье состояние
Переменная-одномерный массив векторов (память); 8-разрядный, с 2 K элементов
Соединение с непрерывным присваиванием в него a+b+c и силь­ным сигналом 1
Соединение (цепь) с малой емкостью и удержанием сигнала 1 в течение 5 единиц времени
//переменная R4 со знаковым разрядом //переменная ee — двумерный массив 4096*3*8 - VERILOG-2000; //переменная R3 — задано начальное значение VERILOG-2000;
целые переменные a, b вещественное r
Описание
4.2. Область видимости данных
VERILOG имеет четыре вида пространств видимости данных
4.2.1. Глобальные имена
Видимы везде. Это имена модулей, примитивов, конфигураций и макросов (`define).
4.2.2. Локальные имена
Видимы в пределах своей области определения (если не использовать иерар­хических имен). Области: модуль, обьявление функции, обьявление процедуры, поименованная группа (begin-end fork-join).
Имена обьявленные в блоке specify действуют в нем.
Aтрибуты (VERILOG-2000) действуют в следующем за их обьявлением обьекте.
5. Операции
Арифметические
Название Пример Результат
Сложение 2+3 5 Вычитание 2-3 -1 Умножение 2*3 6 Деление цел. 2/3 0 Модуль 2 % 3 2 Степень (VERILOG-2000) 2**3 8
284 Приложение 2
Унарные арифметические
Название Пример Результат
Ïëþñ +1 1
Минус -1 -1
Минус -4'b1011 4'b0101
(4'b0101 — дополнительный код)
Логические поразрядные
Операция VERILOG Результат
Поразрядное И 4'b10x1 & 4'b0010 4'b00x0
Поразрядное ИЛИ 4'b10x1 | 4'b0010 4'b1011
Отрицание ~ 4'b10x1 4'b01x0
Исключающее ИЛИ 4'b10x1 ^ 4'b0010 4'b10x1
Исключающее НЕ ИЛИ 4'b10x1~^4'b0010 4'b01x0
Логические операции
Логическое И 4'b1011 && 4'b0010 1'b1
Логическое ИЛИ 4'b1011 || 4'b0010 1'b1
Логическое отрицание ! 4'b1011 1'b0
Унарные операции редукции
И всех разрядов &4'b1101 1'b0
ИЛИ всех разрядов | 4'b1101 1'b1
ИЛИ-НЕ всех разрядов ~| 4'b1101 1'b0
И-НЕ всех разрядов ~&4'b1101 1'b1
Исключающее ИЛИ всех разрядов ^4'b1101 1'b1
Исключающее НЕ ИЛИ всех разрядов ~^4'b1101 1'b0
Операции сравнения
Равенство 4'b1011 == 4'b0010 1'b0
Равенство чисел 5 == 6 1'b0
Неравенство 4'b1011 != 4'b0010 1'b1
Приложение 2 285
Операции отношения
Больше 4'b1011 > 4'b0010 1'b1
Меньше 4'b1011 < 4'b0010 1'b0
Больше-равно 4'b1011 >= 4'b0010 1'b1
Меньше-равно 5 <= 5 1'b1
Операции идентичности
Идентично 4'b1011 === 4'b0010 1'b0
Неидентично 4'b1011 !== 4'b0010 1'b1
Сдвиговые операции
Операция Пример Результат
Сдвиг влево 4'b1011 << 2 4'b1100
Сдвиг вправо 4'b1011 >> 2 4'b0010
*Сдвиг влево арифметический 4'sb1011 <<< 2 4'sb1100
*Сдвиг вправо арифметический 4'sb1011 >>> 2 4'sb1110
VERILOG-2000 имеет операции <<< и >>>
Разные
Конкатенация (сцепление) {3'b100,2'b11} 5'b10011
Реплика-повтор {3{2'b01}} 6'b010101
Приоритет операций — как и в обычных языках программирования — наи­больший у унарных, приоритет ИЛИ меньше, чем у И, но во избежание ошибок лучше пользоваться скобками для указания порядка вычислений.
Пример: ( ( (à+b)*c )/(m-n))
Приоритетность операций
Одноместные !~+­*/ % ** +­<< >> >>> <<< <<= >>= == != === !== &~& ^~^ |~| && || ?:
Высший приоритет
Низший приоритет
286 Приложение 2
6. Выражения
6.1. Обычные выражения
Cтроятся из литералов, имен, операций и скобок.
Пример: (F+H)* (C-D)/2 +Ì[I]&~N[2:1]
4'b1011 & 1'b1
6.2. Выражения с полями векторов и массивов
VERILOG не допускает работу с полями переменной длины. Однако его вер­сия VERILOG-2000 позволяет использовать переменные индексы полей фиксиро­ванной длины.
Пример: reg [32:0] A;reg [3:0] B; reg [7:0] C; Ñ=A[B*8 +: 8];
Помимо обычных выражений допускаются задержанные.
6.3. Задержанные выражения
Используется в операторах процедурного присваивания и является его ча­стью. Сначала оно вычисляется и через время задержки присваивается.
Пример: S<=#(TD) A+B; D=#(T2)C;
Подробнее вопросы задержек рассмотрены ниже.
6.4. Условные выражения
VERILOG допускает также условные выражения- их значение определяется условием. Например выражение (A>B) ? 3'b100:3'b111 дает результат 3'b100 если A>B истино.
Пример: x=(a>b+1)? c: (v && L)?d-1: 0;// в х присваивается условное выраже­ние.
6.5. Выделение разрядов и полей
Примеры:
reg A[6:70]; A[3]=A[4];// массив A, элемент с индексом 4
reg [0:100]B; B[7:40]=0;// вектор B, разряды 7:40 устанавливаются в ноль
6.6. Выделение элементов массивов
Примеры:
reg A1[6:70]; A1[3]=A1[4];//одномерный массив однобитовых слов
reg [0:100]B1[0:4096] B1[7]=0;// одномерный массив 101-битовых слов
reg C1[0:3][0:100] C1[8][4]=1;//VERILOG-2000 двумерный массив
Приложение 2 287
7. Последовательные операторы (процедурные)
Последовательные операторы могут употребляться в функциях, процедурах, блоках. Группа — см. ниже, это один оператор или несколько операторов в опера­торных скобках begin end или fork join.
7.1. Оператор ожидания
Вариант Пример
ожидание условия wait À1==B1;
ожидания интервала времени #10;
ожидание события @( A or B);
@(A,B);// VERILOG-2000 @negedge(C);
Если символ ; отсутствует, то ожидание становится не оператором, а услови­ем начала выполнения следующего оператора.
Примеры эквивалентов:
#4; A=B; @negedge(C);M=N; #4 A=B; @negedge(C) M=N;
7.2. Оператор присваивания переменной
Неблокирующее(<=) присваивание в переменную
Синтаксис: переменная = ожидание выражение;
Примеры: a <= b;v[2:3] <= #2 d[1:2];{v,n} <= c+d;@(posedge clk)x<=Y; (До опе­ратора @(posedge clk)x<=Y; операторы-предшественники исполнятся мгновенно, но значения переменных a, v, n изменятся только через дельта-интервал модель­ного времени, а переменной v[2:3] — лишь когда пройдет 2 интервала времени.
Блокирующее (=) присваивание в переменную
Синтаксис: переменная <= ожидание выражение;
Примеры: a = d; v[2:3]=#5 d[1:2];{v,n}= c+d;@(posedge clk)x<=Y; (пока не пройдет 5 интервалов модельного времени оператор {v,n}= c+d; не начнет испол­няться).
7.3. Условный оператор
if(выражение) оператор или группа операторов
else оператор или группа операторов
(часть else необязательна)
7.4. Оператор выбора
Обычный case
case (выражение)
выбор1: оператор или группа операторов выбор2, выбор3 : оператор или группа операторов
default: оператор или группа операторов
endcase
288 Приложение 2
Специальный вид case-casez
Использует значение Z для заполнения не используемых битов (разрядов)в условии выбора.
casez (выражение)
выбор1: оператор или группа операторов выбор2, выбор3: оператор или группа операторов
default: оператор или группа операторов
endcase
Специальный вид case-casex
Использует Z или Х значение для заполнения неиспользуемых разрядов.
casex (выражение) выбор1: оператор или группа операторов
выбор2, выбор3 : оператор или группа операторов
default: оператор или группа операторов
endcase
7.5. Оператор цикла
Имеет четыре варианта.
1. forever оператор или группа_операторов
Бесконечный цикл выполнения оператора или группы операторов.
2. repeat (выражение) оператор или группа операторов
Количество выполнений цикла может быть целым числом, переменной или выражением (значение выражения вычисляется при первом прогоне цикла)
3. while (выражение) оператор или группа_операторов
Цикл выполняется до тех пор, пока выражение истинно.
4. for (начальное_назначение; условие_продолжения; приращение) оператор или
группа_операторов
Выполняет присваивание начального значения параметру цикла.
Выполняет оператор или группу операторов тела цикла, пока условие_продол- жения истинное.
Выполняет приращение параметра в конце каждого прохода цикла.
7.6. Оператор выхода из группы
disable имя_группы;
Прекращает выполнение названной группы операторов.
7.7. Примеры последовательных операторов
Примеры использования процедурных (последовательных) операторов
// тактовый генератор clk c периодом 10, который начинает работать после 100 единиц времени initial begin clk = 0;#100 forever #5 clk = ~clk;end
Приложение 2 289
Примеры использования процедурных (последовательных) операторов
//описание последовательностной схемы - два регистра always @(posedge clk)
begin word[15:8]= word[7:0];v<=v+2; end
// комбинационная схема с сумматором и умножителем always @(a or b or sel) if (sel==0)y=a+b;elsey=a*b; //ниже то же используя возможности VERILOG-2000 always @* if (sel==0)y=a+b;elsey=a*b;
//ниже фрагмент описания управления процессора и памяти always @(posedge clk)
begin
casez (opcode) //? -синоним Z
3'b1??: data_bus = accum; 3'b000: repeat (5) @(posedge clk)
3'b011: begin : load //поименованная группа
default: $display("неверный код");
endcase
end
begin //задержка 5 тактов, потом запись в память
RAM[address] <= data_bus;address <= address + 1;
end
integer i; // i -локальная переменная for (i=0; i<2; i=i+1)//две выборки из памяти
@(negedge clk) data_bus = RAM[i];
end
8. Процедурные блоки
Процедурные блоки представляют собой параллельные операторы.
Синтаксис:
Тип_блока @(список_чувствительности)
Тип группы: имя_группы Обьявление локальных перменных Последовательные операторы
Конец_обьявления_группы
Тип_блока может быть initial или always
initial — процесс выполнения операторов в этом блоке однократен.
always — процесс выполнения операторор в процедурном блоке может повто­ряться неоднократно.
список_чувствительности — необязательный параметр.
Cинтаксис: элемент_списка1 or элемент_списка2,: // or разделяет элементы
èëè
элемент_списка1, элемент_списка2, : //VERILOG-2000
VERILOG-2000 также позволяет не перечислять имена списка указанием символа обобщенного списка чувствительности @*.
290 Приложение 2
Примеры процедурных блоков и групп Пояснение
initial
fork b=0; #10 b = 1;#20à=16'hââAA; join
always @(a or b or ci)
begin
sum=a+b+ci;
end
always @(posedge clk)
q<=d;
Блок inital выполняется однократно; fork--join группа выполняет операторы параллельно
аlways выполняет операторы многократно эквивалентные заголовки блока примера always @(a,b,ci)//VERILOG-2000 always @* //VERILOG-2000
Группа не требуется, когда в блоке всего один оператор
9. Группы операторов
Понятие группы — ( составного оператора) используется для обьединения двух или более операторов в один
begin end. — обычная группа( составной оператор)
fork join — параллельная группа. Она содержит две или более параллельных ветвей. Ее исполнение заканчивается с окончанием наиболее медленной из ветвей.
Имя_группы (необязательный параметр) создает возможность обьявлений ло­кальных переменных в группе. Досрочный выход из группы возможен с помощью оператора disable.
Объявление_локальных_переменных — необязательный параметр.
10. Процедуры и функции
10.1. Процедуры (task)
Cинтаксис
task èìÿ; // В VERILOG-2000 для рекурсивных процедур
endtask
Процедуры (подпрограммы) могут включать операторы ожидания (#, @, wait).
task read_mem; // Заголовок процедуры input [15:0] a; // Обьявление аргументов input clk;input [31:0]del; output [31:0] d; begin
@posedge clk; #(del)d<=mem[a]; // Чтение из массива
end
endtask read_mem(PC,tact,25, IR); // Вызов процедуры
// используют ключ automatic. Синтаксис: task automatic èìÿ;
обьявления входных-выходных данных
обьявления локальных переменных оператор или группа операторов
Пример подпрограммы task
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]