大过年的,祝大家新年快乐哈,先上图。
效果还行。
在做这个之前需要下载一个字符取模软件: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脚本仿真设计(一)仿真源代码.
最后就能仿真出字符了。