Understanding Digital Logic Design
Дополнительные материалы для объединенного семинара MIPSfpga и Connected MCU от Imagination Technologies
Октябрь-Ноябрь 2016
Контрольная работа 2.2 - Комбинационная и последовательная логика
Имя ___________________________________________________________________
Понятия блокирующих и неблокирующих присвоений в SystemVerilog,
Комбинационные и последовательные always-блоки, их моделирование и синтез.
Для каждой тестируемой конструкции (dut1-dut16) показаны соответствующие схемы
и соответствующий временные диаграммы:
module dut1 module dut2
( (
input clk, input clk,
input [7:0] d, input [7:0] d,
output logic [7:0] q output logic [7:0] q
); );
always @(posedge clk) always_ff @(posedge clk)
q <= d; q <= d;
endmodule endmodule
module dut3 module dut4
( (
input clk, input clk,
input [7:0] d, input [7:0] d,
output logic [7:0] q output logic [7:0] q
); );
logic [7:0] r; logic [7:0] r;
always @(posedge clk) always @(posedge clk)
begin begin
r <= d; q <= r;
q <= r; r <= d;
end end
endmodule endmodule
module dut5 module dut6
( (
input clk, input clk,
input [7:0] d, input [7:0] d,
output logic [7:0] q output logic [7:0] q
); );
always @* always_comb
q = d; q = d;
endmodule endmodule
module dut7 module dut8
( (
input clk, input clk,
input [7:0] d, input [7:0] d,
output logic [7:0] q output logic [7:0] q
); );
logic [7:0] r; logic [7:0] r;
always @(posedge clk) always @(posedge clk)
r <= d; q <= r;
always @(posedge clk) always @(posedge clk)
q <= r; r <= d;
endmodule endmodule
module dut9 module dut10
( (
input clk, input clk,
input [7:0] d, input [7:0] d,
output logic [7:0] q output logic [7:0] q
); );
logic [7:0] r; logic [7:0] r;
always @* always @(posedge clk)
r = d; q <= r;
always @(posedge clk) always @*
q <= r; r = d;
endmodule endmodule
module dut11 module dut12
( (
input clk, input clk,
input [7:0] d, input [7:0] d,
output logic [7:0] q output logic [7:0] q
); );
logic [7:0] r;
assign r = d; wire [7:0] r = d;
always @(posedge clk) always @(posedge clk)
q <= r; q <= r;
endmodule endmodule
module dut13 module dut14
( (
input clk, input clk,
input [7:0] d, input [7:0] d,
output logic [7:0] q output logic [7:0] q
); );
logic [7:0] r; logic [7:0] r;
assign r = d; assign q = r;
assign q = r; assign r = d;
endmodule endmodule
module dut15_not_a_good_style module dut16_bad_style
( (
input clk, input clk,
input [7:0] d, input [7:0] d,
output logic [7:0] q output logic [7:0] q
); );
logic [7:0] r; logic [7:0] r;
always @(posedge clk) always @(posedge clk)
begin begin
r = d; q <= r;
q <= r; r = d;
end end
endmodule endmodule
Тестовый код используемый для генерации временных диаграмм
module testbench;
logic clk;
logic [7:0] d, q;
dut dut (clk, d, q);
initial
begin
clk = 0;
forever
#10 clk = ! clk;
end
initial
begin
$dumpvars ();
for (int i = 0; i < 10; i++)
begin
@(posedge clk);
#15;
d = i;
end
$finish;
end
endmodule
A)
B)
C)
X)
Y)
Z)
17. Какая задержка проиллюстрирована на рисунке ниже (отмечена знаком «?»)?
a) Задержка распространения tpcq = период времени после фронта тактового сигнала, после окончания которого выход Q будет гарантированно стабильным (т.е, прекратит изменяться)
b) Задержка реакции tccq = период времени после фронта тактового сигнала, после окончания которого Q может быть нестабильным (т.е., начать изменяться)
c) Расфазировка: различие между двумя тактовыми фронтами. Тактовые сигналы не поступают во все регистры в одно и тоже время.
18. Какая задержка проиллюстрирована на рисунке ниже (отмечена знаком «?»)?
a) Время предустановки: tsetup = период времени перед фронтом тактового сигнала, в течении которого данные должны быть стабильными (т.е. не изменяться)
b) Время удержания: thold = период времени после фронта тактового сигнала, в течении которого данные должны быть стабильными
c) Апертурное время: ta = общее время в окрестности фронта тактового сигнала, в течении которого данные должны быть стабильными (ta = tsetup + thold)
d) Tc = максимальная и минимальная задержка между регистрами
19. Какое правило присвоения сигнала нарушается в следующем коде?
a) Синхронная последовательная логика: использован always @(posedge clk) или always_ff @(posedge clk)
и неблокирующее присвоение (<=)
always_ff @ (posedge clk)
q <= d; // nonblocking
b) Простая комбинационная логика: использовано непрерывное присвоение (assign�)
assign y = a & b;
c) Более сложная комбинационная логика: использован always @* или always_comb и блокирующие присвоение (=)
d) Сигнал изменяется только одним оператором always или оператором непрерывного присваивания
e) Этот код не нарушает никаких правил для назначения сигнала
module pattern_fsm_moore
(
input clock,
input resetn,
input a,
input b,
output y
);
parameter [1:0] S0 = 0, S1 = 1, S2 = 2, S3 = 3;
reg [1:0] state, next_state;
// state register
always @ (posedge clock or negedge resetn)
if (! resetn)
state = S0;
else
state = next_state;
// next state logic
always @*
case (state)
S0: next_state = a ? S0 : S1;
S1: next_state = a ? S1 : S2;
S2: next_state = S3;
S3: next_state = a ? S2 : b ? S0 : S1;
endcase
// output logic
assign y = (state == S3);
endmodule
Контрольная работа составлена Юрием Панчулом