인프런 커뮤니티 질문&답변

nigs2002님의 프로필 이미지
nigs2002

작성한 질문수

Verilog FPGA Program 1 (Arty A7-35T)

SPI MASTER 질문

작성

·

151

·

수정됨

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]) :

답변 1

0

alex님의 프로필 이미지
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 확인"의 무한 반복입니다. 처음에는 어려워도 자꾸 하다보면 나도 모르게 실력이 쌓이게 됩니다~!!

감사합니다 ~!!

nigs2002님의 프로필 이미지
nigs2002

작성한 질문수

질문하기