FPGA实现“打字机”(VGA & UART)

  看到标题中的“打字机”三个字,你是不是脑补了下面这幅图像。这是二战电影中常出现的道具,现在恐怕都见不到了。


●电影道具“打字机”

  我要实现的当然不是这个样子,只是功能上与之相似。先让你们看看实现的效果,直接上图。

●这是串口发的字符串

●显示屏显示的字符

  之所以要写这个“打字机”工程,那是因为我在学习FPGA的道路上,它是我重要的一关。我一开始学FPGA,是从数字电路开始入门的,然后就是学习使用QuartusII,编写Verilog代码。我写的第一个工程是数字时钟(6个数码管两个一组实现时钟、分钟、秒钟的计时),通过它我学会了基本的逻辑(时序逻辑、组合逻辑,以及我们用的最频繁的译码器和选择器)。接下来就是这个“打字机”了,其实一开始这是学长给我布置的一个任务(现在想想学长也是用心良苦),通过它我基本上领会了如何驱动外设以及用各个外设组合成我们需要的工程(也就是模块化设计)。我相信,对于很多还在朝FPGA入门的同学来说,通过这个工程,你们的能力能获得显著提升。



  好了,话就不多说了,接下来就来看看这个工程是怎么实现的。我们先来看看RTL视图:

●RTL视图

  从该图中可以看到,这里一共有5个模块:PLL模块、UARTRX接收模块、DISMEM显存模块、GETZIMO字模译码模块、VGA显示模块。PLL模块产生VGA(800*[email protected])所需的40M时钟,UARTRX模块接收上位机发来的数据,显存模块保存需要显示的字符,字模模块将显存的字符译码成VGA模块需要的数据。PLL、UARTRX、VGA这三个模块就不讲了,这是学习FPGA必然要遇到的模块(网上有很多代码),接下来就给大家重点分析一下显存模块和字模译码模块。

  显存模块,顾名思义就是仿造显卡的显存,将显示的内容保存起来,当显示模块需要的时候再取出来。当我们按顺序将UART接收到的字符放入RAM中时,有一个问题,如果写满了RAM怎么办?当然,可以这么做,从头开始写,一直循环。那么读操作也按顺序读就会有问题了,这时如果写满了,之前显示的内容就突然没了。可是我们希望当写满时所有行都能往上卷一行,这样就和我们平时打字的效果一样了。解决这个问题的办法是改变读地址和写地址的映射关系。通常,读写地址是这么映射的:

  为了解决该问题,映射关系改成这样:

每当写满一页,读地址就往上卷动一行(也就是减去一行)。具体的代码就是:

 1 //从串口来一个数据就加1,直到计满清零
 2 always @ (posedge CLK_50M or negedge RST_N)
 3 begin
 4    if(!RST_N)
 5       RAM_WP <= 12‘h0;
 6    else
 7       RAM_WP <= RAM_WP_N;
 8 end
 9
10 always @ (*)
11 begin
12    if(RAM_WP == 12‘d3699 && DATAFLAG)
13       RAM_WP_N = 12‘h0;
14    else if(DATAFLAG)
15       RAM_WP_N = RAM_WP + 12‘h1;
16    else
17       RAM_WP_N = RAM_WP;
18 end
19
20 //RAM_WP对100取模得RAM_WP100,可以作为写指针的列
21 always @ (posedge CLK_50M or negedge RST_N)
22 begin
23    if(!RST_N)
24       RAM_WP100 <= 12‘h0;
25    else
26       RAM_WP100 <= RAM_WP100_N;
27 end
28 always @ (*)
29 begin
30    if(RAM_WP100 == 12‘d99 && DATAFLAG)
31       RAM_WP100_N = 12‘h0;
32    else if(DATAFLAG)
33       RAM_WP100_N = RAM_WP100 + 12‘h1;
34    else
35       RAM_WP100_N = RAM_WP100;
36 end
37
38 //以下实现卷行
39
40 //判断页尾,判断成功则一直保持
41 always @ (posedge CLK_50M or negedge RST_N)
42 begin
43    if(!RST_N)
44       sroll_flag <= 1‘b0;
45    else
46       sroll_flag <= sroll_flag_n;
47 end
48 always @ (*)
49 begin
50    if(RAM_WP == 12‘d3699 && DATAFLAG)
51       sroll_flag_n = 1‘b1;
52    else
53       sroll_flag_n = sroll_flag;
54 end

  字模译码模块就是将从显存RAM中的字符译码得到VGA需要显示的数据,这是因为字符是不能直接给VGA显示的,所以有这个译码的过程。译码过程需要根据显示的位置得到VGA显示的像素,也就是根据字符从ROM中(里面存有字模信息)取得字符的字模,其过程见代码:

 1 //得到需要输出的字模数据的哪行,打一拍
 2 always @ (posedge CLK_50M or negedge RST_N)
 3 begin
 4    if(!RST_N)
 5       linechar <= 4‘h0;
 6    else
 7       linechar <= position_VS[3:0];
 8 end
 9 //得到该行数据
