实现效果:
显示原理:
verilog仿真时,输出多位位宽的数据,通过不同时刻的高电平数据来构成字的形状。
想着简单但是实现复杂的方法:自己提前算好什么时候拉高;
通用方法:使用字模的取模软件获取字模,如果有做过OLED取字模显示的那么应该是很容易就上手了。
(1)字模软件,PCtoLCD;
(2)Vivado或者Modelsim等能运行verilog TestBench仿真的工具;
首先取字模,设置字体大小是16x16,即一个汉字占16行16列,一个数字或者字母、空格占16行8列,由此可以设置verilog输出数据的位宽是16,恰好对应16行数据。
(1)点阵格式
取字模时,设置成阴码,这样要显示的字是高电平,不显示的点是低电平;如果是阳码,就是要显示的字是低电平,不显示的点是高电平;
(2)取模方式
选择逐列式,也就是数据是一列一列的,正好是16行的一列一列的数据,这样在verilog中正好每个时钟输出1个16 bit的数据即可,这个16 bit的数据就是当前列的数据。
(3)取模走向
顺向,高位在前,低位在后,正好和verilog输出一致,verilog定义输出reg [15:0] data即可。
(4)输出数制
十六进制。
导出字模数据,把连续的2个十六进制表示的数据合成1个数据,即00H和00H拼成0x0000,1FH和98H拼成0x1F98,那么对于数字5得到8个16位表示的数据。
看一下这8个数据为什么能表示出数字5。
首先第一个数据,0x0000,二进制就是16个0,对应的是右侧第一列都没点亮;
第二个数据,0x1F98,二进制0001_1111_1001_1000,仔细把这个数据和第二列对比!从高到低,
数字5的第二列是暗暗暗亮_亮亮亮亮_亮暗暗亮_亮暗暗暗!
即1是亮,0是暗,也就是前面所说的逐列式、阴码。
显然,verilog只要设置一个[15:0] data,每个clk输出一列,就完成了扫描输出。
不需要设置例化模块,只需要一个TestBench即可。
数据存储在data521.txt文件中。
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Engineer: FPGA探索者
//////////////////////////////////////////////////////////////////////////////////
module generate_520();
reg [15:0] data;
reg clk;
initial begin
clk = 0;
data = 0;
end
//从外部 txt 文件读入数据作为测试激励
//data_num 设置多大?521加2个空格是5个数字,每个数字8列数据,5*8=40个数据
parameter data_num = 40;
integer Pattern;
reg [15:0] stimulus[1:data_num];
initial
begin
#100;
// 十六进制读取.txt文件,使用绝对地址
$readmemh("D:/project_1/data521.txt",stimulus);
Pattern=0;
repeat(data_num) begin
Pattern = Pattern+1;
data = stimulus[Pattern];
#10;
end
#100;
#500;
$stop;
end
always #5 clk = ~clk;
endmodule