Chapter 1. Microblaze and DDR3 Microblaze 을사용한임베디드시스템을구현할경우메모리콘트롤러가필요한경우가 많이있습니다. DDR2, 3 메모리의경우에는동작속도가너무높다보니일반적으로 RTL 로메모리 콘트롤러를구현하지않습니다. 이때사용하는툴이 MIG 라는툴인데 MIG 는메모리콘트롤러가매우높은동작 주파수에서도제대로동작할수있도록메모리콘트롤러를만들어줍니다. 임베디드시스템에서도메모리콘트롤러를사용하게되는데이문서에서는 MIG 에서 만든것을 EDK 에서사용하는방법을보여줍니다. 1.1 Device & Memory type 주어진스펙은다음과같습니다. Device : XC7K325TFFG900 DDR : K4B4G1646B-HCK0 (2 개 ) http://www.samsung.com/global/business/semiconduct or/file/product/ds_k4b4g1646b_rev10-1.pdf 요청 Bank : 16, 17, 18 Bank (16bit 만쓸경우, 16, 17) 다음은 4Gb 에대한어드레스핀갯수, 컬럼어드레스핀, 뱅크어드레스핀갯수가 몇개인지보여줍니다. MIG 를통해메모리콘트롤러를만들때아래와같은정보가필요합니다.
1.2 Coregen Design flow Coregen 에서새로운프로젝트를등록합니다. 사용한디바이스를선택하고
MIG 를선택합니다. 여기서부터별얘기가없으면 Defaul 나 Next 를선택합니다.
요기가중요한그림입니다. 기본적으로 MIG 는여러메모리에데이터베이스가있는데그중하나를선택할수있고그렇지않은경우아래그림처럼차례대로선택합니다. 3 번에서어드레스갯수, 컬럼갯수, 뱅크갯수를데이터쉬트처럼선택합니다. 나머지타이밍은데이터쉬트를참고해서정해줍니다.
대부분의 FPGA 에는 AD Convert 가들어가있는데메모리콘트롤러의안정적인동작을 위해 FPGA 의온도를읽어타이밍을보정하는데사용하도록합니다. 기본값은 enable 입니다.
MIG 로만든메모리콘트롤러는기본적으로최고성능을내도록합니다. FPGA 에는 HR bank 와 HP bank 가있는데기본뱅크는 HP 뱅크를써야합니다. 아래그림과같인 Bank16, Bank17 인 HR 뱅크를사용하려면메모리의동작주파수를 낮춰야합니다.
앞에그림에서잠시스쳐지나갔지만 MIG 는기본 800Mhz 로동작시키려고합니다. 이 부분은 400Mhz 로낮추었습니다.
메모리콘트롤러가필요로하는클럭정보를넣어줍니다.
메모리콘트롤러가생성됩니다.
1.3 ISE
FPGA 외부에서입력되는주파수값을정하고 Reset 의 Polarity 도정합니다.
Add Device 에서메모리콘트롤러를선택하고 UART 나 Timer 등기본적인주변장치를 선택합니다.
기본셋팅이되어있는메모리콘트롤러를 MIG 에서만들어진콘트롤러로바꾸려고 합니다. Coregen 에서실행한화면과비슷한화면이나타나는데이때 Import 를선택합니다.
그러면 Project file 과 Ucf file 을물어보는데 Coregen 에서만든 MIG 폴더에서원하는 두개의파일을선택합니다.
핀정보가문제없는지살펴봅니다. 필요한경우메모리콘트롤러의이름을바꿀수있습니다. 이렇게생성된메모리콘트롤러의 UCF MIG.UCF 로저장됩니다. 는현재 $EDK_Prj$/ xps/ddr3. 폴더에
다음리스트수정된 MHS file 입니다. 1 2 # ############################################################################## 3 # Created by Base System Builder Wizard for Xilinx EDK 14.4 Build EDK_P.49d 4 # Fri Aug 30 10:55:24 2013 5 # Target Board: Custom 6 # Family: kintex7 7 # Device: xc7k325t 8 # Package: ffg900 9 # Speed Grade: -1 10 # ############################################################################## 11 PARAMETER VERSION = 2.1.0 12 13 14 PORT RS232_Uart_1_sout = RS232_Uart_1_sout, DIR = O 15 PORT RS232_Uart_1_sin = RS232_Uart_1_sin, DIR = I 16 PORT RESET = RESET, DIR = I, SIGIS = RST, RST_POLARITY = 0 17 PORT DDR3_SDRAM_we_n = DDR3_SDRAM_we_n, DIR = O 18 PORT DDR3_SDRAM_ras_n = DDR3_SDRAM_ras_n, DIR = O 19 PORT DDR3_SDRAM_odt = DDR3_SDRAM_odt, DIR = O 20 PORT DDR3_SDRAM_dqs_n = DDR3_SDRAM_dqs_n, DIR = IO, VEC = [1:0] 21 PORT DDR3_SDRAM_dqs = DDR3_SDRAM_dqs, DIR = IO, VEC = [1:0] 22 PORT DDR3_SDRAM_dq = DDR3_SDRAM_dq, DIR = IO, VEC = [15:0] 23 PORT DDR3_SDRAM_dm = DDR3_SDRAM_dm, DIR = O, VEC = [1:0] 24 PORT DDR3_SDRAM_ddr3_rst = DDR3_SDRAM_ddr3_rst, DIR = O 25 PORT DDR3_SDRAM_cs_n = DDR3_SDRAM_cs_n, DIR = O 26 PORT DDR3_SDRAM_clk_n = DDR3_SDRAM_clk_n, DIR = O, SIGIS = CLK 27 PORT DDR3_SDRAM_clk = DDR3_SDRAM_clk, DIR = O, SIGIS = CLK 28 PORT DDR3_SDRAM_cke = DDR3_SDRAM_cke, DIR = O 29 PORT DDR3_SDRAM_cas_n = DDR3_SDRAM_cas_n, DIR = O 30 PORT DDR3_SDRAM_ba = DDR3_SDRAM_ba, DIR = O, VEC = [2:0] 31 PORT DDR3_SDRAM_addr = DDR3_SDRAM_addr, DIR = O, VEC = [15:0] 32 PORT CLK_P = CLK, DIR = I, DIFFERENTIAL_POLARITY = P, SIGIS = CLK, CLK_FREQ = 100000000 33 PORT CLK_N = CLK, DIR = I, DIFFERENTIAL_POLARITY = N, SIGIS = CLK, CLK_FREQ = 100000000 34 //////////////////////////////////////////////////
215 BEGIN axi_7series_ddrx 216 PARAMETER INSTANCE = DDR3_SDRAM_MT41J128M8XX_125 217 PARAMETER HW_VER = 1.07.a 218 PARAMETER C_MEM_PARTNO = k4b4g1646b 219 PARAMETER C_INTERCONNECT_S_AXI_AR_REGISTER = 8 220 PARAMETER C_INTERCONNECT_S_AXI_AW_REGISTER = 8 221 PARAMETER C_INTERCONNECT_S_AXI_R_REGISTER = 8 222 PARAMETER C_INTERCONNECT_S_AXI_W_REGISTER = 8 223 PARAMETER C_INTERCONNECT_S_AXI_B_REGISTER = 8 224 PARAMETER C_DM_WIDTH = 2 225 PARAMETER C_DQS_WIDTH = 2 226 PARAMETER C_DQ_WIDTH = 16 227 PARAMETER C_ROW_WIDTH = 16 228 PARAMETER C_INTERCONNECT_S_AXI_MASTERS = microblaze_0.m_axi_dc & microblaze_0.m_axi_ic 229 PARAMETER C_S_AXI_DATA_WIDTH = 128 230 PARAMETER C_S_AXI_BASEADDR = 0xb0000000 231 PARAMETER C_S_AXI_HIGHADDR = 0xbfffffff 232 PARAMETER C_BANK_TYPE = HR_IO 233 PARAMETER C_RTT_NOM = 60 234 PARAMETER C_TCK = 2500 235 PARAMETER C_PLLE2_EXT_LOC = X0Y4 236 PARAMETER C_CLKOUT0_PHASE = 337.5 237 BUS_INTERFACE S_AXI = axi4_0 238 PORT clk = clk_100_0000mhzplle0 239 PORT ddr_we_n = DDR3_SDRAM_we_n 240 PORT ddr_ras_n = DDR3_SDRAM_ras_n 241 PORT ddr_odt = DDR3_SDRAM_odt 242 PORT ddr_dqs_n = DDR3_SDRAM_dqs_n 243 PORT ddr_dqs_p = DDR3_SDRAM_dqs 244 PORT ddr_dq = DDR3_SDRAM_dq 245 PORT ddr_dm = DDR3_SDRAM_dm 246 PORT ddr_reset_n = DDR3_SDRAM_ddr3_rst 247 PORT ddr_cs_n = DDR3_SDRAM_cs_n 248 PORT ddr_ck_n = DDR3_SDRAM_clk_n 249 PORT ddr_ck_p = DDR3_SDRAM_clk 250 PORT ddr_cke = DDR3_SDRAM_cke 251 PORT ddr_cas_n = DDR3_SDRAM_cas_n 252 PORT ddr_ba = DDR3_SDRAM_ba 253 PORT ddr_addr = DDR3_SDRAM_addr 254 PORT sync_pulse = clk_25_0000mhz9.84375plle0_nobuf 255 PORT mem_refclk = clk_400_0000mhzplle0_nobuf 256 PORT freq_refclk = clk_400_0000mhz337.5plle0_nobuf 257 PORT clk_ref = clk_200_0000mhzplle0 258 PORT pll_lock = proc_sys_reset_0_dcm_locked 259 END 260