基于FPGA ad数据采集存储处理报告(含Verilog源代码)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于FPGA AD数据采集存储处理项目报告
(XILINX ALTEARA 都可用)
组员:华、文、杰
一、实验目的
本次实验利用Basys2开发板完成一个开发小项目,即开发AD数据采集存储处理系统,旨在掌握FPGA开发基本方法以及锻炼解决开发过程中出现问题的能力。
二、关键词
Basys2、FPGA、AD转换、RAM、串口通信、MATLAB处理
三、方案设计
要实现本次项目,首先确定器件,其次根据器件时序写出模块的使用程序,最后综合成一个工程,然后进行仿真,上板实验。
本次实验的器件:32M8位模数转换器、Basys2开发板、串口转RS232cp2102模块、基于三极管的电平转换电路。
选择好器件后,根据器件的时序完成模块的代码书写。
写好AD模块、串口通信模块后,现在就需要处理采样速率与串口通讯速率不匹配的问题了。根据香农采样定理,采样频率得高于信号频率的两倍才能完成信号复现,我们这里使用25M的高速采样频率,而串口dps9600传送一个位104us 明显比采样慢许多。所以这里需要解决速率不匹配的问题。我们想到可以利用FPGA的RAM先存储采样来的数据,然后再提取数据经过串口通信送至PC经由MATLAB处理。
本次小项目最为关键的是控制好采样与串口通信的时序问题。关于时序的控制,留到模块介绍里面说明。
方案小结:本次实验基于片内RAM存储AD采样过来的数据,然后待采样完成后提取数据串口通信至PC,最后经由matlab处理。
四、模块介绍
1.Verilog开发程序介绍
如下给出基于QuartusII绘制出的Block Diagram图,涵盖了所有的模块以及模块之间的连线。
图4.1 综合模块图
如下给出程序目录(txt格式):
现在分别介绍各个模块的端口以及功能。
AD外设:电路图、实物图、接口
这个外设提供最大32M采样速率,包括一个模拟信号输入和一个采样时钟输入以及八个数字信号输出。在每个采样时钟的上升沿输出相应的采样数字信号。Basys2开发板:
串口通讯模块外设:
这个模块旨在把Basys2输出的LVTTL转换成RS232的负逻辑高电平,实现串口与PC的通信。
它有五个引脚:GND、3.3V、5V、TXD、RXD。在使用中,只使用RXD和GND。
需要注意的是,倘若GND不与FPGA串口的GND连接,那么串口输出的电平,此模块无法识别,这就是数字地需要共地的重要性。
这里的RXD接Basys的串口输出C6(这是分配的tx输出管脚)。
接线当然用杜邦线的公母线连接。
TOP模块:
TOP模块命名为TEST是当时自己写的非最终版程序用来测试正确性,最后测试正确后也没修改过来,但是对仿真没影响。
clk是系统时钟输入,用来作为全局时钟并且为调用后面四个子模块提供时钟基础,设置为50M。
rst_n是系统复位设置,复位到初始状态,这里大家都熟悉,不用多说。
input[7:0]datain是AD外设的8位数字信号输入,这个数字信号随着AD采样时钟(clk_25M)变化,在后面CLK模块里面会说明。
output clk_25M为调用CLK模块后输出的AD采样时钟,这个输出用来接AD外设的时钟输入,提供采样时钟。
output tx为调用uart模块后,与PC通信的“桥梁”,即携带数据的信号吧。
CLK模块:
这里模块名字设置为AD_2CLK,旨在表明输出两个CLK,用来AD采样和串口通信。
input clk为系统时钟50Mhz。
Input reset_n为系统复位,低电平有效。
Output reg clk_25M为AD采样时钟,之前做过说明。
Output reg dps9600为输出给uart模块的时钟。
ENCON模块:
这个模块是整个程序的控制核心,下面介绍端口说明。
Input wr_clk为写时钟输入,这里我们接的当然就是AD写入的时钟CLK_25M,这里的写速率要和采样速率匹配才可以保证采样再存储的正确性。
Input rd_clk为读时钟输入,这里接dps9600,符合串口协议。
Input rst_n为系统复位,低电平有效。
Output reg wren为写使能输出,当wren为高时,写有效,即表明AD的八位数字信号写进RAM。
Output reg [8:0]wraddress为写地址,写地址在写时钟下降沿完成加一,保证每次写完后都是新的地址存储数据保证了ram能够存储512个正确数据。
Output reg rden为读使能输出,当rden为高时,读有效,即表明RAM里面对应地址的信号读出。
Output reg [8:0]rdaddress为读地址,在每个读信号的下降沿完成加一,保证每次读完一个数据后地址指向新的内容,保证读出的512个数据的正确性。
Output reg wrsig 为发送给串口的发送信号,上升沿有效。每一上升沿使串口开始发送送到串口的数据给PC。
RAM模块:
Input wr_clk为RAM的写时钟,上升沿有效在相应地址写入数据。
Input wren为RAM写使能信号,高电平有效,有效时配合wraddress和wrclk 进行写操作。
Input [8:0]wraddress为写地址,在每个wr时钟下降沿完成加一操作,确保每次写入的地址正确性。
Input rd_clk为RAM的读时钟,上升沿有效,在相应的地址读出数据。
Input [8:0]rdaddress为读地址,同写地址功能。
Input rden,同wren。
Output dataout是读出的数据,送至UART模块通信给PC。
UART模块:
Input clk为CLK模块的clk_dps9600,用于配合这个模块打成波特率为9600的串口输出。
Input rst_n为复位,低电平有效。
Input [7:0]datain接RAM模块的数据输出。
Input wrsig上升沿有效,开启串口发送,接ENCON模块wrsig。
Output reg idle 为串口工作状态说明,为高表明正在发送数据。
Output tx为发送的串口信号,接至上面的串口通讯外设模块RXD。
介绍完所有模块后,现在给出仿真波形以及testbench的设置。
TOP程序以及子程序调用: