Kim Seon Deok
[Verilog] Multiplier8x8 (Mearly machine) 본문
IDEC 반도체 설계 교육센터에서 진행한 Intel FPGA Verilog교육(2022.10.25 ~ 2022.10.28)을 수강하고 공부한 내용을 정리한 것입니다. (4일동안만 진행되서 아쉬웠지만 많은 것을 얻을 수 있는 교육이었습니다.)
사용한 Tool
synthesize tool : Quartus Prime 18.1 Lite Edition
simulation tool : Modelsim-Intel FPGA Starter Edition 10.5b
구현하고자 한 것 : multiplier8x8
2개의 mux4, mult4x4, adder, shifter, reg16, mult_control, counter, seven_segment_cntrl로 구성되어 있고 top module은 multiplier8x8이다.
Quartus에서 각각의 9개의 모듈의 코드를 모두 구현한 후 .v파일 및 tb.v파일 생성 후 모듈을 선을 그려 연결해줌
Synthesis 한 결과
RTL viewer(Tools > Netlist viewers > RTL viewer)
(Tools > Netlist viewers > state machine viewer)
구현하고자 하는 Finite State Machine의 mearly machine diagram이다.
밀리 머신은 출력이 입력과 현재상태에 영향을 받는다.
참고로 무어 머신은 출력이 현재상태에만 영향을 받는다.
<state 설명>
1.IDLE -> 000
2.LSB -> 001
LSB 상태에서 상태머신은 두 개의 8비트 곱셈기 중 하위 4비트를 곱한다.
((a[3..0] * b[3..0]) * 2 ^ 0 )
이 중간 결과는 accumulator에 저장된다.
3.MID -> 010
MID 상태에서 상태머신은 교차 곱셈 A와 B를 수행한다.
((a[3..0] * b[7..4]) * 2 ^ 4) and ((a[7..4] * b[3..0]) * 2 ^ 4)
이는 연속적인 클럭 사이클에서 수행된다. 두 곱셈 연산의 곱셈이 모두 완료되고 다시 accumulate에 기록될 때 accumulate의 내용에 추가된다.
4.MSB -> 011
MSB 상태에서 상태머신은 두 개의 8비트 멀티플렉서 중 상위 4비트를 곱한다.
((a[7..4] * b[7..4]) * 2 ^ 8)
이 제품은 accumulator의 내용들과 함께 추가되고 accumulator에 다시 기록된다.
Final product
result[15...0] = a[7..0] + b[7..0]
= ((a[7..4] * b[7..4]) * 2 ^ 8)
+ ((a[7..4] * b[3..0]) * 2 ^ 4)
+ ((a[3..0] * b[7..4]) * 2 ^ 4)
+ ((a[3..0] * b[3..0]) * 2 ^ 0)
5.CALC_DONE -> 100
CALC_DONE 상태에서 상태머신은 Final product가 계산되었음을 indicate하기 위해 done_flag 출력을 assert하고,
downstream logic으로 읽을 준비를 한다.
6.ERR -> 101
ERR 상태에서 상태머신은 잘못된 입력값이 들어왔음을 나타낸다.
상태 머신에는 start와 count의 두 가지 입력이 있다. start 신호는 다음 클럭 사이클에서 8*8 multiply operation을 시작하기 위해 한 번의 클럭 사이클에 대해 asserted된다. start 신호는 하나의 클럭 사이클에 대해서만 asserted되어야 한다. 카운트 신호는 상태 머신이 multiplication cycle를 추적하는 데 사용된다.
mult_control의 출력은 설계의 다른 여러 block들을 제어한다.
Modelsim으로 RTL simulation 수행하고 waveform을 출력한 결과
mult8x8_tb.do 파일의
add wave /mult8x8_tb/mult8x8_1/u6/current_state 을
add wave /mult8x8_tb/mult8x8_1/u6_mult_control/current_state 로 수정해야 한다.
구현 코드는 github에 업로드 하였습니다.
'Verilog' 카테고리의 다른 글
[Verilog] 주석, 수 표현 , 문자열, 식별자 (0) | 2022.12.06 |
---|---|
[Verilog] Verilog HDL Overview (0) | 2022.12.06 |
[Verilog] Clock & Testbench & DUT & Reset & Flip Flop (0) | 2022.11.30 |
[Verilog] $display (0) | 2022.11.30 |
[Verilog] FPGA PWM (0) | 2022.10.31 |