• 카테고리

    질문 & 답변
  • 세부 분야

    반도체

  • 해결 여부

    해결됨

Memory controller 설계 관련 질문

22.12.18 11:13 작성 조회수 708

0

 안녕하세요.

DDR3 Controller 강의 자료를 보고 공부 중인데요.

전에 부터 가졌던 궁금증인데 본 강의 보면서 생각나 질문 드려봅니다.

자료를 보면 ddr_controller라고 하는 부분은 현재 MIG IP로 구현되어 있고

그 내부는 크게 Memory controller 와 PHY부분으로 되어 있는거 같은데요.

실제 강의 자료 Write/Write8이나 Read/Read8 block들은 "User FPGA Logic"에 해당되는 블락들이고 이 블락들은 마지막에 영상데이터를 구현하는데 사용하는 블락들로 생각 되는데 맞나요?

그리고 다른 질문은 처음에 강의 개요에 보면 전문가들은 실제로 Memory controller를 직접 구현해서 사용한다고 말씀하셨는데, FPGA에 MIG IP내부의 Memory Contoller 부분은 직접 Verilog/VHDL로 설계해서 사용한다는 말씀이신걸로 이해했습니다. 설계경험이 많으신 분들은 실제로 이렇게 많이 프로젝트를 하시나요? 그리고 모든 FPGA가 이 Memory controller를 MIG를 사용하지 않고 직접 설계한 Verilog로 MIG를 대체해서 설계 가능하도록 지원이 되나요?

3.4에 나와 있느 Physical layer라고 묘사된 부분은 어떤 부분인가요? 그리고 이 부분이 직접 설계된 Memory controller와 같이 FPGA에 구현되는 부분인가요?

아직 잘 모르는 부분이 많아 강의 자료 보면 공부 하고 있습니다.

감사합니다.

답변 1

답변을 작성해보세요.

0

alex님의 프로필

alex

지식공유자

2022.12.18

안녕하세요.

