文章目录
一、 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文件中