강의

멘토링

로드맵

Inflearn Community Q&A

no199992698's profile image
no199992698

asked

Design Self-Study Matbi's Practical HW Accelerator Design Using FPGA (From LED Control to Fully Connected Layer Accelerator Design)

[FPGA Chapter 15] Designing a BRAM Data Mover Module Using FSM - Code Review Edition

Timig관련 질문있습니다.

Written on

·

599

·

Edited

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되는지 이해가 잘 가지 않습니다ㅠㅠㅠ 기본기가 부족해서 그런걸까요..

 

 

 

 

fpga임베디드

Quiz

46% of people got it wrong. Give it a try!

FPGA 기반 하드웨어 가속기 설계에서 Data Mover BRAM 모듈의 주된 역할은 무엇일까요?

CPU가 복잡한 알고리즘을 효율적으로 실행하도록 돕습니다.

FPGA 내부의 두 BRAM 메모리 간에 데이터를 효과적으로 전송합니다.

소프트웨어 코드를 하드웨어 명령으로 변환하는 역할을 합니다.

FPGA 칩의 전력 소모량을 줄여줍니다.

Answer 4

1

no19999님의 프로필 이미지
no19999
Questioner

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

1

no19999님의 프로필 이미지
no19999
Questioner

추가로 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)

semisgdh님의 프로필 이미지
semisgdh
Instructor

안녕하세요 :)

추가로 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
Questioner

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

0

no19999님의 프로필 이미지
no19999
Questioner

우선 코드 이해도가 높지못해 질문을 모호하게 드린거같아 죄송합니다. 제가 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된다.)

 

 

no199992698's profile image
no199992698

asked

Ask a question