Verilog matlab与FPGA文件的输入输出

1、产生FPGA仿真需要使用到的正弦波采样数据,10bit量化,以二进制形式写入文本,以分号(;)结尾:

%设置参数
fi=5000;
L=1024;
N=10;
fs=20000;

%产生信号
t=0:1/fs:(L-1)/fs;
theta=rand()*2*pi;
si=sin(2*pi*fi*t+theta);

f_s=si/max(abs(si));     %归一化
Q_s=round(f_s*(2^(N-1)-1));  %10bit量化

fid=fopen('C:\Users\HLPC\Desktop\Sin.txt','w');
for k=1:length(Q_s)
    B_s=dec2bin(Q_s(k)+(Q_s(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);

生成的TXT文件如图:在这里插入图片描述

2、从外部txt文件读入一定数据长度的10bit二进制数据作为测试激励:

integer cnt;  
reg [9:0]stimulus[1:data_num];  //data_num仿真数据长度
initial begin
    $readmemb("Sin.txt",stimulus);
    cnt = 0;
    repeat(data_num)begin
        cnt = cnt + 1;
        din = stimulus[cnt];
        #clk_period;
    end
end

3、将FPGA仿真的数据写入txt文件,可通过改变waveform style修改输出数据格式:

integer file_out;
initial 
begin
   //文件放置在"工程目录\simulation\modelsim"路径下                                                  
	file_out = $fopen("out.txt");
	if(!file_out)
		begin
			$display("could not open file!");
			$finish;
		end
end

wire signed [31:0] dout_s;
assign dout_s = data_o;           //将dout转换成有符号数据

always @(posedge clk)begin    
    if(m_axis_data_tvalid)
	   $fdisplay(file_out,"%d",dout_s);
end

在这里插入图片描述
4、Matlab对十进制仿真数据进行读取分析

Fs=20000; %采样频率
L=256;  %数据长度

%从文本文件中读取数据
fid=fopen('C:\Users\HLPC\Desktop\Sin.txt');
[FpgaOut,count]=fscanf(fid,'%d',inf);
fclose(fid);

%取出一段数据进行计算
FpgaOut=FpgaOut(1:L)';    %读出的数据为列向量,转换成行向量
Fout=abs(fft(FpgaOut,L));  %求FFT变换的幅度值

FpgaOut=FpgaOut/max(abs(FpgaOut));%归一化处理
Fout=Fout/max(Fout);

Fout=[Fout(L/2+1:L),Fout(1:L/2)]; %转换成相对于原点对称的信号

%画图
t=[0:L-1];                        %生成时间坐标轴,单位为ms 
t=t*(1/Fs)*(10^3);
m=[-L/2:1:(L/2-1)]*Fs/L*(10^(-3));%生成频率坐标轴,单位为KHz

subplot(211);plot(t(1:32),FpgaOut(1:32));
xlabel('时间(ms)','fontsize',10); ylabel('幅度','fontsize',10);
title('FPGA输出信号','fontsize',10);

subplot(212);plot(m,Fout);
xlabel('频率(KHz)','fontsize',10); ylabel('幅度','fontsize',10);
title('FPGA输出信号的幅频响应','fontsize',10);

5、Matlab读取二进制文件,转化为十进制

cstr = textread('C:\Users\HLPC\Desktop\Sin.txt','%s');
m = length(cstr{1});
n = length(cstr);
d = zeros(n,1);
for i=1:n
    s = bin2dec( cstr{i}(1) ); % 符号
    if s==1
        d(i)=bin2dec(cstr{i})-2^m;
    else
        d(i) = bin2dec( cstr{i} ) ;
    end
end

注意:
二进制文本必须由字符 0 和 1 组成,文本结尾不能有分号(;)。

6、Vivido中ROM IP核的使用

在这里插入图片描述
在这里插入图片描述
生成位宽为16bit,深度为1024的rom生成初始化文件:

width=16;   %rom的位宽
depth=1024; %rom的深度
x=linspace(0,2*pi,depth);  %在一个周期内产生1024个采样点
y_cos=cos(x);   %生成余弦数据
y_cos=round(y_cos*(2^(width-1)-1))+2^(width-1)-1;  %将余弦数据全部转换为整数

fid=fopen('C:\Users\Administrator\Desktop\cos_coe.coe','w');  %创建.coe文件
fprintf(fid,'%d,\n',y_cos);  %向.coe文件中写入数据
fclose(fid);  %关闭.coe文件

注意:
1、在前两行添加:

memory_initialization_radix=10;
memory_initialization_vector =

2、将最后一行的逗号改为分号.

在Vivado中,对rom进行初始化的文件是.coe文件.它的格式如下:

memory_initialization_radix=10;
memory_initialization_vector =
65534,
65533,
...,
60211;

其中,*memory_initialization_radix=10;*表示文件存储数据的进制,10即为10进制,
memory_initialization_vector是数据向量,等号后面的数字就是数据向量,使用逗号隔开数据,分号表示结束.

  • 6
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
数字滤波器是一种数字信号处理器件,可以对输入信号进行滤波处理,以去除噪声或干扰信号,达到信号平滑或频谱分析的目的。 在Matlab方面,实现数字滤波器可以使用Matlab中提供的信号处理工具箱。首先,需要定义滤波器的特性,如滤波器类型(低通、高通、带通、带阻),滤波器的阶数和截止频率等参数。然后,可以利用工具箱中的函数设计数字滤波器,并将其应用于待处理的信号。最后,可以通过Matlab的绘图函数对滤波后的信号进行可视化或分析。 在FPGA方面,可以使用Altera公司的FPGA开发工具和Verilog语言来实现数字滤波器的硬件电路。在Verilog中,可以定义滤波器的输入和输出接口,以及滤波器内部的逻辑电路。然后,利用Altera的FPGA开发工具,将Verilog代码编译生成对应的硬件电路。最后,可以将设计好的FPGA电路加载到Altera的FPGA芯片上,实现数字滤波器的硬件运算。 无论是在Matlab还是FPGA中实现数字滤波器,都需要考虑滤波器设计的性能需求和实时性要求。在Matlab中,由于其软件化的特性,可以方便地进行滤波器的设计和调试。而在FPGA中,通过硬件实现可以获得更高的运算速度和实时性,适用于对实时性要求较高的应用场景。 总之,数字滤波器的MatlabFPGA实现可以根据具体的需求选择,Matlab适用于快速原型设计和验证,而FPGA适用于实时性要求较高的应用场景。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值