fpga图像处理学习日记(3)

这一次的学习任务主要为在vga显示屏上面显示汉字或是字母,代码的原理出现了新的知识,首先汉字或是字母在屏幕上的排列方式转化为代码使用了pctolcd2002软件来完成,在校对好对应的参数之后,就可以通过软件直接来输出代码

例如上述汉字“嘻嘻嘻”,借助软件转化为了我们需要使用的代码

嘻(0) 嘻(1) 嘻(2)

DB 00H 40H;
DB 07H FCH;
DB F0H 40H;
DB 93H F8H;
DB 90H 00H;
DB 93H F8H;
DB 92H 08H;
DB 93H F8H;
DB 91H 10H;
DB 9FH FEH;
DB F0H 00H;
DB 93H F8H;
DB 02H 08H;
DB 02H 08H;
DB 03H F8H;
DB 02H 08H;"嘻",0

DB 00H 40H;
DB 07H FCH;
DB F0H 40H;
DB 93H F8H;
DB 90H 00H;
DB 93H F8H;
DB 92H 08H;
DB 93H F8H;
DB 91H 10H;
DB 9FH FEH;
DB F0H 00H;
DB 93H F8H;
DB 02H 08H;
DB 02H 08H;
DB 03H F8H;
DB 02H 08H;"嘻",1

DB 00H 40H;
DB 07H FCH;
DB F0H 40H;
DB 93H F8H;
DB 90H 00H;
DB 93H F8H;
DB 92H 08H;
DB 93H F8H;
DB 91H 10H;
DB 9FH FEH;
DB F0H 00H;
DB 93H F8H;
DB 02H 08H;
DB 02H 08H;
DB 03H F8H;
DB 02H 08H;"嘻",2

之后就只需要根据vga的扫描方式来完成显示即可,值得一提的是,汉字或是字母等等再vga上的显示过程并不是一个一个完整的,有先后的显示,而是逐行显示,根据之前学到的编辑方式,总体的设计并没有出现什么难题

代码:

module vga_3(

input clk_100mhz, //25mhz
input rst_n,

output hsync,
output vsync,
output [2:0]vga_r,
output [2:0]vga_g,
output [1:0]vga_b

);

wire clk_25m;

c100_25 u3(
.clk_100mhz(clk_100mhz),
.rst_n(rst_n),
.clk_25m(clk_25m)
);

//-------------------------------------------------------------------
reg [9:0] x_cnt;
reg [9:0] y_cnt;

[email protected](posedge clk_25m or negedge rst_n)
begin
if(!rst_n)
x_cnt <= 10‘d0;
else if(x_cnt == 10‘d799)
x_cnt <= 10‘d0;
else
x_cnt <= x_cnt + 1‘b1;
end

[email protected](posedge clk_25m or negedge rst_n)
begin
if(!rst_n)
y_cnt <= 10‘d0;
else if(y_cnt == 10‘d524)
y_cnt <= 10‘d0;
else if(x_cnt == 10‘d799)
y_cnt <= y_cnt + 1‘b1;
else
y_cnt <= y_cnt;
end
//-------------------------------------------------------------------
reg hsync_r,vsync_r;

[email protected](posedge clk_25m or negedge rst_n)
begin
if(!rst_n)
hsync_r <= 1‘b1;
else if(x_cnt == 10‘d0)
hsync_r <= 1‘b0;
else if(x_cnt == 10‘d96)
hsync_r <= 1‘b1;
else
hsync_r <= hsync_r;
end

[email protected](posedge clk_25m or negedge rst_n)
begin
if(!rst_n)
vsync_r <= 1‘b1;
else if(y_cnt == 10‘d0)
vsync_r <= 1‘b0;
else if(y_cnt == 10‘d2)
vsync_r <= 1‘b1;
else
vsync_r <= vsync_r;
end

assign hsync = hsync_r;
assign vsync = vsync_r;
//-------------------------------------------------------------------
reg valid_yr;

[email protected](posedge clk_25m or negedge rst_n)
begin
if(!rst_n)
valid_yr <= 1‘b0;
else if(y_cnt == 10‘d32)
valid_yr <= 1‘b1;
else if(y_cnt == 10‘d512)
valid_yr <= 1‘b0;
else
valid_yr <= valid_yr;
end

wire valid_y = valid_yr;

reg valid_r;

[email protected](posedge clk_25m or negedge rst_n)
begin
if(!rst_n)
valid_r <= 1‘b0;
else if( (x_cnt == 10‘d141) && valid_y )
valid_r <= 1‘b1;
else if( (x_cnt == 10‘d781) && valid_y )
valid_r <= 1‘b0;
else
valid_r <= valid_r;
end

wire valid = valid_r;

