Изучение методики реализации конечных автоматов среде Intel Quartus Prime на языке SystemVerilog
Автор: dcervwcf3 • Май 16, 2023 • Лабораторная работа • 5,571 Слов (23 Страниц) • 142 Просмотры
ОГЛАВЛЕНИЕ
ЦЕЛЬ РАБОТЫ 3
ЧАСТЬ 1 3
ЧАСТЬ 2 4
ЧАСТЬ 3 5
ИНДИВИДУАЛЬНОЕ ЗАДАНИЕ 12
ВЫВОД 17
ЦЕЛЬ РАБОТЫ: изучение методики реализации конечных автоматов в среде Intel Quartus Prime на языке SystemVerilog. Реализация и моделирование конечного автомата согласно варианту.
ЧАСТЬ 1
Счетчик в виде уравнений
Задание:
[pic 1]
Код
module ka(
input logic clk, reset, ena,
output logic [2:0] q
);
always_ff @(posedge clk or negedge reset)
begin
if (!reset) q<=0;
else
begin
q[0]<=((!q[1]&!q[2]&ena)|(q[1]&q[2]&ena));
q[1]<=((!q[0]&q[1]&ena)|(q[0]&!q[2]&ena));
q[2]<=((!q[0]&q[1]&ena)|(q[0]&q[2]&ena));
end
end
endmodule
Тестбэнч
module ka_tb;
logic clk, reset, ena;
logic [2:0] q;
initial begin
clk = 0;
reset = 0;
#10 reset = 1;
forever #5 clk=~clk;
end
initial begin
ena = 1;
#130 ena = 0;
end
initial begin
#150 $stop;
end
ka uut_inst(clk, reset, ena, q);
endmodule
Моделирование
[pic 2]
Рис. 1. Временная диаграмма работы счетчика.
ЧАСТЬ 2
Счетчик в виде конечного автомата
Задание:
[pic 3]
Код
module ka(
input logic clk, clrn, t,
output logic [2:0] q
);
enum logic [2:0]{S0,S1,S2,S3,S4,S5,S6,S7} state, next_state;
always_ff @(posedge clk or negedge clrn)
begin
if (!clrn) state<=S0;
else state<=next_state;
end
always_comb begin
case(state)
S0: if (t)
next_state=S1;
else
next_state=S0;
S1: if (t)
next_state=S2;
else
next_state=S0;
S2: if (t)
next_state=S3;
else
next_state=S0;
S3: if (t)
next_state=S4;
else
next_state=S0;
S4: if (t)
next_state=S5;
else
next_state=S0;
S5: if (t)
next_state=S6;
else
next_state=S0;
S6: if (t)
next_state=S7;
else
next_state=S0;
S7: if (t)
next_state=S0;
else
next_state=S0;
endcase
end
always_comb begin
case(state)
S0:q=3'b000;
S1:q=3'b001;
S2:q=3'b011;
S3:q=3'b010;
S4:q=3'b110;
S5:q=3'b111;
S6:q=3'b101;
S7:q=3'b100;
endcase
end
endmodule
Тестбэнч
module ka_tb;
logic clk, reset, ena;
logic [2:0] q;
initial begin
clk = 0;
reset = 0;
#10 reset = 1;
forever #5 clk=~clk;
end
initial begin
ena = 1;
#130 ena = 0;
...