블로그 이미지
조이키트 블로그
아두이노, 라즈베리파이, 반도체 센서/모듈 활용

calendar

1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30

Notice

250x250

'Verilog 설계'에 해당되는 글 1

  1. 2020.07.28 4층 엘리베이터 Verilog로 설계
2020. 7. 28. 09:48 Verilog 설계
728x90
반응형

1. 설계 구현

1) 1~4층 엘리베이터 구현한다.
(1) 각 층에서 원하는 층으로 자유롭게 이동 가능하게 한다.
(2) 층간 이동시 층은 차례대로 이동한다.
(3) 예를 들면 1층에서 4층으로 이동할 때 : f1>up2>f2>up3>f3>up4>f4
(4) 엘리베이터 탑승가능 인원은 1~9명이고, 인원 초과 시 정지 후 알람이 울린다.
(5) 긴급버튼 : 입력 시 정지한 후 알람이 울린다.
(6) 이동 중(up 혹은 down state)에는 입력이 반영되지 않는다. 단 긴급버튼(emergency)은 가능하다.
(7) 각 층 도착 시에는 문이 열리고 닫히고, 출발/정지가 가능하다.
(8) 엘리베이터 1~4층 사이의 어느 층에서도 출발 가능하고, 출발한 엘리베이터는 1~4층 사이의 어느 층이라도 갈수 있다.
2) entity 조건
(1bit input) CLK : clock 신호
(1bit input) RESET : reset 신호
(1bit input) Emergency : 긴급 상황 버튼
(1bit input) Bell : haz state에서 bell 입력 시 문을 열려있는 상태로 만들어준다.
(4bit input) in : 이동하고자 하는 층수 입력 받는다.
(5bit input) People : elevator 탑승 인원을 입력 받는다.
(3bit output) Floor : elevator가 현재 위치한 층을 알려준다.
(1bit output) Emer_s : 긴급 상황일 때 haz state로 이동하였을 때 활성화 되는 신호이다.
(1bit output) Door : 1bit, 문의 상태를 알려준다. (1 : open, 0 : close)
(1bit output) Over : 1bit, 탑승인원 초과 유무를 나타낸다.
(1bit output) Alarm : 원하는 층에 도착하였을 때와 문이 열려있을 때, Hazard state일 때 울리는 알람이다.
3) 제한 사항
(1) 한 번에 단 하나의 요청만 입력받는다.
(2) 에러가 들어오는 경우는 존재하지 않는다고 가정한다.
(3) Clock의 길이는 상간 없으나 clock의 상승 edge에 맞추어 회로가 동작한다.
(4) 입력이 없을 때에는 elevator는 대기한다. (현재 상태에 머무른다.)
(5) Elevator의 문이 열리고 닫히는 상황은 목표 층까지 가는 도중에는 따로 처리하지 않는다.
4) State Diagram

 

코딩

2. 4층 엘리베이터 Verilog 코딩
module ele4(clk, reset, in, people, bell, floor, over, door, alarm, emergency, emer_s);
input clk, reset, emergency, bell; // CLOCK, 재설정, 긴급상황버튼
input [2:0] in; // 층수 입력 변수 선언
input [3:0] people; // 탑승인원 변수 선언
output [2:0] floor; // 층수 출력변수 선언
output over, door, alarm, emer_s; // 탑승인원 초과, 문, 알람 출력 상태 변수 선언
reg over, door, alarm, emer_s;
reg [2:0] floor, state, next_state;


parameter s1=2'b01; // 1층
parameter s2=2'b10; // 2층
parameter s3=3'b011; // 3층
parameter s4=3'b100; // 4층


always @ (posedge clk or negedge reset)
if(reset) state<=s1; // 재설정시 상태는 1층
else state <=next_state; // 그외는 다음상태를 가리킴


always @ (state or in or people or emergency or bell)begin
case(state)
s1 : begin //1층
floor<=3'b001; // state가 001이면 1층 출력
over<=1'b0; // 초과인원 없으면 0 출력


