edk

245mhz, real time 32bit data read prj

xilinx 2012. 8. 16. 13:47
  • 32비트 ddr2, kintex410t, axi_7series_ddrx의 클럭 조합 및 닥질한 이야그, 으이그 내가 썩어...

 

1) modelsim library location ==> ise 의 modelsim property에 보면 폴더 위치를 지정하게 됨

2) modelsim/memory model compile ==> ise에서 vcom 메뉴에 +def+sg125를 추가하삼

3) led port 추가 ==> simulation 하면 어디까지 진행한지 모르니까 적당한 곳에서 led 출력 값을 바꿔가면서 진행상황 체크

4) 메모리 초기화 ==> mb의 cache line 만 메모리와 연결되어 있으면 소스코드에서 cache를 enable해야 메모리를 접근할 수 있는데 캐시를 사용하지 않으면 dp를 사용하삼

5) system.do file에 있는 명령어 ==> vcom -novopt -93 -work npi_128_v1_00_a "C:/work/custom/v134_sec_wide_range_245_76mhz/system/pcores/npi_128_v1_00_a/hdl/vhdl/user_logic.vhd"

6)  ip2bus_mstrd_req 사이가 무쟈게 긴 것은 메모리에서 데이터를 꺼내오는 시간 때문에 그런 것인데 mst_xfer_reg_len  <= x"00080"; 영향이 아닌가? 일단 시작하는데 시간이 많이 걸리므로 꺼내오는 데이터 양을 늘리면...

--  mst_xfer_reg_len  <= x"00100"; -- 610 nsec between req
--  mst_xfer_reg_len  <= x"00400"; --1090 nsec between req
--  mst_xfer_reg_len  <= x"00800"; --1730 nsec between req

오호라 0x800개를 읽는데 시간은 3배정도 걸렸지만 읽는 양은 8배로 늘었느니까 괜찮네...

7) burst count가 늘었으니 어드레스 계산하는 부분도 바뀜

--- mst_ip2bus_addr   <= mst_reg(7) & mst_reg(6)(7 downto 3) & cnt_burst & mst_reg(5)(6 downto 0);  -- when 0x80
      mst_ip2bus_addr   <= mst_reg(7) & mst_reg(6)(7) & cnt_burst & x"0" & mst_reg(5)(6 downto 0);  -- when 0x8000
 

8) k705는 8비트만 ddr3 모드만 사용하네요 BSB에 의하면, npi_rd_fifo_data는 어떻게 처리하는가 하면 LED 용 핀을찾아 강제로 아래와 같이 맴핑

net dummy<0> loc = AB8 | iostandard = LVCMOS15;
net dummy<1> loc = AA8 | iostandard = LVCMOS15;
net dummy<2> loc = AC9 | iostandard = LVCMOS15;
net dummy<3> loc = AB9 | iostandard = LVCMOS15;
net dummy<4> loc = AE26 | iostandard = LVCMOS25;
net dummy<5> loc = G19 | iostandard = LVCMOS25;
net dummy<6> loc = E18 | iostandard = LVCMOS25;
net dummy<7> loc = F16 | iostandard = LVCMOS25;

 process(clk)
 begin
  if clk'event and clk = '1' then
   if npi_rd_ready = '1' then
    npi_rd_fifo_rd_en <= not npi_rd_fifo_empty;
   end if;
   dummy <= npi_rd_fifo_data(31 downto 24) + npi_rd_fifo_data(23 downto 16) + npi_rd_fifo_data(15 downto 8) + npi_rd_fifo_data(7 downto 0); 
  end if;
 end process;

9) 데이터 갯수가 2,457,600*32bit  이면 0x960000 byte이고 (0x240000 word)burst 크기가 0x800 이므로 burst_cnt가 0x12c0이면 한 프레임을 다도는구만요

 

10) empty 가 발생했는지 알기 위해서 아래와 같이 코드 추가

 process(rd_fifo_clk)
 begin
  if rd_fifo_clk = '1' and rd_fifo_clk = '1' then
   if npi_rd_ready_s = '1' then
    if rd_fifo_empty_s = '1' then
     cnt_rd_fifo_empty_s <= cnt_rd_fifo_empty_s + 1;
    end if;
   else
    if cnt_clear_d0 = '1' then
     cnt_rd_fifo_empty_s <= (others => '0');
    end if;
   end if;
   cnt_clear_d0 <= cnt_clear; -- 두개의 클럭 도메인이 틀려서 re sync with user clk  

end if;
 end process;

  cnt_clear <= '1' when (slv_reg7(3 downto 0) = x"5") else '0';

 

software에서는 아래와 같이 억세스

 *(int *) (XPAR_NPI_128_0_BASEADDR + 0x1c) = 87654325;
 *(int *) (XPAR_NPI_128_0_BASEADDR + 0x1c) = 87654320;