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
'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 |