if(emergency==1'b1)begin // 층수 입력이 2 or 3 or 4이고 긴급버튼 입력시 1층에 있다면
next_state<=s1; // 다음 상태도 역시 1층, 즉 1층에서 정지
alarm<=1'b1; // 정지 후 알림
emer_s<=1'b1; // 긴급상황일 때 활성화 되는 신호
end
else if(emergency==1'b0)begin // 층수 입력이 2 or 3 or 4이고 긴급버튼 입력을 하지 않았다면
alarm<=1'b0; // 알람 정지
emer_s<=1'b0; // 긴급 상황일 때 활성화 되는 신호 없음
end


if(in==3'b001)begin // 1층에 도착하면
door<=1'b1; // 문이 열리고
alarm<=1'b1; // 알람이 울림
end


if(people>4'b1001)begin // 인원 초과(9명이상)시
over<=1'b1; // 인원초과 알림
end


if(bell==1'b1)begin // 벨 입력 시
door<=1'b1; // 문 열림
end
if(in==3'b001|people>4'b1001|bell==1'b1|emergency==1'b1)begin // 층수 입력이 1이고, 탑승인원이 9명 초과시
next_state<=s1; // 다음 상태도 1층, 즉 정지
end
else if(in==3'b010|in==3'b011|in==3'b100)begin //만일 입력이 1층외라면
next_state<=s2; // 다음 상태는 2층을 가리킴
door<=1'b0; // 문이 닫기고
alarm<=1'b0; // 알람이 울리지 않음
end
end


s2 : begin // 2층
floor<=3'b010; // 2층 출력
over<=1'b0; // 초과 인원 없음


if(emergency==1'b1)begin // 긴급버튼 입력 시 2층에 있다면
next_state<=s2; // 다음 상태도 역시 2층, 즉 2층에서 정지
alarm<=1'b1; // 정지 후 알림
emer_s<=1'b1; // 긴급 상황일 때 활성화 되는 신호
end
else if(emergency==1'b0)begin // 긴급버튼 입력을 하지 않았다면
alarm<=1'b0; // 알람 정지
emer_s<=1'b0; // 긴급 상황일 때 활성화 되는 신호 없음
end


if(in==3'b010)begin // 2층에 도착하면
door<=1'b1; // 문이 열리고
alarm<=1'b1; // 알람이 울림
end


if(people>4'b1001)begin // 인원 초과(9명이상)시
over<=1'b1; // 인원초과 알림
end


if(bell==1'b1)begin // 벨 입력 시
door<=1'b1; // 문 열림
end
if(in==3'b010|people>4'b1001|bell==1'b1|emergency==1'b1)begin // 2층시 탑승인원이 초과했다면
next_state<=s2; // 2층에서 정지
end


else if(in==3'b001)begin // 2층에 있을 때 1층을 입력 했다면
next_state<=s1; // 다음 상태는 1층을 가리킴
door<=1'b0; // 문이 닫기고
alarm<=1'b0; // 알람이 울리지 않음
end
else if(in==3'b011|in==3'b100)begin // 2층에 있을 때 3층 혹은 4층을 입력했다면
next_state<=s3; // 다음 상태는 3층을 가리킴
door<=1'b0; // 문이 닫기고
alarm<=1'b0; // 알람이 울리지 않음
end
end
 
s3 : begin // 3층
floor<=3'b011; // 3층 출력
over<=1'b0; // 초과인원 없음
if(emergency==1'b1)begin // 긴급버튼 입력 시 3층에 있다면
next_state<=s2; // 다음 상태도 역시 3층, 즉 3층에서 정지
alarm<=1'b1; // 정지 후 알림
emer_s<=1'b1; // 긴급 상황일 때 활성화 되는 신호
end
else if(emergency==1'b0)begin // 3층에 있고 긴급버튼 입력을 하지 않았다면
alarm<=1'b0; // 알람 정지
emer_s<=1'b0; // 긴급 상황일 때 활성화 되는 신호 없음
end


if(people>4'b1001)begin // 인원 초과(9명이상)시
over<=1'b1; // 인원초과 알림
end
if(in==3'b011)begin // 3층에 도착하면
door<=1'b1; // 문이 열리고
alarm<=1'b1; // 알람이 울림
end


if(bell==1'b1)begin // 벨 입력 시
door<=1'b1; // 문 열림
end
if(in==3'b011|people>4'b1001|bell==1'b1|emergency==1'b1)begin // 3층에 있을 때 탑승인원(9명이상)이 초과 상태이면
next_state<=s3; // 3층에서 정지
end
else if(in==3'b010|in==3'b001)begin // 3층에 있을 때 2층 혹은 1층을 입력했다면
next_state<=s2; // 다음 상태는 2층을 알려줌
door<=1'b0; // 문이 닫기고
alarm<=1'b0; // 알람이 울리지 않음
end


else if(in==3'b100)begin // 3층에 있을 때 4층을 입력했다면
next_state<=s4; // 다음 상태는 4층을 알려줌
door<=1'b0; // 문이 닫기고
alarm<=1'b0; // 알람이 울리지 않음
end
end


s4 : begin // 4층
floor<=3'b100; // 5층 출력
over<=1'b0; // 인원초과 없음
if(emergency==1'b1)begin // 긴급버튼 입력 시 4층에 있다면
next_state<=s4; // 다음 상태도 역시 4층, 즉 4층에서 정지
door<=1'b1; // 문이 열리고
alarm<=1'b1; // 정지 후 알림
emer_s<=1'b1; // 긴급 상황일 때 활성화 되는 신호
end

else if(emergency==1'b0)begin // 층수 입력이 4이고 긴급버튼 입력을 하지 않았다면
door<=1'b0; // 문이 닫기고
alarm<=1'b0; // 알람 정지
emer_s<=1'b0; // 긴급 상황일 때 활성화 되는 신호 없음
end
if(people>4'b1001)begin // 인원 초과(9명이상)시
over<=1'b1; // 인원초과 알림
end
if(in==3'b100)begin // 4층에 도착하면
door<=1'b1; // 문이 열리고
alarm<=1'b1; // 알람이 울림
end
if(bell==1'b1)begin // 벨 입력 시
door<=1'b1; // 문 열림
end


if(in==3'b100|people>4'b1001|bell==1'b1|emergency==1'b1)begin // 4층에 있을 때 탑승인원이 초과 상태이면
next_state<=s4; // 4층에서 정지
end
else if(in==3'b011|in==3'b010|in==3'b001)begin // 입력을 3층, 2층 혹은 1층을 입력했다면
next_state<=s3; // 다음 상태는 3층을 알려줌
door<=1'b0; // 문이 닫기고
alarm<=1'b0; // 알람이 울리지 않음
end
end
endcase
end
endmodule

 

3. 4층 엘리베이터 시뮬레이션
층이동 : 1층 → 4층 → 1층 → 3층 (목적지에 도착하면 알람이 울리면서 문이 열림)

탑승인원(9명: 1001 ) 초과(10명: 1010)시 over=1 출력하고 정지, 초과 탑승자가 내리면 계속 동작

벨(bell) 입력 시 엘리베이터 문(door)이 열린 상태에서 정지, 벨을 놓으면 계속 진행

 

 

728x90
반응형
posted by 조이키트 블로그
prev 1 next