1. 字符点阵产生
如图在PCtoLCD2002中输入数字ICer,点击生成字模,保存字模;
2.修改字模格式,删除提示信息,标点符号等;去掉全部0x,并逐一合并两项;(可以使用perl、python等提高效率)
)
修改后结果:
3.在代码文件中,利用readmemh函数读取生成的字模;
仿真如下:
可以制作表白文字,这就是工科人的浪漫吧!
工程代码:
代码语言:javascript复制//TOP文件
module char_display
(
input clk,
input rst_n,
output [15:0] out
);
wire [15:0] data_out;
reg [15:0] count;
wire [7:0] raddr = count[15:8];
assign out = {16{clk}} & data_out;
BRAM BRAM_inst
(
.clk ( clk ) , // input clk
.wr_en ( 1'b0 ) , // input wr_en
.waddr ( 1'b0 ) , // input [MEMWIDTH-1:0] waddr
.raddr ( raddr ) , // input [MEMWIDTH-1:0] raddr
.data_in ( 8'b0 ) , // input [DATAWIDTH-1:0] data_in
.data_out ( data_out ) // output [DATAWIDTH-1:0] data_out
);
defparam BRAM_inst.MEMWIDTH = 8;
defparam BRAM_inst.DATAWIDTH = 16;
always@(posedge clk,negedge rst_n)
begin
if(!rst_n)
count <= 'b0;
else
count <= count 1'b1;
end
endmodule
代码语言:javascript复制////////////////////////////////////////////////////////////////////////////////
//BRAM文件
////////////////////////////////////////////////////////////////////////////////
module BRAM
#(
parameter MEMWIDTH = 20, //1024 * data
parameter DATAWIDTH = 1
)
(
input wire clk,
input wire wr_en, //写有效信号
input wire [MEMWIDTH-1:0] waddr, //写地址
input wire [MEMWIDTH-1:0] raddr, //读地址
input wire [DATAWIDTH-1:0] data_in, //写入的数据
output reg [DATAWIDTH-1:0] data_out //读出的数据
);
// Memory Array
reg [DATAWIDTH-1:0] memory[0:(2**MEMWIDTH-1)];
initial
begin
// $readmemh("E:/学习/char_display/char_display/数字ICer.txt",memory);
$readmemh("E:/学习/char_display/char_display/我宣你.txt",memory);
end
always@(posedge clk)
begin
if( wr_en )
memory[waddr] <= data_in;
data_out <= memory[raddr];
end
endmodule
代码语言:javascript复制//仿真文件
`timescale 1 ps/ 1 ps
module char_display_vlg_tst();
reg clk;
reg rst_n;
wire [15:0] out;
char_display i1 (
.clk(clk),
.out(out),
.rst_n(rst_n)
);
initial begin
clk = 0;
rst_n = 0;
#100 rst_n = 1;
#1000000
$stop(2);
end
always #10 clk = ~clk;
endmodule
4.工程获取:包括代码工程及字模生成软件