53.综合实验:UART接收图像、写入RAM、通过TFT显示

        (1)设计定义:UART_RX模块接收数据,通过写入逻辑写入RAM存储器中,然后通过读取逻辑,从RAM中读出数据,发送给TFT显示屏。

        (2)FPGA逻辑资源有限,因此设置128 * 128 像素点图片输出,首先使用画图工具制造合适的像素图片,保存为24位位图。

         (3)Verilog代码编写:

  • 串口数据接收模块:
    module UART_RX(clk,reset_n,uart_rxd,rx_done,rx_data);input clk;input reset_n;input uart_rxd;output reg rx_done;output reg [7:0]rx_data;reg dff0_uart_rxd;reg dff1_uart_rxd;reg last_dff1_uart_rxd;wire nedge;wire w_rx_done;reg [29:0]baud_cnt;reg [3:0]bit_cnt;reg en_baud_cnt;reg [7:0]r_rx_data;parameter f_system = 50_000_000;parameter Baud = 115200;				parameter MCNT = f_system/Baud;//为解决亚稳态问题,加入两个寄存器,使外部输入的异步信号uart_rx与时钟信号clk同步。
    //同步化处理always@(posedge clk)begindff0_uart_rxd <= uart_rxd;dff1_uart_rxd <= dff0_uart_rxd;end//下降沿设计	always@(posedge clk)last_dff1_uart_rxd <= dff1_uart_rxd;assign nedge = last_dff1_uart_rxd && (!dff1_uart_rxd);//波特计数器模块设计always@(posedge clk or negedge reset_n)if(!reset_n)baud_cnt <= 30'd0;else if(en_baud_cnt)beginif(baud_cnt == MCNT - 1)baud_cnt <= 30'd0;else baud_cnt <= baud_cnt + 30'd1;endelse baud_cnt <= 30'd0;//位设计always@(posedge clk or negedge reset_n)if(!reset_n)bit_cnt <= 4'd0;else if(w_rx_done)bit_cnt <= 4'd0;else if(baud_cnt == MCNT - 1)bit_cnt <= bit_cnt + 4'd1;else bit_cnt <= bit_cnt;//en_baud_cnt使能信号的设计always@(posedge clk or negedge reset_n)if(!reset_n)en_baud_cnt <= 0;else if(nedge)en_baud_cnt <= 1;else if((baud_cnt == MCNT/2)&&(bit_cnt == 0)&& (dff1_uart_rxd))en_baud_cnt <= 0;else if(w_rx_done)en_baud_cnt <= 0;else	en_baud_cnt <= en_baud_cnt;//接收主代码设计always@(posedge clk or negedge reset_n)if(!reset_n)r_rx_data <= 8'd0;else if(baud_cnt == MCNT/2)begincase(bit_cnt)4'd1:r_rx_data[0] <= dff1_uart_rxd;4'd2:r_rx_data[1] <= dff1_uart_rxd;4'd3:r_rx_data[2] <= dff1_uart_rxd;4'd4:r_rx_data[3] <= dff1_uart_rxd;4'd5:r_rx_data[4] <= dff1_uart_rxd;4'd6:r_rx_data[5] <= dff1_uart_rxd;4'd7:r_rx_data[6] <= dff1_uart_rxd;4'd8:r_rx_data[7] <= dff1_uart_rxd;default: r_rx_data <= r_rx_data;endcaseendelse r_rx_data <= r_rx_data;always@(posedge clk)if(w_rx_done)rx_data <= r_rx_data;else rx_data <= rx_data;//w_rx_done 和 rx_done信号的设计assign w_rx_done = (baud_cnt == MCNT/2)&&(bit_cnt == 9);always@(posedge clk)rx_done <= w_rx_done;endmodule
    
  • ram读写逻辑控制模块:
    module ram_ctrl(input                   clk         ,input                   reset_n     ,input                   clk_33M     ,input       [7:0]       rx_data     ,input                   rx_done     ,input       [9:0]       hang        ,input       [9:0]       lie         ,output reg              ram_wren    ,output reg  [13:0]      rdaddress   ,output reg  [13:0]      ram_wraddr  ,    output      [15:0]      ram_w_data  ,output 						 img_display
    );//128*128*2 = 32768    需要一个十五位的寄存器去计数reg         [14:0]      done_cnt        ;reg         [15:0]      temp_wrdata     ;/* ---------------------------------------------------写逻辑部分------------------------------------------------*///串口传输完成计数器
    always@(posedge clk or negedge reset_n)if(!reset_n)done_cnt <= 15'd0;else if(rx_done)done_cnt <= done_cnt + 15'd1;else    done_cnt <= done_cnt;//ram写入数据寄存器
    always@(posedge clk or negedge reset_n)if(!reset_n)temp_wrdata <= 16'd0;else if(rx_done)temp_wrdata <= {temp_wrdata[7:0],rx_data};else temp_wrdata <= temp_wrdata;assign ram_w_data = temp_wrdata ;//ram写使能设计
    always@(posedge clk or negedge reset_n)if(!reset_n)ram_wren <= 1'd0;else if(done_cnt[0] && rx_done)ram_wren <= 1'd1;else ram_wren <= 1'd0;//ram写地址设计
    always@(posedge clk or negedge reset_n)if(!reset_n)ram_wraddr <= 14'd0;else if(done_cnt[0] && rx_done)ram_wraddr <= done_cnt[14:1];else ram_wraddr <= ram_wraddr;/* ---------------------------------------------------读逻辑部分------------------------------------------------*///tft读出有效区域设计
    assign img_display = (hang >= 337) && (hang < 465) && (lie >= 177) && (lie < 305)   ;//ram读地址设计
    always@(posedge clk_33M or negedge reset_n)if(!reset_n)rdaddress <= 14'd0;else if(img_display)   rdaddress <= rdaddress + 14'd1;else rdaddress <= rdaddress;     endmodule 
    
  • 顶层模块:
    module tft_img_top(input 					clk		,input						reset_n	,input						uart_rxd	,output					hsync		,output					vsync		,output	[15:0]		rgb_tft 	,output               tft_bl  	,output               tft_clk 	,output               tft_DE  );wire					rx_done 		;wire		[7:0]		rx_data		;wire					clk_33M		;wire					locked		;wire		[9:0]		hang			;wire		[9:0]		lie			;wire					ram_wren		;wire		[13:0]	rdaddress	;wire		[13:0]	ram_wraddr	;wire		[15:0]	data_tft		;wire		[15:0]	ram_w_data	;wire		[15:0]	q				;wire		[15:0]	data_in		;wire					img_display	;UART_RX	UART_RX_INST(.clk				(clk			),.reset_n			(locked		),.uart_rxd		(uart_rxd	),.rx_done			(rx_done		),.rx_data			(rx_data		)
    );pll_33M	pll_33M_inst (.areset 	( ~reset_n 	),.inclk0 	( clk 		),.c0 		( clk_33M 	),.locked 	( locked 	)
    );ram_ctrl		ram_ctrl_inst(.clk         ( clk			),.reset_n     ( locked		),.clk_33M     ( clk_33M		),.rx_data     ( rx_data		),.rx_done     ( rx_done		),.hang        ( hang			),.lie         ( lie			),.ram_wren    (ram_wren		),.rdaddress   (rdaddress	),.ram_wraddr  (ram_wraddr	),    .ram_w_data  (ram_w_data	),.img_display (img_display )
    );myram			myram_inst (.data 		( ram_w_data 	),.rdaddress 	( rdaddress 	),.rdclock 	( clk_33M 		),.wraddress 	( ram_wraddr   ),.wrclock 	( clk 			),.wren 		( ram_wren		),.q 			( q 				)
    );assign data_in = (img_display) ? q : 16'd0	;tft_ctrl		tft_ctrl_inst(.clk_33M         (clk_33M		),.reset_n         (locked		),.data_in         (data_in		),.hang            (hang			),.lie             (lie			),.hsync           (hsync		),.vsync           (vsync		),.rgb_tft         (rgb_tft 	),.tft_bl          (tft_bl  	),.tft_clk         (tft_clk 	),.tft_DE          (tft_DE		)  );endmodule
    

        (4)引脚绑定:

