modesim用波形仿真汉字

大过年的,祝大家新年快乐哈,先上图。
在这里插入图片描述
效果还行。
在做这个之前需要下载一个字符取模软件:PCtoLCD2002。百度一下就能下载到。
打开是这样的界面,一般默认的是等比缩放,但是等比的话,最后仿真的效果不好,因此需要把字宽调大点,我设置的是30.(字高我设置的是16,如果完全用我的代码的话,这个就不要改了。)
在这里插入图片描述
点击那个设置按钮打开,设置一下取模方式,输出改为十进制数,走向改为顺向。具体取模数据存储方式看右侧的取模说明就行。我们是逐列式。
在这里插入图片描述
最后点击生成字模,保存字模。得到下面数据,每个数村的是8个像素的数据,也就是每个数据的位宽为8位。
在这里插入图片描述
接下来需要把数据的存储格式改改,以便于后面仿真的时候读取数据。
把这些数据改成列的形势。
我是使用的notepad++,把没用的选中直接删除.
最后再处理逗号,这些直接按照这种方式替换就行。
在这里插入图片描述
最后中间会有一个行间隔,把它删掉就行了,最后存储的格式如下。
在这里插入图片描述
把它拉到最后一个数,可以看的总共有600个数。所以最后在写仿真读取数据的时候需要读600次。(这一点根据自己实际进行修改)
在这里插入图片描述
接下来就是代码了
rtl.v:
这段不用改,直接可以用

module rtl(
	input         clk,
	input         rst,
	input  [7:0]  data1,
	input  [7:0]  data2,
	output reg [9:0]  addr,
	output [15:0] data_out
);

always@(posedge clk or negedge rst)
	if(!rst)
		addr <= 1'd0;
	else
		addr <= addr + 2'd2;


assign	data_out = clk ? {data1,data2} : 0;
endmodule

tb_zifu.v:
这段有一点需要修改

`timescale 1ns / 1ns

module tb_zhufu;

parameter data_with=8;
parameter addr_with=600;   //这里需要根据实际修改

integer temp,file1,file2;
integer i,j;
wire [15:0] data_out;
wire [9:0] addr;
reg [data_with-1:0] orig_data1[0:addr_with-1];// addr_with是地址宽度,data_with是数据宽度
reg [data_with-1:0] orig_data2[0:addr_with-1];
reg clk,rst;
wire [15:0] out;
reg [7:0]  data1;
reg [7:0]  data2;

rtl rtl0(
		 .clk		(clk),			//input
         .rst		(rst),
         .data1		(data1),
         .data2		(data2),
         .addr		(addr),			//output
         .data_out	(data_out)
);

initial
begin
	clk = 0;
	rst = 0;
	j=0;
//读成两份
	file1 = $fopen("zimo.txt","r");     //根据自己的字符文件修改
	for(i=0 ; i <= addr_with-1 ; i=i+1)
		begin
			temp = $fscanf(file1,"%d",orig_data1[i]); //每次读取一个数据,以空格或回车以及tab为区分。
		end
	$fclose(file1);
	file2 = $fopen("zimo.txt","r");		//一样需要根据实际修改
	for(i=0 ; i <= addr_with-1 ; i=i+1)
		begin
			temp = $fscanf(file2,"%d",orig_data2[i]); //每次读取一个数据,以空格或回车以及tab为区分。
		end
	$fclose(file2);
	$display("Running testbench");
//读完
	#20 rst = 1;
	#6000
	$stop;
end

always@(posedge clk or negedge rst)
	if(!rst)
		begin
			data1 <= 0;
			data2 <= 0;
		end
	else
		begin
			data1 <= orig_data1[addr];
			data2 <= orig_data2[addr+1];
		end
		
		
always #10 clk = ~clk;


endmodule

modelsim脚本

transcript on
if {[file exists dyq_work]} {
	vdel -lib dyq_work -all
}
#上面的意思是如果已有这个库,就把它全部删了
#新建dyq_work库
vlib dyq_work  
#编译源代码和测试文件   
vmap work dyq_work
vlog  *.v
#运行仿真下面这个ps是设置仿真器达到的精度为ps
vsim -t ps -voptargs="+acc"  work.tb_zhufu
#将信号显示调整为十进制无符号形式
radix unsigned
#添加测试文件中包含的reg和wire的所有波形   
add wave *
#添加测试文件中例化的模块内部的cnt信号的波形
#运行
run -all

如果不会用脚本可以看看这篇
modelsim脚本仿真设计(一)仿真源代码.
最后就能仿真出字符了。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值