Avalon总线IP核的定制.doc
上传人:sy****28 上传时间:2024-09-14 格式:DOC 页数:21 大小:1.6MB 金币:16 举报 版权申诉
预览加载中,请您耐心等待几秒...

Avalon总线IP核的定制.doc

Avalon总线IP核的定制.doc

预览

免费试读已结束,剩余 11 页请下载文档后查看

16 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

Avalon总线IP核的定制简介NIOSII是一个建立在FPGA上的嵌入式软核处理器,除了可以根据需要任意添加已经提供的外设外,用户还可以通过定制用户逻辑外设和定制用户指令来实现各种应用要求。这节我们就来研究如何定制基于Avalon总线的用户外设。SOPCBuilder提供了一个元件编辑器,通过这个元件编辑器我们就可以将我们自己写的逻辑封装成一个SOPCBuilder元件了。下面,我们就以PWM实验为例,详细介绍一下定制基于Avalon总线的用户外设的过程。我们要将的PWM是基于Avalon总线中的AvalonMemoryMappedInterface(Avalon-MM),而Avalon总线还有其他类型的设备,比如AvalonStreamingInterface(Avalon-ST)、AvalonMemoryMappedTristateInterface等等,在这里我就不详细叙述了,需要进一步了解的请参考ALTERA公司的《AvalonInterfaceSpecifications》(mnl_avalon_spec.pdf)。Avalon-MM接口是内存映射系统下的用于主从设备之间的读写的接口,下图就是一个基于Avalon-MM的主从设备系统。而我们这节需要做的就是下图高亮部分。他的地位与UART,RAMController等模块并驾齐驱的。Avalon-MM接口有很多特点,其中最大的特点就是根据自己的需求自由选择信号线,不过里面还是有一些要求的。建议大家在看本文之前,先看一遍《AvalonInterfaceSpecifications》,这样就能对Avalon-MM接口有一个整体的了解。下图为Avalon-MM外设的一个结构图,理论的就说这些,下面我们举例来具体说明,让大家可以更好的理解。构建HDL我们这一节以PWM为例,所以首先,我们要构建一个符合Avalon-MMSlave接口规范的可以实现PWM功能的时序逻辑,在这里,我们利用Verilog语言来编写。在程序中会涉及到Avalon信号,在这里,我们说明一下这些信号(其中,方向以从设备为基准)HDL中的信号Avalon信号类型宽度方向描述clkclk1input同步时钟信号reset_nreset_n1input复位信号,低电平有效chipselectchipselect1input片选信号addressaddress2input2位地址,译码后确定寄存器offsetwritewrite1input写使能信号writedatawritedata32input32位写数据值readread1input读使能信号byteenablebyteenable1input字节使能信号readdatareaddata32output32位读数据值此外,程序中还包括一个PWM_out信号,这个信号是PWM输出,不属于Avalon接口信号。PWM内部还包括使能控制寄存器、周期设定寄存器以及占空比设置寄存器。设计中将各寄存器映射成AvalonSlave端口地址空间内一个单独的偏移地址。每个寄存器都可以进行读写访问,软件可以读回寄存器中的当前值。寄存器及偏移地址如下:寄存器名偏移量访问属性描述clock_divide_reg00读/写设定PWM输出周期的时钟数duty_cycle_reg01读/写设定一个周期内PWM输出低电平的始终个数control_reg10读/写使能和关闭PWM输出,为1时使能PWM输出程序如下:modulePWM(clk,reset_n,chipselect,address,write,writedata,read,byteenable,readdata,PWM_out);inputclk;inputreset_n;inputchipselect;input[1:0]address;inputwrite;input[31:0]writedata;inputread;input[3:0]byteenable;output[31:0]readdata;outputPWM_out;reg[31:0]clock_divide_reg;reg[31:0]duty_cycle_reg;regcontrol_reg;regclock_divide_reg_selected;regduty_cycle_reg_selected;regcontrol_reg_selected;reg[31:0]PWM_counter;reg[31:0]readdata;regPWM_out;wirepwm_enable;//地址译码always@(address)beginclock_divide