【FPGA】:fpga和matlab联合仿真

一、 matlab端的操作

1.1 matlab读入数据

file_name : txt的文件名
file_path: 文件存放发热路径
以下代码为,txt文本中为三列,同时读出三列

%% matlab读取modelsim产生的文件、
clear all;
clc;
file_name = 'data_out_1';
file_path = ['E:\vivado_project\', file_name, '.txt'];
file_id = fopen(file_path);
data = textscan(file_id, '%s%s%s');
fclose(file_id);
for i=1:3
    C_double(i,:)= str2double(data {1,i});
end

1.2 matlab保存数据

%% matlab将文件保存为txt
N=256;
n=1:N;
f0=100;
fs=500;
data = round(256+255*sin(2*pi*f0/fs*n));
fid = fopen('sin.txt','w');
fprintf(fid,'%x\n',data);  % x代表16进制  d代表十进制
fclose(fid);

二、 modelsim端的操作(verilog)

2.1 modelsim的读入

readmemh: 读16进制数据
readmemb: 读2进制数据

wire rst;
reg [7:0] data,i ;
reg [7:0] data_mem[255:0];
initial begin
    $readmemh("sin.txt",data_mem); 
end
always@(posedge clk,posedge rst) begin
    if(rst) begin
        data <= 8'd0;
        i<=8'd0;
    end
    else begin
       data<= data_mem[i];
       i <= i+1; 
   end 
end

读十进制的代码如下;

reg rst;
reg [7:0] data,i ;
reg signed [7:0] data_mem[255:0];
integer fid1,s;
initial begin
	fid1 = $fopen("C:/Users/Desktop/sin.txt","r");//这里的斜杠与计算机里面的斜杠不一样,计算机里面的斜杠为‘\’,这里为‘/’
	   for(i=0;i<=255;i=i+1) begin
	       #1;
	       s= $fscanf(fid1,"%d",data_mem[i]);
	   end
	    $fclose(fid1);
end

always@(posedge clk,posedge rst) begin
    if(rst) begin
        data <= 8'd0;
        i<=8'd0;
    end
    else begin
        data <= data_mem[i];
        i <= i+1; 
   end 
end

2.2 modelsim的输出

i : 采样个数
#25: 采样间隔,和时钟周期有关
XXX: 需要截取的信号
unsigned(XXX): 无符号数
signed(XXX): 有符号数

integer i;
integer w_file;
   initial begin
	 w_file = $fopen("data_out_1.txt");
         for(i=0;i<=8191;i=i+1)begin
	   #25; 
	   $fdisplay(w_file,"%d",$unsigned(XXX));% h代表16进制 d代表十进制
	   if(i == 8191)
	   $fclose(w_file);
          end
    end  

其中:

$fdisplay:
这个命令需要触发条件,才会把数据写入文件,就如上例的always@(i),当i变化时数据才会被写入,该函数每写完一次数据就会自动添加一个换行符,所以在最后一个数据写完之后还会添加一个换行符,最后就需要我们自己删掉,否则matlab会读取错误。

$fwrite:

只有触发条件有变化才可以将数据写进文件,但是与$fdisplay区别就是每次写入数据不会自动添加换行符,需要我们自己添加。eg:always @ (i) $fwrite(w_file,”%h\n”,data_out);

$fmonitor:

这个命令基本与$fdisplay相同,只有触发条件发生变化才可以将数据写入文件,eg:initial $fmonitor(w_file,”%h”,data_out);
VHDL版本的读入和读出:

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_signed.all;--使用有符号数运算
USE ieee.numeric_std.ALL;
--声明文件操作所需的程序包
use ieee.std_logic_textio.all;
use std.textio.all;
 
ENTITY tst IS
END tst;
 
ARCHITECTURE behavior OF tst IS 
 
    -- Component Declaration for the Unit Under Test (UUT)
 
    COMPONENT SigCIC
    PORT(
         rst : IN  std_logic;
         clk : IN  std_logic;
         din : IN  std_logic_vector(9 downto 0);
			rdy: OUT std_logic;
         dout : OUT  std_logic_vector(12 downto 0)
        );
    END COMPONENT;
    

   --Inputs
   signal rst : std_logic := '1';
   signal clk : std_logic := '0';
   signal din : std_logic_vector(9 downto 0) := (others => '0');

 	--Outputs
   signal dout : std_logic_vector(12 downto 0);
	signal rdy: std_logic;

   -- Clock period definitions
   constant clk_period : time := 5 us; --200khZ
   
	
BEGIN
   
	-- Instantiate the Unit Under Test (UUT)
   uut: SigCIC PORT MAP (
          rst => rst,
          clk => clk,
          din => din,
			 rdy => rdy,
          dout => dout
        );

   -- Clock process definitions
	rst <= '0' after 20 us;
	
   clk_process :process
   begin
		clk <= '0';
		wait for clk_period/2;
		clk <= '1';
		wait for clk_period/2;
   end process;
 

	--从文本文件中读取数据做为输入信号(二进制)
	process
	   variable vline:LINE;
		variable v: std_logic_vector(9 downto 0);
		file invect:text is "E:\vivado_project\cic\cic_test\E6_4_sin_in.txt";
	begin
	wait until rising_edge(clk);
		   if not (ENDFILE(invect)) then
			   readline(invect,vline);
				read(vline,v);
				din <= v;
			end if;
	end process;
	
	--将滤波器输出信号dout写入文本文件中,供Matlab软件分析(10进制)
	process
	   variable LineOut:line;
		variable viout: integer;
		file FileOut:text open write_mode is "E:\vivado_project\cic\cic_test\E6_4_sin_out.txt";
	begin
		wait until rising_edge(rdy);
		viout:=conv_integer(dout);
		write(LineOut,viout,right,10);
		writeline(FileOut,LineOut);
	end process;

END;

三、参考资料

【1】工程杂谈-ModelSim与Matlab文件
【2】modelsim和matlab联合使用(转
【3】verilog仿真读取十进制数据的方法
【4】verilog读入.txt的有符号十进制数,把有符号十进制数写入到.txt文件中

  • 3
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值