本帖最后由 ucx 于 2018-3-7 11:31 编辑
前面介绍了从文件读入仿真数据的模块,本帖再介绍一下把仿真结果以16进制方式顺序写入文本文件的模块dToFile.vht,并给出对模块的解读和仿真。 Entity dToFileis generic (LW : positive := 1);port( xd : in std_logic; d : in std_logic_vector; FileName : in string :="HexResult.txt"); End dToFile;
输入d是仿真结果,d的比特宽度由实际应用确定。xd用来触发写入,当xd电平发生变化时(即在xd跳变沿之后),d被写入文件FileName。LW为一行写入结果的个数,同一行内的数据由空格隔开。模块在d的个数达到一行时才被写入文件一次。
模块解读
文件dToFile.vht第11行constant wid: integer := (d'length+3)/4 + 1;定义的wid是以16进制表示d所需字符数+1,这个+1是空格的位置。
行13~19用来在仿真开始时创建一个空文件,如果文件已经存在则清空内容。
行24:变量mv用来暂存一行的数据。
行27:xd跳变沿触发进程。
行28~32:把当前的数据写入mv。
行33~37:一行内数据个数计数。
行38~47:如果计满一行,则打开文件写入,然后关闭文件。
模块仿真
为了突出主题,我们把仿真顶层文件top.vht写得尽可能简单。全部内容如下
Library ieee;Useieee.std_logic_1164.all,ieee.std_logic_unsigned.all; entity top is end top; architecturepure_sim of top is signal sn : std_logic_vector(5 downto 0):=(others=>'1'); begin i2: entitywork.dToFile generic map(LW=>6) port map(xd=>sn(0), d=>sn,FileName=>"结果.txt"); Process begin wait for 10 ns; sn <= sn+1; End process; End pure_sim; top.vht完成的功能是每6个数据一行将sn的值保存在《结果.txt》文件内。仿真定义了一个6位循环计数器sn,以10ns为周期加1。那么sn(0)的变化就代表着sn的值发生变化,所以用sn(0)作为dToFile的触发信号xd输入。文件dToFile.vht内容稍微有点多在附件中给出。对此问题感兴趣的同仁可以下载附件自行仿真。
|