Kim Seon Deok

[Verilog] Multiplier8x8 (Mearly machine) 본문

Verilog

[Verilog] Multiplier8x8 (Mearly machine)

seondeok 2022. 10. 28. 20:33

 

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 사양

Synthesis 한 결과

RTL viewer(Tools > Netlist viewers > RTL viewer)

synthesis결과

(Tools > Netlist viewers > state machine viewer)

state machine
구현하고자 하는 state machine diagram

구현하고자 하는 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에 업로드 하였습니다.

https://github.com/du6293/IDEC/blob/main/README.md

'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
Comments