引言
由于FPGA的出现,用SOPC技术设计SoC已成为趋势。QuartusII中的SOPC Builder能方便地构建一个基于FPGA的SOPC系统。用户在系统构件库中挑选所需的构件,设置相关参数,SOPC Builder便自动生成一个以Avalon总线连接各个模块的SOPC系统。SOPC Builder的构件库中包含一些常用的外设;对于一些库中没有提供的器件,需自定制接口接入。当此接口要实现一些具体的功能时,则需要用HDL语言来描述定制模块;如果没有逻辑功能部分,便可采用直接与总线相连的方式接入,以构建一个SOPC系统。利用SOPC Builder中的新模块定义功能定制一个时序上的转换逻辑,将外设直接接入总线,并编写相关的软件对其进行操作,此方法要根据Avalon总线规范及外设控制时序来设计。在实际工程中存在两种类型的外设,即存储器型和寄存器型。前者泛指一般存储器,如SRAM、DRAM等,而后者泛指除前者以外的外设。本文介绍如何将16位的SRAM和USB控制芯片CH372接入Avalon总线并在FPGA上实现,内容涵盖所有外设的接入方法,为其他外设接入提供了一个范例。
1 NiosII SOPC的中Avalon总线
外设接入以Avalon总线连接的SOPC,必须使得外设的信号类型及读写时序满足Avalon总线规范。Avalon总线是Altera公司发布的将处理器及周边外设互联的一种片上总线。
Avalon总线上的外设可以在片内,也可以在片外。它实现一定的功能,并与Avalon总线上的其他系统构建通信;外设是模块化的系统构件,可以根据系统的要求在设计时增加或删除。用户自己设计添加的模块叫作“用户自定义逻辑”。任何用户自定义逻辑需提供Avalon总线的地址、数据和控制信号,才可以成为Avalon外设。
1.1 Avalon总线型号类型
在外设实际存在于芯片外部,且需要一些时序转化逻辑来连接Avalon总线信号的情况下,可把Avalon总线模块信号作为系统模块的端口引出到外面,连接到外部的外设。Avalon总线规范不要求外设必须包含哪些信号,它只定义了外设可以包含的信号类型,如地址、数据、时钟等。Avalon总线规范不规定Avalon外设的命名规则,不同信号类型的作用是预先定义的,而型号的名称则是由外设决定的。Avalon总线规范给出了这样一些预先定义的型号类型:全局时钟clk、来自Avalon总线模块的地址线address、读使能read、读数据信号readdata、写使能write、写数据信号writedata、中断请求irq,等等。
1.2 Avalon总线读/写时序
Avalon总线规范规定了Avalon总线和端口之间传输、交换数据的几种方式。带有固定等待周期的写过程等待了几个周期及address、chipselect等信号稳定了几个周期后,从端口才捕捉来自Avalon总线的数据信号。具有建立时间和保持时间的写过程有一些外设要求address、chipselect、writedata各种控制信号要在写使能信号write有效前后能稳定一段时间(分别叫作“建立时间”和“稳定时间”)。带有固定等待周期的读过程等待了几个周期及address、chipselect等信号稳定了几个周期后,Avalon总线才捕捉来自外设的数据信号。具有建立时间的读过程有一些外设要求address、chipselect、readdata各种控制信号要在写使能信号read有效前能稳定一段时间。
1.3 Avalon总线上的地址对齐
Avalon总线模块能够适应主从外设的不同宽度和不匹配的数据宽度。当系统中存在不匹配的存储端口时,要考虑地址对齐问题。由于存在两类外设,所以有两种地址对齐方式: 对于存储器型的外设,采用动态地址对齐方式,即当较宽主端口读较窄端口时,Avalon总线发起多次读传输,直到主端口被填满为止;对于寄存器型的外设,采用静态地址对齐方式,即当较宽主端口读较窄端口时,Avalon总线发起一次读传输,将较窄的从端口数据读到主端口,其高位空位补零。
2 动态地址对齐型SRAM的接口设计
IS61LV25632型SRAM是一种256K×16字节的同步静态RAM,属于存储器型外设,在基于NiosII的SOPC中采用动态地址对齐方式,即在new component edit的interface页中,将Slave addressing设置为memory(useing dynamic bus sizing),表示所接的外设为存储器型。在本设计PCB中将其高低字节使能UB,LB信号线接地。
利用SOPC Builder中的new component edit设计IS61LV25632型SRAM的接口;在new component edit中设置SRAM的信号线,并设置其相应的Avalon总线型号类型。通常为: 片选cen,读写使能wen、oen,数据线data,地址线addr;其对应的Avalon总线信号为chipselect_n,write_n,read_n,data,address。
选择动态地址对齐方式,使得主端口能连续地对外设进行读写,并使系统将外设认作存储器型外设,根据IS61LV25632型SRAM手册中读写时序中的各时间参数值,设定其set up、read wait、write wait及hold time的时间均为10 ns,使其接口既符合Avalon总线读写时序的要求,又符合IS61LV25632型SRAM读写时序的要求,如图1所示。
图1
完成SRAM的接口设计后,将其添加到系统中构建SOPC。在实际工程中,对于存储器类型的器件,引脚的分配还要涉及地址宽度的问题。图2是添加了SRAM接口后的SOPC所生成的工程,在地址线的连接上考虑了一个地址宽度的匹配问题。
图2
对于三态桥外设,地址信号代表1个字节,而非三态桥外设的地址信号代表1个字。当三态桥外设的数据宽度要大于1个字时,及当数据宽度为1~8位时,外设的a0引脚接到处理器端地址口的address[0];当数据宽度为9~16位时,外设的a0引脚接到处理器端地址口的address[1];当数据宽度为17~32位时,外设的a0引脚接到处理器端地址口的address[2],依此类推。此设计中的SRAM宽度为32位,故引脚的连接错出了2位,这样的规则适合所有动态地址对齐方式的外设。
当完成其信号类型和时序方面的设计后,将其命名为sram,并将其添加到SOPC中;整个工程编译后,在Nios II IDE中的System Library会出现刚定制的接口sram,进行图3所示的设置,将program memory指定为sram,C程序就可以在IS61LV25632 SRAM中运行了。
图3
3 静态地址对齐型CH372的接口设计
CH372 是一个USB 总线的通用设备接口芯片。在本地端,CH372 具有8位数据总线和读、写、片选控制线以及中断输出,可以方便地挂接到单片机/DSP/MCU/MPU等控制器的系统总线上。CH372 芯片属于寄存器型外设,须采用静态地址对齐方式。在本地端提供了通用的被动并行接口, CH372的8位双向数据总线D7~D0、读选通输入引脚RD、写选通输入引脚WR、片选输入引脚CS、中断输出引脚INT以及地址输入引脚A0。要想将其接入Avalon总线,则需要做一些逻辑上的转换,让其符合Avalon总线规范。在SOPC Builder中的new component edit的设计如图4所示。
图4
如前所述,CH372的读/写也有一定的要求。其写过程要求在写使能信号有效前和失效后分别有建立时间和保持时间,并且写使能信号有一个持续时间,即写使能信号有一个持续时间对应于以上的固定等待周期;其读过程要求在读使能信号有效前有建立时间,并且写使能信号有一个持续时间,即读使能信号有一个持续时间也对应于以上的固定等待周期。要使Avalon总线的读/写时序与CH372的一致,其SOPC Builder中的设计应如图5所示。
图5
以上为new component edit中interface的设置,setup、hold分别对应建立时间和保持时间,read、write wait对应读/写使能信号的持续时间。图6为其中同时满足Avalon总线要求和CH372时序要求的时序。
图6
这样便使CH372的时序与Avalon总线的读/写时序一致了。
以下为写数据函数。写命令、读数据函数与其相似,分别为CH372WRCMD(alt_u8 data)和CH372RDDATA()。为了满足CH372的读/写时序要求 ,即所传输的数据要有一定的时延,在每个函数中加了一个延时环节for(i=0; i<100; i++),使得数据的读/写可以达到很好的同步,不至于在一个数据还未到来时就发起了读操作,造成数据丢失。
void CH372WRDATA(alt_u8 data) {
*CH372DATA = data;
alt_u8 i;
for(i=0; i<100; i++);
}
通过调用读/写函数CH372WRCMD(alt_u8 data)、CH372WRDATA(alt_u8 data)、CH372RDDATA(),根据CH372的读/写时序要求,可对CH372进行读/写。以下是一个向上位机传输数据的函数,在此函数中先调用写命令函数写入命令CMD_WR_USB_DATA7,表示要上传数据,然后依次写入要发送数据的长度和要发送的数据。
void CH372UPBYTE() {
CH372WRCMD(CMD_WR_USB_DATA7);
CH372WRDATA(RecDataCount);
for(i = 0; i < RecDataCount; i++)
CH372WRDATA(RecData[i]);
}
4 结论
本文介绍的将两类外设接入Avalon总线以构建基于NiosII的SOPC的方法,CH372和IS61LV25632型SRAM,两种外设均有代表性。其他所有外设都可归为此两类,并可参考其设计方法。添加了基于两种方法设计接口的SOPC均在CycloneII EP2C20240C8 FPGA上实现,并在实际基于NiosII的嵌入式系统工程项目中正常使用。