inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

Verilog FPGA Program 1 (Arty A7-35T)

SPI MASTER 질문

248

nigs2002

작성한 질문수 1

0

reg [9:0] ready_cnt; //count 0~1023

reg [3:0] done_cnt; //count 0~15

reg [9:0] sck_cnt; //count 0~1023

reg [5:0] sck_index; //count 0~63

위와 같은 각각의 카운터의 의미가 이해가 되질 않습니다

구체적으로 카운터의 범위를 왜 저렇게 선언해야 하는지 이해가 되질 않습니다

또한 아래와 같은 파라미터로 선언된 부분이 배열처럼 사용되는 부분이 이해되질 않습니다

배열로 선언해야 하는게 아닌지 궁금합니다

parameter SLAVE_ID_WRITE = 8'h64;

parameter SLAVE_ID_READ = 8'h65;

-------------------------------------------------------------------

(~rw_flag ? SLAVE_ID_WRITE[6] : SLAVE_ID_READ[6]) :

(~rw_flag ? SLAVE_ID_WRITE[5] : SLAVE_ID_READ[5]) :

(~rw_flag ? SLAVE_ID_WRITE[4] : SLAVE_ID_READ[4]) :

(~rw_flag ? SLAVE_ID_WRITE[3] : SLAVE_ID_READ[3]) :

(~rw_flag ? SLAVE_ID_WRITE[2] : SLAVE_ID_READ[2]) :

(~rw_flag ? SLAVE_ID_WRITE[1] : SLAVE_ID_READ[1]) :

(~rw_flag ? SLAVE_ID_WRITE[0] : SLAVE_ID_READ[0]) :

verilog-hdl fpga

답변 1

0

alex

안녕하세요.

1) ready_cnt 는 ready 상태에서 사용되는 count로 아래와 같은 일들을 처리하는데 사용됩니다.
- ready 상태에서 ss 신호를 active(0)로 만들고 (141 라인),
- 첫번째 데이터 (SLAVE_IDW[7] or SLAVEIDR[7]) 를 전송하고 (157 라인),
- SCL 반주기 후에 s_send 상태로 이동합니다 (214 라인)
- ready_cnt 값이 [9:0]로 설정한 것은 freq[9:0] 이기 때문에 같은 크기를 사용합니다.
2) done_cnt는 done 상태에서 사용되는 count로 아래와 같은 일을 처리하는데 사용됩니다.
- done 상태에서 ss 신호를 deactive(1)로 만들고 (142 라인)
- done 신호를 생성하고 (205 라인)
- IDEL 상태로 이동합니다 (216)
- [3:0]로 설정한 것은, 임으로 설정하였습니다. [2:0]나 [4:0]로 설정해도 무관합니다.

3) sclk_cnt는 sck 파형을 생성하는데 사용됩니다.
- freq 값에 따라서 sck 주기 (엄밀히 말하면 1/2 주기)가 생성됩니다 (122 - 127 라인, 145-150 라인)
- sclk_cnt 값이 freq 값과 따라 사용되기 때문에 freq와 같은 [9:0]을 사용합니다.

4) sck_index 는 sck의 반주기를 count 합니다. 스펙 (42 페이지)에 총 3바이트를 전송합니다. sck는 총 24개의 clock이 발생하고, 이를 반주기로 계산하면 48이 됩니다. 따라서 sck_index는 0 - 48까지의 값을 가지기 때문에 6bits[5:0]로 설정합니다.

 

5) parameter, 배열
verilog에서 [6]은 C에서처럼 배열의 Index를 의미하는 것이 아니고, bit를 의미합니다.
SLAVE_ID_WRITE = 8'h64, 8'h64는 이진수로 표기하면 0110_0100 가 됩니다.
SLAVE_ID_WRITE[7] : 0
SLAVE_ID_WRITE[6] : 1
SLAVE_ID_WRITE[5] : 1
SLAVE_ID_WRITE[4] : 0
SLAVE_ID_WRITE[3] : 0
SLAVE_ID_WRITE[2] : 1
SLAVE_ID_WRITE[1] : 0
SLAVE_ID_WRITE[0] : 0
 

마지막으로 코드를 눈으로만 이해하려고 하면 어려움이 많습니다. simulation을 통해 파형을 확인해야 합니다. 각각의 clock에 따라 신호들이 어떻게 변하는지를 직접 확인해야 합니다. verilog는 "코드 구현 - simulation 확인"의 무한 반복입니다. 처음에는 어려워도 자꾸 하다보면 나도 모르게 실력이 쌓이게 됩니다~!!

감사합니다 ~!!

[HDL 32장-2부] 참고 링크 관련

1

35

2

강의 만료일 연장 신청

0

32

2

기초예제 파일 불러오기 문의

0

25

2

Zybo 환경에서 PL RTL UART 보드 검증 방법

0

30

2

Verilog 코딩 스타일

0

119

2

xilinx 권고와 차이

0

248

2

강의자료

0

115

1

open hardware manager에서 보드 인식 못하는 문제

0

343

2

ifelse, 삼항연산자에 대해서 질문 있습니다.

0

425

1

RAM ip를 이용하여 FIFO 기능을 구현할 수도 있나요?

0

327

1

SPI master testbench 질문

0

327

1

자사 개발보드 관련

0

357

2

안녕하세요. IP Packaging 관련 질문 있습니다.

0

317

1

안녕하세요. verilog 활용 관련 문의드립니다.

0

342

1

안녕하세요 fpga_intro_v16 192p에 질문있습니다!

0

335

1

안녕하세요 SLVAE 컨트롤러에 대한 질문이 있습니다

0

371

1

안녕하세요 I2C Register 모듈에 대해서 질문이있습니다.

0

416

1

SPI에서 Master 내의 miso 값 update 과정에서 질문있습니다.

1

878

1

안녕하세요 i2c master 부분에 관련하여 질문있습니다.

0

612

1

SPI Master 부분 질문입니다.

1

612

3

I2C Master 모듈관련 질문입니다.

0

1182

1

memory configuration

0

841

1

UART, SPI구현

0

657

1

SPI와 I2C의 차이

2

1981

1