Embedded2013. 6. 29. 22:55

FIR


앞서 블럭도가 아래와 같다고 하였다.




NIOS에서 동작할 때에 FIR DMA가 움직이면서 뭔가르 열심히 한다.


FIR Transfrom  블럭과 그에 연결된 Read/Write 블럭을 가지고 있다.


코드는 아래와 같다.


// fir_dma.v


// This file was auto-generated as part of a generation operation.

// If you edit it your changes will probably be lost.


`timescale 1 ps / 1 ps

module fir_dma (

input  wire        clk,                       //        clock.clk

input  wire        reset,                     //  clock_reset.reset

input  wire [2:0]  slave_address,             //      control.address

input  wire [31:0] slave_writedata,           //             .writedata

input  wire        slave_write,               //             .write

input  wire        slave_read,                //             .read

input  wire [3:0]  slave_byteenable,          //             .byteenable

output wire [31:0] slave_readdata,            //             .readdata

output wire [31:0] read_master_address,       //  read_master.address

output wire        read_master_read,          //             .read

output wire [3:0]  read_master_byteenable,    //             .byteenable

input  wire [31:0] read_master_readdata,      //             .readdata

input  wire        read_master_readdatavalid, //             .readdatavalid

input  wire        read_master_waitrequest,   //             .waitrequest

output wire [31:0] write_master_address,      // write_master.address

output wire        write_master_write,        //             .write

output wire [3:0]  write_master_byteenable,   //             .byteenable

output wire [31:0] write_master_writedata,    //             .writedata

input  wire        write_master_waitrequest,  //             .waitrequest

output wire [2:0]  write_master_burstcount,   //             .burstcount

output wire        slave_irq                  //          irq.irq

);


pipelined_read_burst_write_dma #(

.DATAWIDTH                 (32),

.BYTEENABLEWIDTH           (4),

.ADDRESSWIDTH              (32),

.FIFOUSEMEMORY             (1),

.READ_FIFODEPTH            (32),

.READ_FIFODEPTH_LOG2       (5),

.WRITE_FIFODEPTH           (32),

.WRITE_FIFODEPTH_LOG2      (5),

.WRITE_MAXBURSTCOUNT       (4),

.WRITE_MAXBURSTCOUNT_WIDTH (3)

) fir_dma (

.clk                       (clk),                       //        clock.clk

.reset                     (reset),                     //  clock_reset.reset

.slave_address             (slave_address),             //      control.address

.slave_writedata           (slave_writedata),           //             .writedata

.slave_write               (slave_write),               //             .write

.slave_read                (slave_read),                //             .read

.slave_byteenable          (slave_byteenable),          //             .byteenable

.slave_readdata            (slave_readdata),            //             .readdata

.read_master_address       (read_master_address),       //  read_master.address

.read_master_read          (read_master_read),          //             .read

.read_master_byteenable    (read_master_byteenable),    //             .byteenable

.read_master_readdata      (read_master_readdata),      //             .readdata

.read_master_readdatavalid (read_master_readdatavalid), //             .readdatavalid

.read_master_waitrequest   (read_master_waitrequest),   //             .waitrequest

.write_master_address      (write_master_address),      // write_master.address

.write_master_write        (write_master_write),        //             .write

.write_master_byteenable   (write_master_byteenable),   //             .byteenable

.write_master_writedata    (write_master_writedata),    //             .writedata

.write_master_waitrequest  (write_master_waitrequest),  //             .waitrequest

.write_master_burstcount   (write_master_burstcount),   //             .burstcount

.slave_irq                 (slave_irq)                  //          irq.irq

);


endmodule


pipelined_read_burst_write_dma 를 인스턴스로 받아서 사용한다.

이 모듈은 project 폴더의 dma 폴더 내에 있다.


해당 파일의 인터페이스는 아래와 같다.





인터페이스는 3가지 종류로 Slave로서 내부 레지스터 세팅 및 관련된 데이터 저장을 위한 블럭과


Memory에서 읽어 오는  read_master

Memory로 저장하는 Write master가 있다.


이 블럭의 내부에는 다시 아래와 같이 4개의 블럭이 있다.





slave the_slave

latency_aware_read_master the_latency_aware_read_master

transform_block the_transform_block

burst_write_master the_burst_write_master


네개의 블럭으로 구성되어 있다.


slave the_slave

  - NIOS에서 레지스터를 세팅하거나 데이터를 읽어 들이는 모듈

  - 레지스터나 상태를 읽어들인다. 특별한 이슈는 없다.

 - Avalon-MM ( Memory Mapped )로 버스 인터페이스가 설정된다.

   다음 그림은 Avalon MM의 프로토콜이다.




latency_aware_read_master the_latency_aware_read_master

 - Memory에서 데이터를 읽어들이는 블럭

 - 읽어들인 데이터는 FIFO에 기록되고 출력이 user data로 FIR 블럭으로 보내어진다.



transform_block the_transform_block

- FIR Filter


burst_write_master the_burst_write_master

- Memory에 데이터를 Write 하는 블럭

각 데이터간의 연결은 transform_read/write로 연결하고 있다.

transform_block the_transform_block은 다시 내부에 curstorm_FIR을 sub block으로 가지고 있다.
그 sub_block은 원래의 목적인 fir filter로 구현되어 있다.
filter의 Tab을 파라미터로 주면 그에 맞게 내부에서 곱셈기와 덧셈기를 더 넣어서 생성하고 있다. 



'Embedded' 카테고리의 다른 글

Android Quick Boot  (0) 2013.10.16
i.MX6 Evaluation Board  (5) 2013.09.01
freescale iMX.6  (4) 2013.05.09
오래간만의 Windows CE  (0) 2013.05.04
Altera NIOS-II (4)  (2) 2013.03.18
Posted by GUNDAM_IM