10 GETLINE getlineA
11 (
12    .CLK_50M       (CLK_50M       ),
13    .CHAR          (CHAR          ),
14    .linechar      (linechar      ),
15    .dataline      (dataline      )
16 );
17
18 //得到需要输出字模数据的某列
19 always @ (posedge CLK_50M or negedge RST_N)
20 begin
21    if(!RST_N)
22       bitcnt <= 3‘h0;
23    else
24       bitcnt <= bitcnt_n;
25 end
26
27 always @ (posedge CLK_50M or negedge RST_N)
28 begin
29    if(!RST_N)
30       bitcnt_n <= 3‘h0;
31    else
32       bitcnt_n <= position_HS[2:0];
33 end
34
35 //得到字模数据某行某列上的值,并将这一位值译成8位数据(8‘hff或8‘h0)
36 DECODEPIXEL decodeA
37 (
38    .datain           (dataline      ),
39    .bitcnt           (bitcnt        ),
40    .dataout          (databit       )
41 );
42
43 assign DATAOUT = databit;

  这个“打字机”的工作流程可以通过下图来理解,数据由上位机发过来,UART模块接收,当接收到一个完整字符时,将这个字符写入到RAM。RAM中的数据读出后经过ROM译码,最后通过VGA送给显示器显示。


●字符信息流

   “打字机”的具体实现就是上面将的这些,有兴趣的朋友可以在此基础上改进,改进的内容可以是增加控制字符的操作,也可以是将显示的字符保存到SDRAM中这样就可以容纳更多的字符了。另外,需要源码的朋友可以在这个地址下载: https://pan.baidu.com/s/1jIqnI1C

  让大家看一下我的实物,最近入手了一块锆石科技出品的A4开发板。在这块开发板上搭载了一颗Altera公司的EP4CE10F17C8,功能强大并且外设齐全,非常适合初学者。



  需要说明一下,这篇文章是仅仅我发的第一篇博文,而且只是一个小工程,也是让大家在学习FPGA的过程中有一个很好的练手的机会。在后面,我还会定期推出更多的自己在FPGA学习道路上的经验心得,而且绝对是干货(比如USB2.0、USB3.0、DDR2、SDcard、摄像头等等)哦!小伙伴们可以持续关注我,更多惊喜等着你。

时间: 2024-10-21 10:24:49

FPGA实现“打字机”(VGA & UART)的相关文章

模拟摄像头解码模块最新测试 TVP5150模块 FPGA+SDRAM+TVP5150+VGA 实现PAL AV输入 VGA视频输出

