FGPA_Verilog_VHDL

IOWR() 와 IOWR_xxDIRECT의 차이점에 관해서 함.. 고찰..

LonleyEngineer 2008. 5. 7. 07:00
반응형
Nios에서는 2개의 data transfer방식이 있다.
1. registered 방식 (avalon native)
2. memory 방식 (avalon dynamic)

일반적으로 registered방식은 external peripheral 같은 곳에 사용이 되고, memory방식은 memory같은 곳에
사용이된다.

이러한 두가지 transfer을 구분하기 위해 < io.h >에서 아래와 같은 function들이 제공된다.
1. Registered 방식 access : IOWR(), IORD()
2. Memory 방식 access : IOWR_xxDIRECT(), IORD_xxDIRECT()  [xx : data width]

한가지 예로써 32bit sdram을 write 할때를 보면
  IOWR(sdram_base_addr, 0, 11);  
  IOWR(sdram_base_addr, 1, aa);
  IOWR(sdram_base_addr, 2, bb);
  IOWR(sdram_base_addr, 3, cc);

이렇게 하면 0x0 -> 77, 0x4 --> aa, 0x8 -> bb, 0xc -> cc가 쓰여진다.

하지만 아래와 IOWR_xx를 사용하면,
  IOWR_32DIRECT(sdram_base_addr, 0, 11);  
  IOWR_32DIRECT(sdram_base_addr, 1, aa);
  IOWR_32DIRECT(sdram_base_addr, 2, bb);
  IOWR_32DIRECT(sdram_base_addr, 3, cc);

이렇게 하면 sdram_base_addr에 계속해서 over write하는 결과가 되어서
결국 0x0 -> cc가 되면 결과가 된다.
만일 memory방식의 device에 8bit씩 사용하고 싶으면 아래와 같이 위의 syntax를 변경해야한다.

  IOWR_32DIRECT(sdram_base_addr, 0, 11);    --> IOWR_8DIRECT(sdram_base_addr, 0, 11);
  IOWR_32DIRECT(sdram_base_addr, 1, aa);   --> IOWR_8DIRECT(sdram_base_addr, 1, aa);
  IOWR_32DIRECT(sdram_base_addr, 2, bb);   --> IOWR_8DIRECT(sdram_base_addr, 2, bb);
  IOWR_32DIRECT(sdram_base_addr, 3, cc);   --> IOWR_8DIRECT(sdram_base_addr, 3, cc);

이렇게 하면 0x0-> 11aabbcc가 쓰여지게 된다.

 

반응형