• 카테고리

    질문 & 답변
  • 세부 분야

    반도체

  • 해결 여부

    해결됨

chapter19 코드 질문

23.07.09 15:17 작성 23.07.09 16:30 수정 조회수 349

1

안녕하세요 맛비님!

우선 항상 강의 잘 듣고 있습니다:)

다름이 아니라 chapter 19에서 myip_v1_0_S00_AXI.v 코드에서 질문이 있어 글 남기게 되었습니다.

사진 속의 부분처럼 register에 관한 코드가 왜 이렇게 많이 있는지.. 잘 이해가 되지 않습니다.

  1. 저는 이 코드 파일은 AXI를 정의하는 내용이고, 따라서 mem0_axi_addr에 'h8, 'hc, 그리고 mem1_axi_addr에 'h10, 'h14만 적으면 되기 때문에 저렇게 많이 정의할 필요가 없지 않나 하는 생각이 들었습니다.

  2. 직접 register에 data를 적는 게 아니라 BRAM에 data를 적기 위한 내용이 아닌가요? 따라서 두 번째 사진 같은 부분의 필요가 잘 이해 되지 않습니다.

  1. lab19_main.c에서 보면

do{

read_data = Xil_In32((XPAR_LAB16_MATBI_0_BASEADDR) + (STATUS_REG*AXI_DATA_BYTE));

} while( (read_data & IDLE) != IDLE);

에서도 그렇고

do{

read_data = Xil_In32((XPAR_LAB16_MATBI_0_BASEADDR) + (STATUS_REG*AXI_DATA_BYTE));

} while( (read_data & DONE) != DONE );

에서도 모두 AXI address에 STATUS_REG*AXI_DATA_BYTE = 4를 넣어줬는데, S00_AXI 파일에서는 address가 'h4일 때에 대해서는 정의된 바가 없는 것 같아서요,

S00_AXI 코드 맨 마지막 부분

always @(posedge clk) begin

if(!reset_n) begin // sync reset_n

slv_reg1 <= 32'b0;

end else begin

slv_reg1[0] <= i_idle;

slv_reg1[1] <= i_running;

slv_reg1[2] <= r_done;

// no use [31:3]

end

end

을 보면 reg1과 연관이 있는 것 같은데 어느 부분을 보고 이걸 알 수 있는 건가요?

항상 감사합니다!

답변 1

답변을 작성해보세요.

0

안녕하세요 :)

A1. 네 말씀해 주신대로, 필요없는 부분이 있습니다. 16개의 reg 로 template 기본 코드를 생성해 놓았었고요. 16 개중, 필요한 부분만 사용했어요. 필요없다 판단되는부분 (미사용 부분) 은 삭제하셔도 됩니다.

A2. 두번째 사진의 어디 부분이 이해가 안되실까요?

imageA3.

image코드를 보시면 알 수 있습니다.

address 체계가 헷갈리신 것 같아요. (HW 코드에서는 에서는 하위 2bit 을 사용하지 않습니다.)

HW 코드를 먼저 보면, 4'h4 는 604 번째 라인의 ADDR_LSB 에 의해서 실제로는 0x16 의 address 를 갖습니다.

image

SW 코드는 byte 단위로 0x04 입니다.

즉, SW 코드에서 0x04 는 HW 코드의 605 번째 line 인 4'h0 을 접근하는 거에요.

 

즐공하세요 :)

nnnnnnn님의 프로필

nnnnnnn

질문자

2023.07.11

안녕하세요 맛비님!! 친절한 답변 정말 감사드립니다.
우선 A2 질문은 제가 잘못 이해한 걸 깨달아서 다시 질문 드리지 않아도 될 것 같아요.

  1. 그런데 A3에 답변해주신 것 이해하려고 해보았는데 아무리 생각해도
    4'h4 = 0100 ---LSB 다시 붙여주면---> 010000 = 16 = 0x10
    0x04 = 0000 0100 --- LSB 떼어주면---> 000001 = 1 = 'h1
    로밖에 머리가 안 굴러가서요 ㅜㅜ.. 어느 부분이 잘못되었을까요?

     

  2. 추가로, address width에서 헷갈리는 부분이 있습니다!

    제가 이해한 바로는,

    예를 들어 address width가 12이고, memory depth가 4096, data width가 32이면

    (1) address가 총 4096개가 있는 것, 즉 addr[0]~addr[4095]가 존재하는 것이고, 여기서 addr의 index를 나타내기 위해 address width = 12bit가 필요하다

    (2) 이때 addr[4095]의 값은 base address + 4095*4 (data 하나가 byte이기 때문)

    (1),(2)가 제가 이해한 내용인데 맞는지 확인해주시면 감사하겠습니다. 만일 아니라면 address width = 12는 어디에 쓰이는 걸까요?ㅜㅜ

항상 고생 많으십니다!

안녕하세요 :)

image알고계신 내용 맞는데요...? 잘못된 부분 없습니다.

하지만! SW 에서 0x4 로 접근했다고 해서, 현재 제가 드린 코드의 HW 에서는 4'h4 를 접근하는 것이 아닙니다. HW 의 4'h0 을 접근하는 겁니다.

위 줄을 이해하시면 됩니다.

=========================

예를 들어 address width가 12이고, memory depth가 4096, data width가 32이면

(1) address가 총 4096개가 있는 것, 즉 addr[0]~addr[4095]가 존재하는 것이고, 여기서 addr의 index를 나타내기 위해 address width = 12bit가 필요하다

네 맞습니다.

(2) 이때 addr[4095]의 값은 base address + 4095*4 (data 하나가 byte이기 때문)

말씀해주신 내용은 맞습니다.

(1),(2)가 제가 이해한 내용인데 맞는지 확인해주시면 감사하겠습니다. 만일 아니라면 address width = 12는 어디에 쓰이는 걸까요?ㅜㅜ

4096 개의 address 접근을 위해 사용됨으로, 이해하신 내용이 맞습니다.

즐공하세요 :)

nnnnnnn님의 프로필

nnnnnnn

질문자

2023.07.12

답변 감사합니다 맛비님!! 조금 더 확실히 하고 싶은 부분이 있어서 다시 질문드립니다.


Q1. 제일 처음 답변에서는 4'h4 가 0x16의 address를 갖는다고 하셔서 다시 여쭤봤던 부분인데, 바로 위쪽 답변에는 4'h4가 실제는 0x10인 것이 맞다고 하셨는데, 0x10이 맞는건가요?

Q2. image라고 말씀하셨는데,

0x4 는 0000 0000 0000 0100

[5:2]를 읽는 것이므로
HW에서는 0001 즉 4'h1이 되는 것이라고 생각했습니다.
혹시 4'h0은 어떤 방식으로 계산해야 하는건가요?

항상 감사합니다.

헉... ㅋㅋㅋㅋ 재가헷갈렸네요. ㅠ

질문자님께서 말씀해주신 q1, q2 부분 전부 맞습니다. :)

채널톡 아이콘