模拟摄像头解码模块最新测试  TVP5150模块  FPGA+SDRAM+TVP5150+VGA  实现PAL AV输入 VGA视频输出 测试使用电视机顶盒的AV模拟信号输入,VGA显示器输出测试,效果如下 FPGA使用verilog编程,顶层RTL视图如下 module action_vip( input clk,input reset_n,input bt656_clk_27m,input [7:0] bt656_data, output [12:0] sdram_addr,//output

基于FPGA 的简化UART 电路设计【转载】

0 引言 随着嵌入式系统的广泛推广和应用,UART ( Universal Asynchronous Receiver Transmiller )作为一种串行数据传输方式也得到广泛的使用.UART 允许在串行链路上进行全双工通信.串行外设到RS 232-C 异步串行接口一般采用专用的集成电路即UART 实现.常见的串行接口芯片如8250 .8251 .NS16450 等,能够实现比较全面的串行通信功能.而在实际应用中,我们往往并不需要如此完整的功能,从而会造成资源的浪费和成本的提高.随着EDA

MATLAB串口操作和GUI编程

简单的MATLAB GUI编程和串口控制.Word编辑,如需PDF版本,请留言.说实话这个挺难看的……     概述 本文介绍了程序AD9512_Serial_GUI的编程思路和功能.该程序设计到MATLAB的图像用户界面编程的基本方法和串口的基本操作.程序目的在于通过串口写控制字对AD9512进行配置(AD9512通过SPI写入寄存器,本程序只是整个控制程序中的一部分). 修订历史 以下表格展示了本文档的修订过程 日期 版本号 修订内容 2015/01/15 V0.0 初始版本,试验版[1]

数控AGC实现(转)

相关链接:    一种混合式高动态范围AGC算法与FPGA实现     http://www.sohu.com/a/221438387_781333 基于FPGA的快速自动增益控制系统设计        http://www.docin.com/p-1435248299.html xilinx 平方根IP核的用法- 整形平方根算法   https://blog.csdn.net/sinat_25326461/article/details/72388355   [导读] 随着软件无线电技术和FP

FPGA设计——VGA (Altera)

1. VGA概述 VGA(Video Graphics Array)是IBM在1987年推出的一种视频传输,具有分辨率高.显示速率快.颜色丰富等优点,在彩色显示器领域得到了广泛的应用.不支持热插拔,不支持音频传输. 2. VGA时序 下面以640*[email protected]为例说明VGA时序和FPGA设计,其他分辨率和帧率的可参考VESA中查找. 计算像素时钟pclk = 800*525*60 = 25200000,注意这里的HSYNC和VSYNC都是低电平有效,且HSYNC在数据行无效

采用FPGA实现UART转SPI

应用笔记 V1.1 2015/2/10 采用FPGA实现UART转SPI ? 概述 ? 本文提供了实现UART转SPI的Verilog代码的功能描述.这份笔记将介绍UART和SPI的基本知识,代码设计的基本思路,以及代码的具体实现及其描述.本程序的具体功能在于配合AD9512_Serial_GUI完成AD9512寄存器的配置,包括读及写过程. 修订历史 以下表格展示了本文档的修订过程 日期 版本号 修订内容 2015/02/08 V1.0 初始版本,通过实际验证 2015/02/10 V1.1

用FPGA设计LCD 转 VGA

这个东西其实是在上一个冬天就做完了,而且似乎已经产业化了,当时是为一位朋友做的,这个朋友再卖给产业化的人,就像流于俗套的故事一样,这个朋友拿到了钱,不过不像项目开始时说的那样与我有关.想想多年前一起吃喝拉撒的场景,叹了一口气抹去那些记忆,也只能算了.现在把这个设计写在博文博文中,一方面可以回忆回忆当时的设计思路,也希望可以为其他设计FPGA的兄弟姐妹们提供一点参考. 当时的写的ppt文档可在下列地址下载: http://blogimg.chinaunix.net/blog/upfile2/101

基于FPGA的VGA显示静态图片

终于熬到暑假了,记过三四周的突击带考试,终于为我的大二画上了一个完整的句号,接下来终于可以静心去做自己想做的事情了,前一阵子报了一个线上培训班,学学Sobel边缘检测,之前一直在学习图像处理,但是因为一直看人家的代码,到后来难免有点空虚.所以说自己狠下心来,报了一个线上培训班,重新学习一下,自己设计Sobel边缘检测,势要摆脱抄别人代码的魔咒.所以这次图像显示部分和在彩色条纹中显示一副图片的代码,全部是我自己设计的,虽然不是什么大工程,但是还是满满的成就感,这次用的时间比较久,因为使用的是新板子

《FPGA全程进阶---实战演练》第十章 VGA五彩缤纷

1基础理论部分 VGA(video graphics array)即视频图形阵列,是IBM在1987年随PS/2一起推出的使用模拟信号的一种视频传输标准.VGA相比与现在的视频传输接口来说已经过时,不过作为最低标准,基本上制造商都会接入此接口,图11.1是常见的VGA接口. 图11.1 VGA接口 对于VGA15个引脚的相关说明,如下图所示. 图11.2 VGA引脚说明 大家做实验的时候,可能会有一个误区,那就是做实验时直接把实验板的VGA接口接到笔记本电脑上,还兴高采烈的等待着显示图像,殊不知