//wire [9:0] x_dis; // 横坐标显示有效区域相对坐标值0-639

wire [9:0] y_dis; // 数坐标显示有效区域相对坐标值0-479

//assign x_dis = x_cnt - 10‘d142;

assign y_dis = y_cnt - 10‘d33;

//-------------------------------------------------------------------

parameter char_line0 = 24‘h00_00_00,
char_line1 = 24‘h00_00_00,
char_line2 = 24‘h00_00_00,
char_line3 = 24‘hfc_f8_c7,
char_line4 = 24‘h42_44_62,
char_line5 = 24‘h48_42_62,
char_line6 = 24‘h48_42_52,
char_line7 = 24‘h78_42_52,
char_line8 = 24‘h48_42_4a,
char_line9 = 24‘h48_42_4a,
char_linea = 24‘h40_42_4a,
char_lineb = 24‘h42_42_46,
char_linec = 24‘h42_44_46,
char_lined = 24‘hfc_f8_e2,
char_linee = 24‘h00_00_00,
char_linef = 24‘h00_00_00;

reg [4:0]char_bit; // 显示位计算

[email protected](posedge clk_25m or negedge rst_n)
begin
if(!rst_n)
char_bit <= 5‘h1f;
else if(x_cnt == 10‘d442)
char_bit <= 5‘d23;
else if(x_cnt > 10‘d442 && x_cnt < 10‘d466)
char_bit <= char_bit - 1‘b1;
else
char_bit <= char_bit;
end

reg [7:0] vga_rgb; // 色彩显示寄存器

[email protected](posedge clk_25m )
begin
if(!valid)
vga_rgb <= 8‘d0;
else if(x_cnt > 10‘d442 && x_cnt < 10‘d466)
begin
case(y_dis)
10‘d231:
if(char_line0[char_bit])
vga_rgb <= 8‘b111_000_00;
else
vga_rgb <= 8‘b000_111_00;
10‘d232:
if(char_line1[char_bit])
vga_rgb <= 8‘b111_000_00;
else
vga_rgb <= 8‘b000_111_00;
10‘d233:
if(char_line2[char_bit])
vga_rgb <= 8‘b111_000_00;
else
vga_rgb <= 8‘b000_111_00;
10‘d234:
if(char_line3[char_bit])
vga_rgb <= 8‘b111_000_00;
else
vga_rgb <= 8‘b000_111_00;
10‘d235:
if(char_line4[char_bit])
vga_rgb <= 8‘b111_000_00;
else
vga_rgb <= 8‘b000_111_00;
10‘d236:
if(char_line5[char_bit])
vga_rgb <= 8‘b111_000_00;
else
vga_rgb <= 8‘b000_111_00;
10‘d237:
if(char_line6[char_bit])
vga_rgb <= 8‘b111_000_00;
else
vga_rgb <= 8‘b000_111_00;
10‘d238:
if(char_line7[char_bit])
vga_rgb <= 8‘b111_000_00;
else
vga_rgb <= 8‘b000_111_00;
10‘d239:
if(char_line8[char_bit])
vga_rgb <= 8‘b111_000_00;
else
vga_rgb <= 8‘b000_111_00;
10‘d240:
if(char_line9[char_bit])
vga_rgb <= 8‘b111_000_00;
else
vga_rgb <= 8‘b000_111_00;
10‘d241:
if(char_linea[char_bit])
vga_rgb <= 8‘b111_000_00;
else
vga_rgb <= 8‘b000_111_00;
10‘d242:
if(char_lineb[char_bit])
vga_rgb <= 8‘b111_000_00;
else
vga_rgb <= 8‘b000_111_00;
10‘d243:
if(char_linec[char_bit])
vga_rgb <= 8‘b111_000_00;
else
vga_rgb <= 8‘b000_111_00;
10‘d244:
if(char_lined[char_bit])
vga_rgb <= 8‘b111_000_00;
else
vga_rgb <= 8‘b000_111_00;
10‘d245:
if(char_linee[char_bit])
vga_rgb <= 8‘b111_000_00;
else
vga_rgb <= 8‘b000_111_00;
10‘d246:
if(char_linef[char_bit])
vga_rgb <= 8‘b111_000_00;
else
vga_rgb <= 8‘b000_111_00;
default: vga_rgb <= 8‘h00;
endcase
end
else
vga_rgb <= 8‘h00;
end

assign vga_r = vga_rgb[7:5];
assign vga_g = vga_rgb[4:2];
assign vga_b = vga_rgb[1:0];

endmodule

原文地址:https://www.cnblogs.com/fpgamzy/p/10355462.html

时间: 2024-10-29 16:27:35

fpga图像处理学习日记(3)的相关文章

fpga图像处理学习日记(1)

