软核设置
verilog总线控制
利用always控制总线,其中addr为地址接入控制。
总线控制
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
FIFOWrReg <= 1'd0;
FIFORdReg <= 1'd0;
rddata <= 32'd0;
end
else if(wr&cs) begin
case(addr[3:0])
4'd0: FIFOWrReg <= wrdata[0];
4'd1: FIFORdReg <= wrdata[0];
4'd4: RAMRdReg <= wrdata[0];
4'd5: RdAddrReg[11:0] <= wrdata[11:0];
default: ;
endcase
end
else if(rd&cs) begin
case(addr[3:0])
4'd2: rddata[0] <= RdEm;
4'd3: rddata[0] <= WrFu;
4'd6: rddata[31:0] <= RAMout[31:0];
4'd7: rddata[5:0] <= SouExp[5:0];
default: rddata <= rddata;
endcase
end
end
定义v文件至niosII外设
在qsys中加入source文件
点击“Analyze Synthesis Files”自动分配接口
在Singals&Interfaces中还需要自己分配各个接口功能,其中要设置好地址接口,用于后面偏移值的设置。
软件设置
设置地址偏移值
利用枚举设置偏移值(0-7),数值与在verilog中定义的总线控制相对应。之后直接在c代码中用上枚举量可以清晰表明要选择的地址。
偏移值定义
typedef enum{
fft_fifo_wr = 0,
fft_fifo_rd,
fft_fifo_rdem,
fft_fifo_wrfu,
fft_ram_rd,
fft_ram_rdad,
fft_ram_rdda,
fft_exp
}FFTADDR;
在软件中控制IO口
利用常用的IOWR和IORD函数读写数据
此时的REGNUM相当与输入到FFT模块的的addr值,通过总线控制控制要对接的接口。
IOWR(BASE,REGNUM,data);//写函数,data位数与在总线控制中相应偏移值时位数相同
IORD(BASE,REGNUM);//读函数
以下是在FFT中FIFO控制的控制代码(EDS)
FIFO软件读写控制
void FFT_FIFOCtrl(){
IOWR(FFT_TOP_BASE, fft_fifo_rd, 1);
while((IORD(FFT_TOP_BASE, fft_fifo_rdem)&0x0001)==0){}
IOWR(FFT_TOP_BASE, fft_fifo_rd, 0);
IOWR(FFT_TOP_BASE, fft_fifo_wr, 1);
while((IORD(FFT_TOP_BASE, fft_fifo_wrfu)&0x0001)==0){}
IOWR(FFT_TOP_BASE, fft_fifo_wr, 0);
IOWR(FFT_TOP_BASE, fft_fifo_rd, 1);
while((IORD(FFT_TOP_BASE, fft_fifo_rdem)&0x0001)==0){}
IOWR(FFT_TOP_BASE, fft_fifo_rd, 0);
}