Скачиваний:
2
Добавлен:
21.07.2024
Размер:
375.8 Кб
Скачать

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА»

(СПбГУТ)

ФАКУЛЬТЕТ ИНФОКОММУНИКАЦИОННЫХ СЕТЕЙ И СИСТЕМ (ИКСС)

КАФЕДРА ПРОГРАММНОЙ ИНЖЕНЕРИИ И ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ (ПИ И ВТ)

ДИСЦИПЛИНА: «Архитектура вычислительных систем»

Лабораторная работа №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