(5)实验现象:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/50331.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

新生报到系统2024((代码+论文+ppt)

下载在最后 技术栈: ssmmysqljsp 展示: 下载地址: CSDN现在上传有问题,有兴趣的朋友先收藏.正常了贴上下载地址 备注:

docker安装部署elasticsearch7.15.2

docker安装部署elasticsearch7.15.2 1.拉取es镜像 docker pull docker.elastic.co/elasticsearch/elasticsearch:7.15.2如果不想下载或者镜像拉去太慢可以直接下载文章上面的镜像压缩包 使用镜像解压命令 docker load -i elasticsearch-7-15-2.tar如下图所示就表示镜像解压成…

Qt+OpenCascade开发笔记(二):windows开发环境搭建(二):Qt引入occ库,搭建基础工程模板Demo和发布Demo

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/140763014 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

51单片机嵌入式开发:19、STC89C52R控制LCD1602码表+数码管+后台数显(串口)

STC89C52R控制LCD1602码表数码管后台数显&#xff08;串口&#xff09; 1 概述1.1 项目概述1.2 项目组成部分1.3 功能描述 2 开发环境2.1 支持设备2.2 硬件电路 3 软件代码工程4 演示4.1 Proteus仿真4.2 实物演示 5 总结 1 概述 1.1 项目概述 本项目旨在利用STC89C52R单片机实…

后端笔记(1)--javaweb简介

1.JavaWeb简介 ​ *用Java技术来解决相关web互联网领域的技术栈 1.网页&#xff1a;展现数据 2.数据库&#xff1a;存储和管理数据 3.JavaWeb程序&#xff1a;逻辑处理 2.mysql 1.初始化Mysql mysqld --initialized-insecure2.注册Mysql服务 mysqld -install3.启动Mysql…

USB3.0的等长要求到底是多少?

USB2.0与USB3.0接口的PCB布局布线要求PCB资源PCB联盟网 - Powered by Discuz! (pcbbar.com) 90欧姆阻抗&#xff0c;走差分线&#xff1a; 重点来了&#xff1a;

第十九届全国大学生智能汽车竞赛地平线创意组在武汉理工大学隆重开幕

7月27日上午&#xff0c;第十九届全国大学生智能汽车竞赛地平线创意组智慧医疗赛道全国选拔赛开幕式隆重举行&#xff0c;大赛由中国自动化学会、第十九届全国大学生智能汽车竞赛组织委员会主办&#xff0c;武汉理工大学、地平线、古月居承办。首年即吸引来自全国各地280支队伍…

国内乳品领军企业『君乐宝』SRM一期项目成功上线,企企通助力企业采购数字化再升级,二期项目正式启航!

近日&#xff0c;企企通为君乐宝乳业集团&#xff08;以下简称“君乐宝”&#xff09;打造的采购供应链管理系统一期项目成功上线运行&#xff0c;基于双方的信任基础与协作模式将再次携手深化合作&#xff0c;构建全品类、全流程、全场景、全模式的采购数字化管理闭环&#xf…

如何为 5G 小型基站部署选择振荡器

5G 网络频谱频率更高、覆盖范围更短&#xff0c;因此比前几代网络密度更高。超高速 5G 回程 (mmWave) 在很大程度上依赖于小型基站&#xff0c;不仅是为了覆盖范围&#xff0c;也是为了速度。除此之外&#xff0c;O-RAN 联盟等举措为 RAN 生态系统提供了更多选择&#xff0c;但…

Scrapy + Django爬虫可视化项目实战(一)

目录 一、项目介绍 (一) 项目背景 (二) 项目介绍 二、系统实现 (一) 爬虫 1. 实现步骤 一、爬取字段 二、分析页面 三、具体实现 2. 爬虫结果 系列文章 Python升级打怪—Django入门 Python升级打怪—Scrapy零基础小白入门 实现技术 ScrapyDjangoEcharts 一、项目…

CSS(五)——CSS Fonts(字体)

CSS 字体 CSS字体属性定义字体&#xff0c;加粗&#xff0c;大小&#xff0c;文字样式。 CSS字型 在CSS中&#xff0c;有两种类型的字体系列名称&#xff1a; 通用字体系列 - 拥有相似外观的字体系统组合&#xff08;如 "Serif" 或 "Monospace"&#x…

黑马程序员2024最新SpringCloud微服务开发与实战 个人学习心得、踩坑、与bug记录Day5 全网最快最全

你好,我是Qiuner. 为帮助别人少走弯路和记录自己编程学习过程而写博客 这是我的 github https://github.com/Qiuner ⭐️ gitee https://gitee.com/Qiuner &#x1f339; 如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 &#x1f604; (^ ~ ^) 想看更多 那就点个关注吧 我会…

hadoop学习(一)

一.hadoop概述 1.1hadoop优势 1&#xff09;高可靠性&#xff1a;Hadoop底层维护多个数据副本&#xff0c;即使Hadoop某个计算元素或存储出现故障&#xff0c;也不会导致数据的丢失。 2&#xff09;高扩展性&#xff1a;在集群间分配任务数据&#xff0c;可方便扩展数以千计…

SPSS个人版是什么软件

SPSS是一款数据统计、分析软件&#xff0c;它由IBM公司出品&#xff0c;这款软件平台提供了文本分析、大量的机器学习算法、数据分析模型、高级统计分析功能等&#xff0c;软件易学且功能非常强大&#xff0c;可以使用SPSS制作图表&#xff0c;例如柱状、饼状、折线等图表&…

【Drools】(一)基于业务需求动态生成 DRT 规则模板:事实与动作定义详解

&#xff08;一&#xff09;基于业务需求动态生成 DRT 规则模板&#xff1a;事实与动作定义详解 背景 在业务规则管理中&#xff0c;DRT 文件&#xff08;Drools Rule Template&#xff09;用于定义和重用规则模板&#xff0c;这些模板可以动态地根据实际业务需求进行填充和生…

Android 10.0 Launcher 启动流程

在前面SystemUI启动流程中说到&#xff0c;在SystemServer中会去启动各种系统服务&#xff0c;这里的launcher也是启动的其中一个服务ActivityManagerService去启动的。在android10之前&#xff0c;系统四大组件的启动都是在ActivityManagerService中&#xff0c;在android10中…

前端创建仓库的详细步骤

第一步点击号新建仓库 第二步输入完仓库名称路径会自己出来然后点击创建 第三步在自己创建的文件夹右键点击GIt Bash Here 第四步把我框的这些一个一个的输在Git Bash Here中每输入一个回车一个 第五步全部输入完以后CtrlF5自动刷新下就好了 然后文件夹就会有.git了

机器视觉12-相机

相机 作用: 工业相机 是 机器视觉系统 的重要组成部分 最本质的功能就是通过CCD或CMOS成 像传感器将镜头产生的光信号转变为 有序的电信号&#xff0c;并将这些信息通过相 应接口传送到计算机主机 工业相机分类 目前业内没有对相机进行明确的分类定义&#xff0c; 以下分类是…

Python 学习中的 API,如何调用API ?

1.1 API的定义 API&#xff0c;全称是Application Programming Interface&#xff08;应用程序编程接口&#xff09;。它是一组定义好的协议和工具&#xff0c;用于在软件应用程序之间进行通信。API可以简化软件开发&#xff0c;使不同的应用程序能够相互协作。它是软件开发中…

数字车间与智能工厂:区别、联系与制造业的未来转型

数字车间和智能工厂在制造业中扮演着重要角色&#xff0c;它们之间存在明显的区别和紧密的联系。以下是对两者区别和联系的详细阐述&#xff1a; 一、区别 定义与范围 数字车间&#xff1a;数字车间是指通过信息化技术、智能化装备和数据化管理等手段&#xff0c;实现生产过程全…