
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА»
(СПбГУТ)
ФАКУЛЬТЕТ ИНФОКОММУНИКАЦИОННЫХ СЕТЕЙ И СИСТЕМ (ИКСС)
КАФЕДРА ПРОГРАММНОЙ ИНЖЕНЕРИИ И ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ (ПИ И ВТ)
ДИСЦИПЛИНА: «Архитектура вычислительных систем»
Лабораторная работа №6 (индивидуальное задание) Вариант 6
Выполнили:
Цыганков М.А.
Тюришев М.А.
Козлов Н.С.
Подпись____________
Приняла:
Неелова О.Л.
Подпись____________
«_____»________ 2022
Задание
Включение двигателя автомобиля. S0 – начальное состояние.
S1 – установка ключа. Этот сигнал получаем с тумблера T0. Ключ включает счетчик тактов. После включения счетчика время удержания состояния 2 такта. Состояние выхода – --.
S2 – проверка кода. Время удержания 4 такта. Состояние выхода – __. Сигнал, имитирующий код, подается с тумблеров. При несовпадении переход в S6. При совпадении кода переход на проверку состояния топлива и масла – S3.
S3 – проверка уровня масла и наличия топлива в баке. При наличии хотя бы одного из предупреждений автомат не перейдет к включению двигателя. Если предупреждений нет, переход в S4.
S4 – включение двигателя. Состояние выхода F. Время удержания 3 такта. За это время необходимо имитировать дальнейший поворот ключа с помощью тумблера T1, что приведет к приостановке счетчика тактов. Переход в S5.
S5 – ожидание выключения двигателя. Ключи (Т1 и Т0) приводятся в исходное положение. Переход к S1.
S6 – индикация несовпадения кода. На индикаторе горит “A”. Ключ (T0) возвращается в исходное положение. Время удержания 3 такта, переход в
S1.
Блок-схема устройства
Результат работы общего файла
Код
Общий(all) module all
(input wire clk,reset,flag,flag1,key1,key2, input wire[3:0]code,
output [6:0]hex); wire sync; wire[3:0]out; main_s0
block1(.clk(sync),.key1(key1),.key2(key2),.flag(flag),.flag1(flag1),.reset(reset),.out(out),.code(c
ode));
count_div2 block2(.clk(clk),.sync(sync)); coder block3(.data(out),.seg(hex)); endmodule
count_div2 module count_div2
#(parameter N = 2, M = 2'd2) (input wire clk,
output reg sync = 0, output wire [N-1:0] q); reg [N-1:0] cnt = 0; wire [N-1:0] cnt_next; assign q = cnt;
assign cnt_next = cnt + 1'b1; always@(posedge clk) begin
cnt <= cnt_next; sync <= sync; if(cnt == M-1)
begin cnt <= 0;
sync <= ~sync; end
end endmodule
main_s0 module main_s0
(input clk, key1, key2, reset, flag,flag1, input[3:0]code,
output reg [3:0] out); reg[2:0] state; reg[1:0] cnt;
reg[3:0] code1 = 4'd5; reg[3:0] keycode;
parameter Res=0,Wait=1,key_read1=2,key_read2=4, A_out=3,B_out=5,Fire=6,Drive=7; always@(posedge clk or posedge reset)
begin if(reset)state<=Res;
else |
|
begin |
|
case(state) |
// ------------ State 1 |
Res:state<=Wait;
Wait:if(cnt==2'd2) state<=key_read1; key_read1:if(flag)state<=A_out; else state<=Wait;
A_out: if(cnt== 2'd4 && key1 && key2) state<=key_read2;
else state<=Wait;
key_read2: if(keycode==code1 && cnt<=2'd3) state<=B_out; else state <=Fire;
B_out: if(flag1)
state<=Drive;
Drive:if(!flag|!flag1)
state<=Wait;
Fire:
state<=Wait;
default:state<=Res; endcase
end end
always@(posedge clk) begin
case(state)
Res: begin cnt<=2'd0;
out<=2'b00; end
Wait: begin
if(cnt==2'd2) begin cnt<=2'd0; out<=4'd1; end
else begin
cnt<=cnt+2'd1; end
end A_out: begin
if(cnt==2'd4) begin cnt<=2'd0; out<=2'd1; keycode<=code; end
else begin out<=2'd0;
cnt<=cnt+2'd1; end
end key_read2: begin if(cnt==2'd3) begin cnt<=2'd0; out<=2'd1;
end else begin
cnt<=cnt+2'd1; end
end endcase end endmodule
coder module coder
(input wire [3:0]data, output wire [6:0]seg); reg [6:0]code;
assign seg=code; always@* case(data)
4'b0000:code = 7'b0000000; 4'b0001:code = 7'b1111001; 4'b0010:code = 7'b0100100; 4'b0011:code = 7'b0110000; 4'b0100:code = 7'b0011001; 4'b0101:code = 7'b0010010; 4'b0110:code = 7'b0000010; 4'b0111:code = 7'b1111000; 4'b1000:code = 7'b0000000; 4'b1001:code = 7'b0010000; // digit 4'b1010:code = 7'b0001000; // A 4'b1011:code = 7'b0111111; // B to - 4'b1100:code = 7'b1000110; // C 4'b1101:code = 7'b0100001; // D 4'b1110:code = 7'b0000110; // E 4'b1111:code = 7'b0001110; // F endcase
endmodule