在学习有关方面之前,我还是先行的用了一天时间重新学习了一遍uart协议,我认为对uart的熟悉程度会对接下来的学习过程有一定的帮助,于是开始了对图像处理的学习,首先在找资料方面实在是难受,每次在查找资料的过程都是很痛苦的,每每不能找到我想到的东西,花了很长的功夫去四处找我要学习的东西,终于东拼西凑对VGA有了一点初步的了解 但是说实话,现在对一些名词还是没有很强的概念,比如前沿后沿,显示脉冲和同步脉冲等等,还是在参照下完成了代码 module vga_1(    input clk,    in

fpga图像处理学习日记(4)

此次任务的主要目标是完成之前三次的仿真任务以及uart协议串口接收的代码编写,仿真还是花了不少时间的,因为仿真用的板子是ego1,利用vivado来下板子,之前一直是通过ise在basys3上完成板级实验,要说的是,ego1提供的是100mhz的频率时钟,所以需要一个时钟分频来校对 100hz转25hz: module c100_25( input clk_100mhz, input rst_n, output reg clk_25m ); reg cnt; [email protected](

学习日记之状态模式和Effective C++

状态模式(State):当一个对象内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类. (1),状态模式主要负责解决的是当控制一个对象转换的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化. (2),状态模式的好处是将与特定状态相关的行为局部化,并且将不同状态的行为分割开来. (3),将特定的状态相关的行为都放入一个对象中,由于所有与状态相关的代码都存在于某个ConcreteState中,所以通过定义新的子类可以很容易地增加新的状态和

学习日记

五一耍了三天,自己的计划有泡汤,那种制止力哪里去了,不过我认真起来还有有废寝忘食的时候,不过希望这种时候多一点,回家妈妈告诉我,她给老师打电话了的,老师说了我的一些情况,不过我没有老师说的那么好,学习在班上算中等.我觉得还算不上吧!任重而道远吧. Java中有个比较重要的类Properties(Java.util.Properties),主要用于读取Java的配置文件,各种语言都有自己所支持的配置文件,配置文件中很多变量是经常改变的,这样做也是为了方便用户,让用户能够脱离程序本身去修改相关的变量

Duanxx的图像处理学习: 透视变换(二)

在<Duanxx的图像处理学习:透视变换(一)>中简要的说明了透视变化的算法,这里再进一步的对透视变换做说明. 基于前面的说明,可以很容易发现, 一个变换矩阵有如下你的分区特性: 一般来说,我有一个三维变换矩阵如下: 矩阵中的元素(p , q , r)取非全0时,能产生透视效果 一.一点透视 来看下面一张图: 现在是以z轴上的一点(0,0,d,1)为投影中心,计算P(x,y,z,1)点在XOY平面上的透视投影. 那么,现在很容易知道: 即: 这里取: 那么变换矩阵T,就为: 结果的其次坐标表示

学习日记之解释器模式和Effective C++

解释器模式(interpreter):给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. (1),如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言的句子.这样可以构建一个解释器,该解释器通过解释这些句子来解决该问题. (2),当一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象的语法树时,可使用解释器模式. (3),容易改变和扩展文法,因为该模式使用类来表示文法规则,你可以使用继承来改变和扩展该文法

学习日记之中介者模式和Effective C++

中介者模式(Mediator):用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互. (1),中介者模式很容易在系统中应用,也很容易在系统中误用.当系统出现多对多交互复杂的对象群时,不要急于使用中介者模式,而要反思你在系统的设计上是不是合理. (2),中介者的出现减少了各个对象的耦合,使得可以独立地改变和复用各个对象和中介者. (3),由于把对象如何协作进行了抽象,将中介者作为一个独立的概念并将其封装在一个对象中,这样关注

学习日记之职责链模式和Effective C++

职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连成一条链,并沿着该条链传递该请求,直到有一个对象处理它为止. (1),当客户提交一个请求时,请求时沿着链传递直到有一个 ConcreteHandler 对象负责处理它. (2),接收者和发送者都没有对方的明确信息,切链中的对象自己也不知道链的结构.结果是职责链可简化为对象之间的连接,它们仅需保留一个指向其后继者的引用.而不惜保留它所有的候选接收者的引用

学习日记之单例模式和Effective C++

单例模式(Singleton):保证一个类仅有一个实例,并提供一个访问它的全局访问点. (1),通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象.一个最好的办法就是,让类自身负责保存它的唯一实例.这个类可以保证没有其他实例被创建,并且它可以提供一个访问该实例的方法. (2),lock 是确保当一个线程位于代码的临界区时,另一个线程不进入临界区.如果其他线程试图进入锁定的代码,则它将一直等待,知道该对象被释放. (3),双重锁定解决效率问题. (4),C#与公共语言运行库