mirror of
https://github.com/MPSU/APS.git
synced 2025-09-15 17:20:10 +00:00
Обновление указания по использованию присваиваний
Ранее давалось более простое правило: "Используй неблокирующее присваивание во всех блоках always", которое конфликтует с правилами, описанными в документе по присваиваниям. Правила были обновлены, таким образом, чтобы сохранить простоту и устранить конфликт.
This commit is contained in:
@@ -71,7 +71,10 @@ assign Y = S==1 ? D1 : D0;
|
|||||||
|
|
||||||
Мультиплексор можно описать в любом из этих блоков, разница будет лишь в том, к чему именно будет подключен выход мультиплексора: к проводу, регистру, или защелке.
|
Мультиплексор можно описать в любом из этих блоков, разница будет лишь в том, к чему именно будет подключен выход мультиплексора: к проводу, регистру, или защелке.
|
||||||
|
|
||||||
При присваивании внутри блоков `always` используйте специальный оператор **неблокирующего присваивания** `<=`. Бывает еще оператор **блокирующего присваивания** `=`, объяснение различий в этих операторах требует отдельного документа, поэтому на текущий момент, во избежание проблем в будущем просто запомните: **внутри любого блока always необходимо использовать только оператор неблокирующего присваивания <=**. Подробно о различиях между блокирующими и неблокирующими присваиваниями рассказано в [этом документе](Assignments.md).
|
При присваивании внутри блоков `always` используйте специальный оператор **неблокирующего присваивания** `<=`. Бывает еще оператор **блокирующего присваивания** `=`. Подробно о различиях этих операторов рассказано в [этом документе](Assignments.md). До его прочтения запомните:
|
||||||
|
|
||||||
|
- внутри блока `always_ff` необходимо использовать оператор неблокирующего присваивания (`<=`);
|
||||||
|
- внутри блока `always_comb` необходимо использовать оператор блокирующего присваивания (`=`).
|
||||||
|
|
||||||
```SystemVerilog
|
```SystemVerilog
|
||||||
logic Y;
|
logic Y;
|
||||||
|
@@ -216,25 +216,25 @@ module tequila (
|
|||||||
);
|
);
|
||||||
parameter logic [3:0] PICKLE = 4'b1100;
|
parameter logic [3:0] PICKLE = 4'b1100;
|
||||||
always_comb begin
|
always_comb begin
|
||||||
a <= 1'b0; // значения по-умолчанию
|
a = 1'b0; // значения по-умолчанию
|
||||||
b <= 1'b0;
|
b = 1'b0; // обратите внимание, что в блоке
|
||||||
c <= 1'b1;
|
c = 1'b1; // always_comb используется оператор
|
||||||
d <= 1'b0;
|
d = 1'b0; // блокирующего присваивания
|
||||||
case(cucumber)
|
case(cucumber)
|
||||||
// ... какие-то еще комбинации
|
// ... какие-то еще комбинации
|
||||||
PICKLE: begin // если на cucumber значение PICKLE
|
PICKLE: begin // если на cucumber значение PICKLE
|
||||||
c <= 1'b0;
|
c = 1'b0;
|
||||||
case (size)
|
case (size)
|
||||||
1'b0: b <= 1'b1; // если на size значение 1'b0
|
1'b0: b = 1'b1; // если на size значение 1'b0
|
||||||
1'b1: d <= 1'b1; // если на size значение 1'b1
|
1'b1: d = 1'b1; // если на size значение 1'b1
|
||||||
endcase
|
endcase
|
||||||
end
|
end
|
||||||
// ... какие-то еще обработчики
|
// ... какие-то еще обработчики
|
||||||
default: begin // так как описаны не все значения
|
default: begin // так как описаны не все значения
|
||||||
a <= 1'b0; // cucumber, то чтобы case не было
|
a = 1'b0; // cucumber, то чтобы case не было
|
||||||
b <= 1'b0; // защелки (latch) на выходе
|
b = 1'b0; // защелки (latch) на выходе
|
||||||
c <= 1'b1; // нужно обязательно добавлять
|
c = 1'b1; // нужно обязательно добавлять
|
||||||
d <= 1'b0; // default
|
d = 1'b0; // default
|
||||||
end
|
end
|
||||||
endcase
|
endcase
|
||||||
end
|
end
|
||||||
|
@@ -85,7 +85,7 @@ module turnstile_fsm(
|
|||||||
|
|
||||||
assign is_locked = state;
|
assign is_locked = state;
|
||||||
|
|
||||||
always @(posedge clk) begin
|
always_ff @(posedge clk) begin
|
||||||
if(rst) begin
|
if(rst) begin
|
||||||
state <= LOCKED;
|
state <= LOCKED;
|
||||||
end
|
end
|
||||||
@@ -128,7 +128,7 @@ module turnstile_fsm(
|
|||||||
// (!push) && coin — условие перехода в состояние UNLOCKED
|
// (!push) && coin — условие перехода в состояние UNLOCKED
|
||||||
assign green_light = (state == LOCKED) && (!push) && coin;
|
assign green_light = (state == LOCKED) && (!push) && coin;
|
||||||
|
|
||||||
always @(posedge clk) begin
|
always_ff @(posedge clk) begin
|
||||||
if(rst) begin
|
if(rst) begin
|
||||||
state <= LOCKED;
|
state <= LOCKED;
|
||||||
end
|
end
|
||||||
@@ -175,13 +175,13 @@ module turnstile_fsm(
|
|||||||
|
|
||||||
always_comb begin
|
always_comb begin
|
||||||
if(push) begin
|
if(push) begin
|
||||||
next_state <= LOCKED;
|
next_state = LOCKED;
|
||||||
end
|
end
|
||||||
else if (coin) begin
|
else if (coin) begin
|
||||||
next_state <= UNLOCKED;
|
next_state = UNLOCKED;
|
||||||
end
|
end
|
||||||
else begin
|
else begin
|
||||||
next_state <= state;
|
next_state = state;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
```
|
```
|
||||||
|
Reference in New Issue
Block a user