testbench 中readmemb/readmemh的函数
在测试ADC读入数据的数据处理的时候,需要从textbench中给ADC输入接口一个数据信号,以便观察后续的处理模块功能是否达到要求。本教程使用verilog 中的readmemb/readmemh函数读取正弦波数据,输入给ADC的并行接口,模拟ADC读取到的数据驱动后续信号处理模块。有关readmemb/readmemh可以参见夏宇闻老师的《Verilog数字系统设计教程》第103页。
波形生成
模拟ADC输入的波形可以由matlab、python、C/C++生成,也可以由波形生成器生成。或者有实际的波形可以由信号采集卡采集并用软件处理得到。我这里展示使用的python 生成一个正弦波数据。数据接口是14位ADC给13位数据。
import numpy as np
import matplotlib.pyplot as plt
am = 2**13 # 幅度,比如我需要给14位Adc一个正弦波数据,那我的最大幅度就是2^13
bias = 0 # 直流偏置量
point = 64 # 正弦波的点数,点数=采样频率/预期的频率
x = np.linspace(0,2*np.pi,point)
y = bias+am*np.sin(x)
wave = y.astype(int) #转换y值为int型
file_name = 'sin_bin.txt'
with open(file_name,'w') as file_object:
for row in wave:
file_object.write(bin(row)+"\n")
file_object.close()
#绘图
plt.plot(x,wave,'bp--')
plt.show()
testbench 调用
首先将上面产生的sin_bin.txt文件放入vivado产生的testbench文件夹中(不挑地方,主要是放这里方便找)。然后在testbench中读入数据,这里比较坑的地方是1、使用绝对路径。2、一定要用正斜杠而不是win中的反斜杠。
reg signed [13:0] memory [0:63]; //例化一个位宽为14位,深度为64的存储器
//读入数据并显示
integer i;
initial begin
$readmemb("D:/FPGAproject/.../sin_bin.txt",memory); //这里路径一定要用相对路径,并且使用斜杠/而不是反斜杠\。
for(i = 0; i<64;i=i+1)
$display("memory[%d] = %b",i,memory[i]);
end
读入数据后,就需要把数据发送给adc的接口。这里ADC_DATA就是ADC的并行数据接口。
//数据输入ADC的并行数据接口
integer cnt;
initial begin
#1;
ADC_DATA =0;
forever begin
for(cnt = 0; cnt <64;cnt = cnt +1)
#(CYCLE) ADC_DATA = memory[i];
end
end
然后再仿真就可以看到ADC_DATA已经有正弦波数据输入了。
以上讨论的是简单的并口输入ADC的模拟输入方式,而串行输入的ADC,则需要根据ADC的手册加上控制信号并满足数据帧格式的输出。