цифровая электроника
вычислительная техника
встраиваемые системы

 

Verilog. Базовый курс. Часть VI

Автор: Mike(admin) от 11-02-2014, 13:21

Структура If/Else


Последний основной момент Verilog, который мы разберем в рамках данного базового курса, это структура If/Else. При корректном использовании она представляет собой крайне полезный инструмент.


Сначала рассмотрим несколько правил, которые нужно соблюдать в отношении структуры If/Else в Verilog:


  • Все If/Else-выражения должны быть расположены внутри always-блока.

  • Все значения, устанавливаемые посредством структуры If/Else должны иметь тип reg.

  • Если вы присваиваете более одного reg’а, то используйте ключевые слова «begin» и «end» для определения границ структуры If/Else.

  • Для двух значений в условии используйте операторы сравнения с двумя символами, например, «&&, «==», «!=».

Прежде чем продолжить разбираться с условными конструкциями, уделим немного времени рассмотрению того, как присваивать значения переменной типа reg. Мы знаем, что reg подобен wire за исключением того, что он сам может выступать источником сигнала. Также мы знаем, что можем создать как один регистр, так и регистровую шину. В Verilog reg можно использовать как переменную в C/C++. В регистре будет храниться значение до тех пор, пока какое-либо обстоятельство не изменит его.



reg myReg;
myReg = 1'b1; // с блокирующим присвоением
myReg <= 1'b0; // с неблокирующим присвоением

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


<имя регистра> <оператор присваивания (= или <=)> <ширина шины> ' <тип переменной> <переменная>


Следует помнить, что ширина регистровой шины должна совпадать с шириной присваиваемого значения. Мы можем присвоить регистру значения различных типов, среди них двоичный тип, шестнадцатиричный, десятичный (буквенное обозначение b,h, и d, соответственно). Если в двоичном формате вы не присваиваете регистру все «1» или все «0», то для каждого разряда вам нужно обязательно указывать свой «1» или «0», например:



my_reg <= 4'b0; // правильно
my_reg2 <= 3'b010; // правильно
my_reg3 <= 4'b01; // неправильно, ширина регистра 4 бита, указано только 2

Теперь мы знаем, как присваивать значения регистрам, поэтому приведем пример с конструкцией If/Else.



module testMod(
input a,
input b,
output c
);

reg Q;

always @ (a,b) // если состояние a или b изменяется, повторно выполнить код
begin
if(a == 1'b1 || b == 1'b0)
Q <= 1'b0;
else
Q <= 1'b1;
end

assign c = Q;

endmodule

Также как и в C/C++ в Verilog возможно вкладывать структуры If/Else друг в друга:



module testMod(
input a,
input b,
output [1:0] c
);

reg Q;
reg T;

always @ (a,b) // если состояние a или b изменяется, повторно выполнить код
begin
if(a == 1'b0)
begin
Q <= 1'b0;
T <= 1'b0;
end
else if(a == 1'b1 && b == 1'b1)
begin
Q <= 1'b1;
T <= 1'b0;
end
else
begin
Q <= 1'b1;
T <= 1'b1;
end
end

assign c[0] = Q;
assign c[1] = T;

endmodule

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




Часть I


Часть II


Часть III


Часть IV


Часть V




Перевод © digitrode.ru


<Источник>


Теги: Verilog, ПЛИС



Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий