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 상태가 나올 수 있도록 하려고 시도 중,,,
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 |