关于NIOS软硬件接口问题

软核设置

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中还需要自己分配各个接口功能,其中要设置好地址接口,用于后面偏移值的设置。
其中设置的addr影响到地址偏移值的设定

软件设置

设置地址偏移值

利用枚举设置偏移值(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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值