질문 주셔서 감사드립니다.

  1. 전문가들은 실제로 직접 구현해서 사용하나요?

    실제로 직접 구현해서 사용하는 경우도 많이 있습니다. 저도 예전에 영상처리칩을 개발할 때 SDRAM을 사용하였는데, 그때에는 SDRAM 데이터 시트를 보고 타이밍을 이해하고 직접 코드로 구현해서 사용하였습니다. 몇년 전에는 Nand Flash Controller를 구현했었는데 그때에도 데이터시트 보고 직접 구현해서 사용하였습니다.
    직접 구현하느냐? 구현된 IP를 사용하느냐? 둘다 장단점은 있는 것 같습니다.
    직접 구현할 때에는 자신이 원하는 기능만을 구현해서 사용할 수 있기 때문에 코드량을 줄일수도 있고 나중에 수정할 때에도 본인이 다 구현한 것이라 좀 더 쉽게 수정할 수 있습니다. 또한 구현된 IP를 사용하려면 구현된 IP를 이해해야 하는데 이것도 만만치 않은 일이라 본인이 그냥 구현하는게 더 편한 경우도 있습니다.
    그런데 요즘 디바이스들이 점점 더 복잡해지기 때문에 본인이 직접 구현해서 사용하는 것에 한계가 많은 것 같습니다. 저도 DDR controller를 처음 구현할 때 예전에 하던 방식대로 데이터시트 보고 구현하려고 했었는데, 쉽지 않았습니다. 한참 뒤에 Memory contoller가 IP로 제공된다는 것을 알고 제공된 IP를 사용하였습니다.

  2. 모든 FPGA가 IP를 사용하지 않고 직접 설계한 코드로 사용가능한가요?
    제공되는 IP도 역시 Verilog 코드로 만들어져 있습니다. 당연히 제공되는 IP를 사용하지 않고 직접 구현해서 사용가능합니다. 예를 들면 요즘 FW를 개발할 때에도 요즘에는 제공되는 라이브러리를 사용해서 개발합니다. 그러나 예전에는 라이브러리 없이 코드로 일일이 다 구현해서 사용했었습니다. 저와 같이 25년 정도 된 개발자들은 어떻게 보면 낯선 환경인 것 같습니다. 예전에는 일일이 구현했기 때문에 모든 것을 다 디버깅하고 수정해서 사용할 수 있었습니다. 그러나 요즘에 라이브러리를 이용해서 구현할 때에는 편하기는 한데, 세부적인 부분을 수정하거나 디버깅해야 할 경우에는 내부까지 수정할수 없어 답답한 경우도 있습니다. 그러나 세상의 흐름이 바뀌는 것 같습니다. 일일이 구현해서 사용하기에는 너무 시간도 부족하고 디바이스들도 복잡해져서 한계가 많은 것 같습니다. 그러나 중요한 것은 본인이 직접 구현해서 사용한다고 해도 문제될 것은 없습니다.

  3. DDR controller에 대한 이해
    ddr memory는 읽기, 쓰기 속도를 최대한 빠르게 사용하도록 구현된 메모리입니다. 이를 위해서는 읽기,쓰기 동작은 연속해서 해야 합니다. 읽고 쓰고 하는 것을 번갈아서 하면 속도가 현저하게 떨어집니다. 때문에 영상 데이터를 처리할 때에는 라인 단위롤 읽기 쓰기를 합니다. 한라인 전체를 읽기하거나 한라인 전체를 쓰기하는 것으로 구성합니다. 읽기, 쓰기 하기 위해서는 처음에 명령어를 전송해서 준비작업을 해야 합니다. 읽기,쓰기를 번갈아서 하면 읽기, 쓰기 위한 명령어를 매번 해주어야 하기 때문이지요. 그러나 계속해서 읽기를 하거나 쓰기를 하는 경우에는 처음에 한번만 명령어를 전송하고 그 다음부터는 clock 단위로 읽기,쓰기를 할 수 있어서 매우 빠르게 동작합니다. 또한 메모리의 내용이 일정시간이 지나면 사라집니다. 그렇기 때문에 일정시간마다 메모리의 내용이 지워지지 않도록 충전(Precharge, Refresh)해 주어야 합니다. 이러한 기본적인 내용을 알고 있으면 데이터시트에 나와 있는 타이밍을 보고 구현할 수 있습니다.

  4. Physical Layer, User Interface
    메모리 controller를 구현할 때 Module로 나누어서 구현했다고 생각하면 됩니다. Physical Layer는 User Interface 신호들을 실제 Memory에 연결및 맵핑해주는 Block이고, User Interface나 다른 부분들은 SW적으로 controller를 구현한 Block으로 이해하시면 될 것 같습니다.

  5. Write/Write8, Read/Read8 Block
    이 부분은 Memory controller를 사용하기 위하여 사용자가 쉽게 사용할 수 있도록 구현된 부분으로 생각하시면 됩니다. 예를 들어 쓰기를 할 때, 쓰고자 하는 처음 주소, 사이즈, 데이터만 주면 그 다음부터는 알아서 다 해주는 그런 Block을 만들었다고 생각하시면 됩니다. 이 부분(User Interface Logic)은 사용자가 정해서 구현하면 됩니다. 예를 들면 wrtie8 대신에 write16으로 구현해도 됩니다.

  6. 결론
    FPGA를 사용하는 것은 참 어려운 일입니다. 저도 약 15년이상 FPGA 개발일을 해왔는데, 아직도 모르는 부분들이 많이 있습니다. 제가 생각하는 몇가지 기본적인 개념은 첫째, 어려운 문법을 사용하는 것을 지양해야 합니다. Verilog, FPGA는 모든 것이 Clock 단위로 동작합니다. 때문에 어려운 문법을 사용하는 것은 오류가 발생할 수도 있고 디버깅도 어려울 수 있습니다. 제가 사용하는 코드는 어떻게 보면 매우 단순한 문법들만 사용합니다. 정규화된 코드를 사용하는 것이 좋습니다. 둘째, 직접 구현해보는 것을 추천합니다. ddr 처럼 매우 복잡한 것이 아니라면 데이터시트 보고, 타이밍 보고 직접 구현해서 사용하면 훨씬 실력이 향상될 것이라 생각합니다.
    내용이 많이 길어졌네요. 아무튼 제 강의/자료 통하여 많은 도움 되시길 바랍니다.
    강의 수강평 부탁드립니다 ~!!
    감사합니다 ~!!