关于nios中的Avalon总线,首先明确一点就是其是八位寻址的,这个很重要。
曾经对ssram操作过,这里不讨论读写时序的问题,只是关注avalon对其的地址分配,对于verilog编写的ip核,只给出部分参数。
ssram的芯片接口为:
inout[15:0] mem_data;
output[20:0] mem_addr;
地址21bit,数据16bit。和avalon(8bit寻址)连接。如下为连接avalon总线:
input[20:0] avs_addr;
input[15:0] avs_write_data;
output[15:0] avs_read_data;
我们再来看看实际nios为此付出的寻址空间:(下面一条红线标识)
实际分配了0x400000的大小空间,再分析此空间在nios中需要22bit才能寻址到,这下可以明白了,
所以这个问题可以理解了。
对于自己写的IP在c语言操作时,要注意偏移地址问题。
如下有个项目实例:
/*
usage:
dsp emif interface.
address allocation:
0x0000~0x1fff: dual port ram for writing
0x0000~0x3fff: dual port ram for reading
0x4000:write and read ce_ccd_nios_n
0x4004:write and read dsp_gp5_pre*/
module dsp_emif_ip(
//avalon slave
input clk,
input [31:0]wdata,
output [31:0]rdata,
input [12:0]addr,
input wren,
input rden,
input chipselect,
//port
input img_wr_en,
input [23:0] img_data,
input [11:0] img_addr,
input img_wr_clk,
input img_wr_ok,
output dsp_gp5,
inout [31:0] dsp_data,
input [11:0] dsp_addr,
input dsp_oe_n,
input dsp_we_n,
input dsp_ce4_n,