字符显示原理
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
7
6 5 4 3 2 1 0
16
17 18 19 20
0
0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0
0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0
0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0
addr 0 1 2 data 0000 0804 0804
0 0 0 0
0 0
0 8 0 4
0 0
0 8 0 4
0 0
1 F F C
0 0
0 0 0 4
0 0
0 0 0 4
0 0
0 0 0 0
0 0
0 0 0 0
0 0
0
0 0 0
0
0
0
0
0
0
0 0 0
0
0 0 0
0
0 0 0
0
0 0 0
1 1 1
0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0
0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0
0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
六、字符显示程序设计思路
例:要在屏幕第5行第10列开始显示蓝色字符a
addr <= `CHAR_a;
addr <= 9’d97; 也可以模仿1602液晶显示模块中的字符库形 式,将起始地址设为所存字符的ASCII码。 如a的ASCII码为97,则起始地址设为97。
但是需要的存储容量要大些,而且汉字是没 有ASCII码的。
=
100 0144 101 0144 102 0144 103 00FC 103 0004
屏幕显示
y x1011121314151617
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
char_rom char_rom_inst //查字符库,求数据 (.address(addr), .clock(clk),.q(data)); 七、字符显示关键语句
char_rom char_rom_inst //查字符库,求数 据 (.address(addr), .clock(clk),.q(data)); always @(posedge clk) //求字符库地址 begin if((y_cnt >= 10'd5 && y_cnt <= 10'd20)) begin if (x_cnt == 10'd10) //屏幕显示起始位置 addr <= 8; //求字符起始地址 else if (x_cnt >= 10'd11 && x_cnt <= 10'd17 ) addr<=addr+1; else addr=0; end end wire [3:0] dis_bit=10'd20-y_cnt; always @ (posedge clk) begin//rgb赋值 rgb<=3'b000; if (y_cnt>=5 && y_cnt<=20 && x_cnt>=10 && x_cnt<=17 ) begin if(data[dis_bit]) rgb <= 3'b001; //字符色 else rgb <= 3'b111; end end
成时序电路可以减小 毛刺,时钟可以是系 统时钟。
将起始地址用宏定义的方法与字符关联
addr data
字 符
`define CHAR_a 9’d97;
49 50 51 52 53 54 55 56 97 98 99
0000 0804 0804 1FFC 0004 0004 0000 0000 0000 0098 0124 a 1
第5行第10列起始 显示字符左上角
五、数据位和显示位置的关系
屏幕显示
y x
5 6 1011121314151617
一般公式: bit=起始行数-y+15
数据表
bit
15 14 13 12 11 10 9 8
7
8 9 10 11 12 13 14 15 0 0 0 0
可以看出: y=5的位置显示颜色决定于bit15 的值,即: y=5 → data[15] y=6 → data[14] y=7 → data[13] …… y=i → data[20-i] 即: 第y行的颜色决定于第“20-y”位 数据是否为1, 如果data[20-y]=1,则显示字 符色,否则显示背景色。 rgb赋值语句: if(char_data[10'd20-y_cnt]) vga_rgb <= 3'b001; else vga_rgb <= 3'b000;
采用字符库形式 显示字符的原理
一、字库
要显示字母、数字、符号、汉字等,需要自建字库
(以后简称Char_ROM)。
Char_ROM中存放字模数据(字符笔画)。
字模尺寸自行设定,例如英文字母、数字等可设置
为16行*8列像素,汉字可设置为16行*16列像素。
二、字模举例
例:16行*8列的字模1的数据如右图 则对应字符库的数据表如下表
x_cnt=10, y_cnt=5时, 将a的起始地址8赋值给 Char_ROM地址变量addr
对x_cnt=10, y_cnt=5~20处 的RGB进行赋值。 若数据位为1,则对应位置上的 RGB赋值001,否则赋值000
下一个像素时钟(下一列),地址加1 屏幕显示 y x1011121314151617
0 0 9 8
0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0
0 1 2 4
0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0
0 1 4 4
0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0
0 1 4 4
0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0
字 模
0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
字库容量: 地址线与所有字符 所占列数(决定于 字符数量)有关, 数据线与一个字符 所占行数有关。 如该例中假设存放 2个字母的字符, 则所占列数为 16列, 地 址 线 为 4bit , 数 据线为16bit。
0 8 0 4
三、字库容量
例:设字库中只有1和a两个字模,如右图
则对应字符库的数据表如下表
Char_ROM address data 0 0000 1 0804 2 0804 3 1FFC 4 0004 5 0004 6 0000 7 0000 8 0000 9 0098 10 0124 11 0144 12 0144 13 0144 14 00FC 15 0004
0 1 4 4
0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0
0 0 F C
0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0
ቤተ መጻሕፍቲ ባይዱ
0 0 0 4
0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
1 1
1 1
0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
addr data 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0000 0804 0804 1FFC 0004 0004 0000 0000 0000 0098 0124 0144 0144 0144 00FC 0004
0 0 0 0
0 0 0 0 0 0 0 0
0 8 0 4
0 0 0 0
0 0 0 0 0 0 0 0
1 F F C
0 0 0 4
0 0 0 4
0 0 0 0
0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
四、字符显示原理
正确显示字符的要素:
0,0
x_cnt 10,5
Char_ROM
DATA ADDR
屏幕显示 y x1011121314151617
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
CLK
y_cnt
1. 确定屏幕显示起始位置 屏幕显示起始位置由行列计数值决定 2. 求Char_ROM地址 Char_ROM起始地址由所要显示的字符决 定(可将地址用宏定义的方法与字符关联) 3. 读取该地址对应的数据 4. 确定数据位和像素位置的关系 数据位和像素位置的关系由行计数值、起始 行数、字符所占行数决定 5. RGB赋值,显示颜色 若数据为1,则对应位置上的RGB赋值为 字符色,否则RGB值赋值为背景色
字符
1
a
对下一列, y_cnt=5~20处的 RGB进行赋值。 若数据位为1,则对应位置上的 RGB赋值001,否则赋值000
显示完最后一列停止循环
七、字符显示关键语句
addr data 0 0000 0804 0804 1FFC 0004 0004 0000 0000 0000 0098 0124 0144 0144 0144 00FC 0004 a 1 字 符
程序结构:
HS、VS产生
x_cnt、y_cnt产生 锁相环例化
存储器例化 确定存储器地址 颜色赋值
1 1
0 0
0
0 0 0
0
0 0 0
0
0 0 0
1
1 1 1
0
0 0 0
0
0 0 0
0
0 0 0
0
0 0 0
3
4 5 6 7
1FFC
0004 0004 0000 0000
0
0 0 0
0
0 0
0
0 0
1
1 1 1
0
0
0
0 0
0
0 0
0
0 0
0
0 0 0
1 1
0
0
1 1 0
0
0
0
0
0
0
0
0
0
0
0
0
注意:一列(而不是一行)数据为一个字。
always @(posedge clk) //求字符库地址 begin if((y_cnt >= 10'd5 && y_cnt <= 10'd20)) 两 个 always 块 , 第 begin 一个求字符库地址, if (x_cnt == 10'd10) //屏幕显示起始位置 时钟是像素时钟; addr <= 8; //求字符起始地址 else if (x_cnt >= 10'd11 && x_cnt <= 10'd17 ) addr<=addr+1; 第二个是给 rgb 赋值, else addr=0; 可以设计成组合函数, end 但是会有毛刺,设计 end wire [3:0] dis_bit=10'd20-y_cnt; always @ (posedge clk) begin//rgb赋值 rgb<=3‘b000; if (y_cnt>=5 && y_cnt<=20 && x_cnt>=10 && x_cnt<=17 ) begin if(data[dis_bit]) rgb <= 3'b001; //字符色 else rgb <= 3'b111; end end