상세 컨텐츠

본문 제목

verilog - mult_control(Mealy와 Moore 결합 방식의 FSM)

설계공부/Verilog

by 썽심 2024. 5. 15. 01:28

본문

728x90

HDL: Verilog(2001)

Synthesis: Intel(Altera)_Quartus prime 18.1

Simulation: Intel(Altera)_ModelSim 10.5b

Board: Intel(Altera)_DE1_SoC (FPGA와 HPS가 결합된 SoC)

FPGA(device): Intel(Altera)_Cyclone V(5CSEMA5F31c6)

HPS(Hard Processor System): ARM_Coretex-A9

 

8x8mult을 만들기 위한 module 구현 중.

uart / mult 8*8에 사용할 mult_control를 만들기 위한 연습과정

 

 

Mealy와 Moore 결합 방식의 FSM

FSM( Finite State Machine )?

유한 상태 기계의 준 말로

말 그대로 상태에 따라 동작되는 기계이다.

그 방식에는 Moore와 Mealy가 있다.

 

next_state : Mealy방식으로 설계

Current_state : Moore 방식으로 설계

 

 

 

Mult_control

 

 

Mult_control.v

parameter : 해당 모듈에서만 동작되도록 변수를 선언하여 사용하여 상숫값 assign(할당)되도록 한다.

#이 밖의 localparam defparam이 있음 

 

Current_state와 next_state 가 각각 3bit씩 저장 될 수 있도록 선언


 

현재 상태를 next_state와 맞춰주는 과정 

current_state가 clk과 reset_a의 상승엣지에서 동작되도록 설정

비동기 clear가 되도록 설정(reset_a) ---> 저전력, 안정성 확보

만약 reset_a가 1이면, current_state 는 IDLE / 

아니면 current_state 는 next_state

 

'='은 blocking assignment

'<='은 non-blocking assignment 이다.

 

그 다음

현재상태 및 입력기반 next_state결정될 수 있도록 설정

state가 어떻게 동작 될 지 설정해주는 과정

 

case를 사용하여 current_state 상태에 따라 나누었다.

IDLE : state = 1 이면 next_state = LSB 

아니면 IDLE

 

LSB : start = 0 and count = 0 이면, next_state = MID

아니면 ERR

 

MID : start = 0 and count = 2 이면 next_state  = MSB

start = 0 and count = 1 이면 next_state = MID

그게 아니면 ERR


MSB : start = 0 and count = 3 이면, next_state = CALC_DONE

아니면 ERR

 

CALC_DONE : start = 0이면, next_state = IDLE

아니면 ERR

 

ERR : start = 1 이면, next_state = LSB 

아니면 ERR


Mealy로 방식으로 설계함

current_state의 출력 함수에 대해 설계

기본값을 설정한 뒤 변경사항이 있을 때만 추가적으로 입력하여 변경함.

 

IDLE : start = 1이면, clk_ena = 1 / sclr_n = 0 으로 변경

 

LSB : count = 0 and start = 0 이면, input_sel = 0 / shift_sel = 0 / clk_ena = 1 로 변경

 

MID : count = 2 and start = 0이면,  input_sel = 2 / shift_sel = 1 / clk_ena = 1 로 변경

count = 1 and start = 0이면,  input_sel = 1 / shift_sel = 1 / clk_ena = 1 로 변경

 



MSB :  count = 3 and start = 0이면,  input_sel = 3 / shift_sel = 2 / clk_ena = 1 로 변경

 

CALC_DONE : start = 0이면, done = 1로 변경

 

ERR : start = 1이면, clk_ena = 1 / sclr_n = 0 으로 변경

 

 

state_out에 대한 moore 출력 로직 생성

Current_state에 만 관여

state_out을 3b'000 기본값으로 두고 변경 시 적용할 수 있도록 함

IDLE : 3'b000 - 0

LSB : 3'b001 - 1

MID : 3'b010 - 2

MSB : 3'b011 - 3

CALC_DONE : 3'b100 - 4

ERR : 3'b101 - 5


tb_ Mult_control .v

 

Integer : testbench에서 변수 선언할 수 있도록 도와주는 구문

i : count 시 사용하기위한 변수

state : state_out의 출력 숫자를 이니셜이 나올 수 있도록 state_out 저장 변수

 

clk 초기값 선언 후 forever begin-end 구문을 통해

#25마다 0,1이 반복 되도록 설계

 

reset_a 의 초기값을 1로 설정해, state가 시작 될 수 있도록 한 뒤,

#50 이후 0으로 주어 동작 혼선이 없도록 초기화함.

 

count 초기값 선언,

지정된 변수 i를 i가 4까지 될 때 까지 +1씩 될 수 있도록 설계했다.

 

마지막으로 start 초기값을 0으로 준뒤

#50 이후 1

#50 이후 0으로 설정해줌

state가 제대로 동작되도록

 

do.file

 

Simulation

waveform 

 

next_state가 000에서 start가 1이 되니 next_state가 1이 됨 이후 current_state 1이 될 준비,

다음 current_state가 1이 되어  input_sel = xx / shift_sel = xx / done = 0 / clk_ena = 1 / sclr_n = 1로

LSB 상태인 1이 state_out에 출력..

 

...

이런식으로 제대로 동작 됨을 검증했다.

 

이후

마지막 state를 tb에 추가해서 state_out에 맞춰 각각
IDLE, LSB, MID, MSB, CALC_DONE, ERR 상태가 나올 수 있도록 하려고 시도 중,,,

728x90

'설계공부 > Verilog' 카테고리의 다른 글

verilog - counter(!중요 asynchronous clear)  (0) 2024.05.12
verilog - reg16(bit_clear내용)  (0) 2024.05.11
verilog - 7segment  (0) 2024.05.07
verilog - shifter(중요!)  (0) 2024.05.06
verilog-mux4  (0) 2024.05.06

관련글 더보기