testbench中的$read函数使用

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的手册加上控制信号并满足数据帧格式的输出。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值