一、自定义IP核顶层avalon总线接口程序包含内容
1、接口
a,:全局 接口:时钟、复位:clk,reset_n
b:avalon mm slave接口:
地址 as_adress
片选:as_chipselect/as_chipselect_n
写请求:as_write/as_write_n
写数据:as_writedata
读请求:as_read/as_read_n
读数据:as_read
等待信号:as_writerequest/as_writerequest_n
数据有效信号:as_data_valid
中断请求信号:irq/irq_n
c:导出信号:导出到nios系统顶层,分配给外设的IO,或连接到qsys以外的逻辑
2、 内部寄存器和xian'wang4定义
数据寄存器(读/写)
状态寄存器(运行状态,数据状态等)
控制寄存器
中断寄存器
用户自定义寄存器
3、 寄存器的独写:如何通过avalon总线进行寄存器独写
a: 如下:片选、写有效、地址满足,写入数据
always@(posedge clk or negedge reset_n)
if(!reset_n)
channel <= 3'd0;
else if(as_chipselect && as_write && (as_adress==1))
channel <= as_writedata[2:0];
b:如下:片选,写有效,地址对应,则控制信号为1
always@(posedge clk or negedge reset_n)
if(!reset_n)
control <= 1'd0;
else if(as_chipselect && as_write && (as_adress==3))
control <= 1'b1;
else
control <= 1'd0;
c:如下:读寄存器根据片选、读有效、根据不同地址,读不同内容
//读寄存器
always@(posedge clk or negedge reset_n)
if(!reset_n)
as_readdata <= 16'd0;
else if(as_chipselect && as_read)begin
case(as_adress)
0:as_readdata<={4'b0,data};
1:as_readdata<={13'b0,channel};
2:as_readdata<={8'b0,freqsclk};
4:as_readdata<={15'b0,irqmask};
5:as_readdata<={14'b0,status};
default:as_readdata <= 16'd0;
endcase
end
4、用户对寄存器赋值:为了符合avalon总线写的
//状态寄存器0位
always@(posedge clk or negedge reset_n)
if(!reset_n)
status[0] <= 1'd0;
else if(Conv_Done)
status[0] <= 1'd1;
else if(as_chipselect && as_read && (as_adress==0))
status[0] <= 1'd0;
//状态寄存器1位
always@(posedge clk or negedge reset_n)
if(!reset_n)
status[1] <= 1'd0;
else if(ADC_State)
status[1] <= 1'd1;
else
status[1] <= 1'd0;
二、步骤
建立完外设接口程序和avalon接口程序以后,先将这两个程序建立一个工程,编译,看有没有错误。
之后进入qsys,新建一个ip,写名字,加入两个文件,点击分析看没有错误继续。
进入端口配置界面,要有端口如下
时钟
复位
avalon mm slave
对外io接口
并给每个时钟指定时钟和复位。
中断一定要绑定在avalon分组上
三、生成tcl文件不和。v文件在一个目录内,为了方便后续使用,将tcl文件移动到。v文件夹内,并修改tcl文件内的路径,将相对路径去掉,只留下文件名即可。