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

no19999님의 프로필 이미지

작성한 질문수

설계독학맛비's 실전 FPGA를 이용한 HW 가속기 설계 (LED 제어부터 Fully Connected Layer 가속기 설계까지)

[FPGA 15장] FSM 을 이용한 BRAM Data Mover 모듈 설계 - 코드리뷰편

Timig관련 질문있습니다.

23.09.03 16:52 작성

·

430

·

수정됨

2

*댓글 먼저봐주시면 감사하겠습니다! 댓글 내용이 이해된다면 게시글 질문도 이해가 될 것 같습니다!

 

<Data mover BRAM 220번째 라인>

assign we_b1 	= r_core_delay[CORE_DELAY-1];

여기서 we_b1이 켜지고 (r_core_delay == 1f)

한 사이클 후에

<DPBRAM 55번째 라인>

always @(posedge clk)  
begin 
    if (ce0) begin
        if (we0) 
            ram[addr0] <= d0;
		else
        	q0 <= ram[addr0];
    end
end

BRAM1에 0이 write돼야되는거아닌가요?

어떻게 we_b1이 켜짐과 동시에 write되는지 이해가 잘 가지 않습니다ㅠㅠㅠ 기본기가 부족해서 그런걸까요..

 

 

 

 

답변 4

1

no19999님의 프로필 이미지
no19999
질문자

2023. 09. 04. 14:53

이제야 16강을 보는중인데 해결될것같습니다! 감사합니다ㅎㅎㅎ

1

no19999님의 프로필 이미지
no19999
질문자

2023. 09. 03. 19:41

추가로 d0_b1에 (r_core_data[0]에 addr 0번지는 뛰어넘고 1번지 data부터 저장되기 때문에) 1번지 data(1)부터 write하는걸로 이해했는데 맞나요?

추가로 제가 이해한 flow는 다음과 같습니다.

(화살표는 다음사이클로 넘어감을 의미)

r_valid = 1

-> r_core_delay = 00001 ( r_core_data block 조건 충족 (시작) )

-> r_core_data[0] = mem_data[1번지]

(0번지에는 reset data write)

설계독학맛비님의 프로필 이미지
설계독학맛비
지식공유자

2023. 09. 06. 09:07

안녕하세요 :)

추가로 d0_b1에 (r_core_data[0]에 addr 0번지는 뛰어넘고 1번지 data부터 저장되기 때문에) 1번지 data(1)부터 write하는걸로 이해했는데 맞나요?

아닙니다. 0 번지부터 1씩 증가하면서 write 합니다. 즉, 1 번지 부터 write 하는 것이 아닙니다.

image

위 코드를 보시면,

addr_cnt_write 의 초기 값은 0입니다.

그리고, 157 번째 line 의 o_write && we_b1 일때 counting 이 증가하죠.

0 -> 1 -> 2 -> ...

write 0 시점에, we_b1 까지 같이 확인해보시면 될 것 같아요.

다음 waveform 의 노란색 signal 부분 및 timing 참고 부탁드려요.

image

0

no19999님의 프로필 이미지
no19999
질문자

2023. 09. 07. 14:33

아 16강에 F/F이된다는 말씀을 이제야 이해했습니다ㅠㅠㅠㅠ감사합니다 해결했습니다!

0

no19999님의 프로필 이미지
no19999
질문자

2023. 09. 06. 19:09

우선 코드 이해도가 높지못해 질문을 모호하게 드린거같아 죄송합니다. 제가 write, read 동작 구분을 제대로 못해 질문에 혼선이 생겼던거같습니다. 다음과 같은 이유로 16장에서 코드를 수정하신게 맞으신지 궁금합니다!

// first one
always @(posedge clk or negedge reset_n) begin
    if(!reset_n) begin
        r_core_data[0] <= {DWIDTH{1'b0}};  
    end else if(|r_core_delay) begin
		r_core_data[0]	<= mem_data; //(2번 조건)
	end
end

r_core_delay 신호가 들어가면 2번조건이 실행돼 BRAM0번에 값을 read해 r_core_data에 저장 후 5사이클 delay된 후 그 값이 BRAM1에 write됩니다.

근데 읽어오는 과정(위에 코드)에서 저렇게 |r_core_delay 조건이 붙게되면 시작시 BRAM0 0번지가 아닌 1번지에 값을 읽어오며 시작됩니다.(write 0 시점에는 BRAM 0번지에 reset값이 들어감(ex. reset값이 5엿다면 5, 1, 2, 3 ... 순으로 write된다.)

 

 

no19999님의 프로필 이미지

작성한 질문수

질문하기