reference: https://blog.csdn.net/HOOKNET/article/details/79254351

前言

在FPGA开发过程中几乎都要用到仿真的功能,对于一些简单的外部激励(如时钟、复位、简单数据或者信号等)直接在testbench中编写产生就行了,但对于复杂的外部激励数据,很难在testbench中产生,这时就要通过读取外部文件里的数据来实现。通过和matlab的配合使用,基本上可以模拟各种外部激励。 
举例来说:输入信号是三个不同频率的正弦波的相加,经过FIR低通滤波器滤除高频分量,输出频率最低的那个正弦信号。这种情况下测试用的输入信号不能通过testbench编写产生。 
简单来说有以下两种方法可以模拟输入信号:

  • 在FPGA内部通过DDS产生三个正弦波,然后将三个波形相加作为输入信号。
  • 利用matlab产生输入信号,将数据导出为.txt文件,在仿真时读取文件内的数据作为外部激励。

显然第二种方法更加灵活和便捷。下面,具体介绍一下这种方法的使用。


平台:

  • Vivado 16.4
  • Matlab R2017b

Matlab程序编写:

  • 代码如下:
%=============设置系统参数==============%
f1=1e6; %设置波形频率
f2=500e3;
f3=800e3;
Fs=20e6; %设置采样频率
L=1024; %数据长度
N=14; %数据位宽
%=============产生输入信号==============%
t=0:1/Fs:(1/Fs)*(L-1);
y1=sin(2*pi*f1*t);
y2=sin(2*pi*f2*t);
y3=sin(2*pi*f3*t);
y4=y1+y2+y3;
y_n=round(y4*(2^(N-3)-1)); %N比特量化;如果有n个信号相加,则设置(N-n)
%=================画图==================%
a=10; %改变系数可以调整显示周期
stem(t,y_n);
axis([0 L/Fs/a -2^N 2^N]); %显示
%=============写入外部文件==============%
fid=fopen('E:\Workspace\Vivado_16.4\TEST\TestBench\sin_data.txt','w'); %把数据写入sin_data.txt文件中,如果没有就创建该文件
for k=1:length(y_n)
B_s=dec2bin(y_n(k)+((y_n(k))<0)*2^N,N);
for j=1:N
if B_s(j)=='1'
tb=1;
else
tb=0;
end
fprintf(fid,'%d',tb);
end
fprintf(fid,'\r\n');
end fprintf(fid,';');
fclose(fid);

  

此程序中设置了三个频率分别为1M、500k和800k的正弦波,然后将三个波形相加并且量化后作为输出。最后将路径设置为相应文件所在路径即可,需要注意的是如果对应路径下没有相应文件,则会自动新建文件并写入数据。

  • 运行程序: 

  • 打开对应的文件目录 

    可以看到二进制数据文件已经生成。

接下来就可以进行在testbench中读取外部数据的操作了。

Testbench的编写:

  • 代码如下:
`timescale 1ns/1ps

module TB_readfile();
reg SCLK;
reg [:] data_out; //--------------时钟部分----------------//
initial SCLK = ;
always # SCLK = ~SCLK; //-------------------------------------//
parameter data_num = 'd1024;
integer i = ;
reg [:] data_men[:data_num];
reg [:] data_reg = ;
initial begin
$readmemb("E:/Workspace/Vivado_16.4/2017_8_28_TEST/TestBench/sin_data.txt",data_men); //注意斜杠的方向,不能反<<<<<<<
end
always @(posedge SCLK) begin
data_out <= data_men[i];
i <= i + 'd1;
end
//------------------------------------// endmodule

里只需要读取外部数据,所以Vivado工程里只需要添加仿真文件就行了。

  • 运行仿真: 

    可以看到,仿真的波形和matlab中显示的波形一致,说明结果正确。

最新文章

  1. discuz首页设置默认地址不带forum.php后缀的方法
  2. canvas学习笔记:canvas对图片的像素级处理--ImageData的应用
  3. LeetCode 7 Reverse Integer(反转数字)
  4. 下拉列表autocomplete各种实现方式比较
  5. Android中string.xml文件中设置部分字体颜色大小
  6. SquashFs工具制作
  7. HBase Error: connection object not serializable
  8. PT100运算放大器电路
  9. untiy绘制网格mesh
  10. 9月mob(ShareSDK)活动预告,这个秋天非常热
  11. web前端素材整理汇总
  12. 工作流Activiti5.13学习笔记(一)
  13. DBUtils温习2
  14. LINUX_正则表达式
  15. 递归n!
  16. tomcat部署war包
  17. PAT 1026 程序运行时间(15)(C++&Java&Python)
  18. Java编程的逻辑 (7) - 如何从乱码中恢复 (下)?
  19. js-验证码插件gVerify.js
  20. hdu3374(最小最大表示法以及kmp)

热门文章

  1. 质控工具之TrimGalore使用方法
  2. C# 编写WCF简单的服务端与客户端
  3. 第十章 Call 和 Ret 指令
  4. windows上使用composer安装yii2
  5. MySQL事务(三)
  6. function_exists
  7. MVC实战之排球计分(一)—— 需求分析与数据库设计
  8. 【实战问题】【2】Ambiguous mapping found. Cannot map &#39;xxController.Create&#39; bean method
  9. hadoop集群添加新节点
  10. js向一个数组中插入元素的几个方法-性能比较