245mhz, real time 32bit data read prj
- 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;
software에서는 아래와 같이 억세스
*(int *) (XPAR_NPI_128_0_BASEADDR + 0x1c) = 87654325;
*(int *) (XPAR_NPI_128_0_BASEADDR + 0x1c) = 87654320;