随着电子技术的发展,电子系统设计的规模和复杂程度不断的加大,与此同时,人们对电子产品的各方面性能的要求都在不断的升高,对于开发商来说,以最快的速度,开发出满足市场需要的电子产品是最根本的目的。显然,传统的硬件、软件单独设计的方式很难满足人们这种快速增长的需求。近年来,电子行业提出了软硬件协同起来进行设计的思想,SOPC就是在这种需求下由ALTERA 公司提出的一种软硬件协同设计的解决方案。它将硬件的设计集中到一个高度集成的FPGA 芯片中,对于特殊的应用设计,可以根据需要灵活的配置系统的硬件。而这一目标的实现是基于NIOS 处理器以及其他一些用户可选的IP 核。虽然这种方法,给设计带来了极大的方便,但是现有IP 核并不能总是能够满足用户的需要。因此,进行SOPC 开发,很有必要学习一下定制NIOS 外设的方法和技巧。本文就是基于这种目的,详细的论述了在NIOS 系统中A/D 数据采集接口的设计与实现,以供大家参考。
在NIOS 系统中实现外部模拟数据的采集,可以有很多种方法,比较传统的是,在外部由一个控制器控制数据采集的过程,然后再利用标准的接口和上位机连接,进行数据传输,实现数据的采集。比较常见的标准接口有串行口、USB 口。但是在FPGA 中实现这些接口逻辑不仅复杂,而且还需要外部主控制器来控制数据的采集和传输。对于NIOS 系统而言,它是建立在有着大量逻辑资源的FPGA 芯片上的,如果用它实现复杂的逻辑,然后还要外部控制器的配合,而目的只是进行外部数据的采集,显然这是不可取的。如果能够有一种简单的方法,不仅可以满足用户的设计要求,而且不需要其它的外部主控制器,这将是一种很好的选择。因此,最好的方式应该是直接在FPGA 芯片上根据需要灵活的去实现控制逻辑接口。
如上所述,在FPGA 上系统中,实现对外部A/D 数据采集电路的控制接口逻辑,由于其逻辑功能不是很复杂,采用自定义的方式将是非常可取的。采用这种方法进行设计有两种途径。
①从软件上去实现。这种方案将NIOS 处理器作为一个主控制器,通过编写程序来控制数据转换电路,实现数据采集。采用这种方法,在实现的时候会出现一些问题,由于NIOS处理器的工作频率相对于外部设备来说要高出许多,因此,我们无论是采用查询的方式还是采用中断的方式,都会造成CPU 资源极大的浪费,用查询的方式CPU 将会出现大量的等待,用中断的方式系统又会频繁被中断。无论怎样,牺牲CPU 的性能来解决功能上的问题是不可取的,当然,在这种情况下如果采用DMA(内存直接存取)的方式可以解决以上提出的问题,但是实现起来也比较复杂。
②用FPGA 的逻辑资源来实现A/D 采集电路的控制逻辑。我们知道FPGA 有着丰富的逻辑资源和接口资源,在其中实现并行的数据采集很少会受到硬件资源的限制,而且,在功能上,设计的接口控制逻辑相当于一个主控制器,它是针对具体的外部电路而实现的,容易满足要求、又能节约资源,提高系统性能。因此,采用硬件逻辑去实现控制将是一种较好的方式,下面本文将对这种实现方式作详细的讨论。
通过对系统需求进行仔细分析,此模块的功能设计可分为数据采集控制逻辑、数据接口、数据处理逻辑三部分,其整体功能框架图如下:
图1 模块功能框图
说明:AVALON 总线主要是用于连接片内处理器与外设,以构成可编程单芯片系统。
在此以典型的模数转换芯片ADC0804 为例,进行电路设计,ADC0804 的数据宽度为8位,数据转换时间最快为100us,转换时钟信号可以由内部施密特电路和外接RC 电路构成的震荡器产生,也可以直接由外部输入,其频率范围:100KHZ~1460KHZ。在本设计中ADC0804的时钟为最大输入频率,控制信号时序如图2。
图2 ADC0804 控制信号时序图
由ADC0804 的时序可以知道,转换过程由一个写信号启动,转换完成后,输出INTR信号,此时可以读取数据。之后可以进入下一个转换周期。由ADC0804 的转换时间可知,其最大采集频率为10KHZ,只要用户设置的采样频率不超过这个数值,ADC0804 就可以正常的工作。综合以上考虑,设计时要注意两点:
①写信号的频率要低于ADC0804 的最大转换频率。
②在写信号之后至少要有100us 的时延,才能输出读信号。
在此,提出两种方法来实现ADC0804 的控制信号时序:
①主动模式,在这种模式下,控制电路启动A/D 转换后,在INTR 信号的作用下,输出读信号,同时从ADC0804 的数据总线上读入数据,之后输出一个写信号,开始下一次转换。由于这种方式是异步进行的,读
写信号彼此之间交互的产生,因此,能够满足上面提出的两点要求。采用这种方式,其难易程度与ADC0804 外部电路的接法密切相关。
②被动模式,在这种模式下,ADC0804 的读写信号完全由控制电路按照固定的时序产生,与其自身输出无关。采用这种方式,可以不考虑ADC0804 的输出,读写信号的产生只是用到了一个计数器,实现起来比较简单,而且,只要采集频率不是很高,那么,就可以很容易满足ADC0804 控制信号的时序要求。
在这一部分,主要存在的问题是:相对于AVALON 总线信号来说,A/D 采样的速率非常低,而且,AVALON 总线的接口信号和ADC0804 数据输出的接口信号时序不一致。因此,要实现满足要求的数据通道,要做到两点,
①数据缓冲,实现速率匹配。
②信号隔离,实现接口时序的转换。解决这两点,可以将两端口通过一个异步的FIFO 连接,该FIFO 应该是可以在不同的时钟信号下进行异步的读写。这样的一个FIFO 的实现可以在Quartus-II 里面用ALTERA 公司提供的FIFO Core 进行定制。在本设计中,定制的FIFO 模块如图3。
图3 FIFO 原理图
其中,data[7..0] 数据输入端口、q[7..0]数据输出端口、wrreq、wrclk 分别是写允许和写时钟信号线、rdreq、rdclk 分别是读允许和读时钟信号线,wrfull、rdempty 分别是FIFO 满和空信号线、aclr 为异步清空信号线,高电平有效。以下是8 字节FIFO 逻辑仿真图:
图4 FIFO 时序仿真图
以上时序图中各信号都是高电平有效。初始状态,rdempty 有效,wrfull 无效。当写允许信号wr 有效时,外部输入的数据data 在写时钟wrclk 的作用下写入到FIFO 的缓冲区。当有数据暂存在FIFO 中时,rdempty 变为无效。当FIFO 中已有N-1(N 为FIFO 数据缓冲区的长度)个数据时,写入第N 个数据,wrfull 变为有效,此时外部的数据不能写入FIFO。如图中标志①②,在写入数据08 时,wrfull 为有效,导致08 没有写入FIFO 中。当读允许信号rd 有效,FIFO 不为空时,在读时钟rdclk 的作用下数据从q 输出。
在这一部分,设计中实现了外部数据的异常检测,即、当外部的数据超过预设的范围时,数据处理模块会向处理器输出中断信号,通知处理器进行处理。由于此部分在实现时没有时序上的严格要求,只须完成功能需求即可,其难易与其实现的功能相关,就本例实现的功能而言,逻辑描述比较简单。
下面是综合以上所述,在Quartus-II 中设计实现的ADC0804 数据采集接口控制模块的原理图。
图5 A/D 数据采集控制模块原理图
在图(5)中,read、readdata、reset、irq 分别与AVALON 总线相同命名的信号线相连,readclk 与AVALON 总线中clk 相连, AD_50 与FPGA 的系统时钟相连,wr_n、rd_n、writedata分别与ADC0804 的写信号线、读信号线、数据线相连。在图(5)中,ADC0804 控制信号产生单元的实现,采用的是上文提到的被动模式,该单元以固定的时序产生读写信号,本设计中使用的采样频率约为3200HZ,此频率可以根据用户的需要而设定,只要不超过10KHZ 即可。
当系统加电后,wr_n 输出一个有效的写信号启动A/D 转换,经过足够的时间后(T=327us~328us),输出读信号,此时数据接口单元的写允许信号wr_fifo 变为有效,同时外部A/D 转换器的读允许信号也变为有效,此后ADC0804 的数据端口上输出有效数据,在wr_clk 的上升沿将A/D 转换器的数据读入FIFO。控制逻辑单元的时序仿真图如下:
图6 控制信号时序仿真
由时序图可以知道,在wr_fifo 有效时,ADC0804 必须在wr_clk 的上升沿到来之前在其数据端口输出有效的数据。由于wr_clk 的周期为1us,ADC0804 的输出锁存由其读引脚rd 控制,rd 变为有效即可输出有效的数据,故只要ADC0804 的读信号rd 在外部输入的作用下变为有效的时间不超过500ns,读操作就不会出现问题。又由ADC0804 的数据手册可以知道,ADC0804 的rd 信号三态延时最大值为200ns,典型值为125ns,因此设计的控制信号产生逻辑单元满足要求。
当NIOS 系统需要读取数据时,在read 和readclk 上出现的是系统AVALON 总线上的读时序。时序图如下:
图7 基本从端口读传输
在AVALON 总线中定义了两种类型的信号,一种是高电平有效,另一种是低电平有效。在本设计中选用的是高电平有效的类型。图(7)是低电平有效的总线信号,与之对应的高电平有效的总线信号时序图中,read 在有效时为高电平对应于图(7)中的readn 的低电平部分。又由图(4)可以看出,该总线读操作时序完全满足FIFO 读操作时序。图7 中,address,be-n 和chipselect 在此可以不与考虑,添加到AVALON 总线时,系统会自动处理其连接问题。
当系统不读取A/D 转换的数据时,采集的数据由数据处理单元控制处理。数据处理单元实现了对外部信号量的异常检测,即,当外部信号的幅值超出设定范围时,该单元产生一个中断信号,通知CPU 采取相关处理措施,否则,在FIFO 满的时候,将其内容清空。
在此介绍一种相对较为简单的方法将设计的外设接口接入NIOS 系统。步骤如下:
⑴ 在Quartus-II 中创建一个工程,完成ADC0804 和NIOS 接口模块的相关设计。
⑵ 将设计的各部分综合成一个.bdf 文件或是用硬件描述语言对其综合。
⑶ 将设计的相关文件(.bdf、.verilog hdl)复制到要添加此模块的NIOS 工程目录下面去。
⑷ 在已有的NIOS 系统中添加用户接口逻辑(interface to user logic ),按照添加向导的提示,将设计的顶层文件加入到相应的栏目中。如下图:
图8 添加用户逻辑图形向导
并要设置好信号线的类型,确定其是否是AVALON 总线的信号线,还是外部信号线。
⑸ 加入到NIOS 系统后,编译,生成完整的硬件系统。
⑹ 为生成的系统创建软件工程,编写测试代码。
以上的设计,经测试,具有较好的性能,可以不间断无数据丢失的进行数据采集,CPU可以主动的读取数据,也可以在数据处理单元检测到外部异常信号时被动的获取数据,并且CPU 读取数据的操作极其简单,运行时只占用很少的CPU 资源,虽然如此,但这种实现方式也有一些缺陷,如只能以单一频率进行采集,数据处理机制比较简单,控制部分与ADC0804 之间缺乏交互等,这些使得最终的实现结果不是很完美。在此,仅希望本文能在如何设计NIOS 系统外设方面给读者以参考借鉴,同时,更希望有兴趣的读者对文中留下问题作更深入的探讨。
参考文献:
[1] 《挑战SOC—基于NIOS 的SOPC 设计与实践》,主编:彭澄廉,清华大学出版社,2004.7。
[2] ALTERA 技术文档,2006.8。
[3] ADC0804 数据手册,1999.7。