通过FPGA实现基于RS232串口的指令发送并控制显示器中目标位置

news2024/11/26 22:26:50

目录

1.算法理论概述

串口通信模块

指令解析模块

位置控制模块

显示器驱动模块

2.部分核心程序

3.算法运行软件版本

4.算法运行效果图预览

5.算法完整程序工程


1.算法理论概述

        通过FPGA实现基于RS232串口的指令发送并控制显示器中目标位置是一种常见的应用场景,用于实现对显示器中目标位置的控制。该系统利用FPGA芯片作为主控制器,通过RS232串口与计算机或其他设备进行通信,接收指令并解析,然后控制显示器中目标位置的移动。该系统的主要原理是利用FPGA芯片作为主控制器,通过RS232串口与计算机或其他设备进行通信。计算机通过串口发送指令到FPGA,FPGA接收并解析指令,然后根据指令控制显示器中目标位置的移动。系统主要包括串口通信模块、指令解析模块、位置控制模块和显示器驱动模块。

  • 串口通信模块

串口通信模块用于与计算机或其他设备进行数据交互。通过RS232串口协议,实现数据的发送和接收。具体实现步骤包括串口初始化、数据发送和数据接收。

  • 指令解析模块

指令解析模块用于解析接收到的指令,提取控制参数。指令可以是设定目标位置的命令,例如“MOVE X=100 Y=200”,其中X和Y为目标位置的横纵坐标。指令解析模块通过解析指令中的参数,提取目标位置的横纵坐标。

  • 位置控制模块

       位置控制模块根据解析得到的目标位置,通过控制信号控制显示器中目标位置的移动。具体实现步骤包括生成控制信号和发送控制信号。控制信号可以是电平信号或PWM信号,用于控制显示器中的驱动器。

这里,串口发射的数据格式如下: 

帧头

16个1

表示帧头

8bit

是否显示

文字

8bit+8bit

X坐标

8bit+8bit

Y坐标

8bit+8bit

X长度

8bit+8bit

Y坐标

8bit+8bit

校验

  • 显示器驱动模块

       显示器驱动模块接收位置控制模块发送的控制信号,将其转换为显示器可以识别的信号。显示器驱动模块根据控制信号,控制显示器中的电机或其他执行器,使目标位置实现移动。

       实现该系统的关键在于FPGA的编程和配置,以及串口通信的数据交互和指令解析的算法设计。此外,还需要根据具体的显示器和驱动器的接口要求进行信号转换和电平调整。

2.部分核心程序

..................................................................
wire RST;
assign RST = ~reset;

wire clk50M;
wire clk25M;
CLK_dcm CLK_dcm_u(// Clock in ports
    .CLK_IN1 (clk50),      // IN
    // Clock out ports
    .CLK_OUT1(clk50M),     // OUT
    .CLK_OUT2(clk25M)
	 );    // OUT


//根据输入使能信号产生行列计数器,用来进行定位
//根据输入使能信号产生行列计数器,用来进行定位
//根据输入使能信号产生行列计数器,用来进行定位
wire [4:0] wvga_r;
wire [5:0] wvga_g;
wire [4:0] wvga_b;
wire [10:0]x_cnt;
wire [9:0] y_cnt;	
wire       vga_hsync;
wire       vga_vsync;
//VGA显示控制部分
vga_disp	vga_disp_inst(
	.vga_clk                 (clk25M),
	.vga_rst                 (RST),	
	
	.ddr_data_vga            (64'd0),      //如果使用DDR送入视频,那么从这里输入即可,我这边测试则不考虑,这里空出来
	.vga_r                   (wvga_r),     //DDr转换为R,
	.vga_g                   (wvga_g),     //DDr转换为G, 
	.vga_b                   (wvga_b),     //DDr转换为B,
	.vga_hsync               (vga_hsync),	
	.vga_vsync               (vga_vsync),
	.ddr_addr_rd_set         (),     //ddr_addr_rd_set
	.ddr_rden                (),     //ddr_rden
	.ddr_rd_cmd              (),     //ddr_rd_cmd
	.x_cnt                   (x_cnt),
	.y_cnt                   (y_cnt)
	
);




//串口输入信号
//串口输入信号
//串口输入信号
//串口输入信号
wire[15:0]w_head;
wire[7 :0]w_text_view;
wire[15:0]w_x;
wire[15:0]w_y;
wire[15:0]w_w;
wire[15:0]w_h;
wire clk_data;
wire clk;
UART_signal instance_name (
    .clk50      (clk50M), 
    .rx         (rx), 
    .reset      (RST), 
    .LED_test   (), 
    .o_head     (w_head), 
    .o_text_view(w_text_view), 
    .o_x        (w_x), 
    .o_y        (w_y), 
    .o_w        (w_w), 
    .o_h        (w_h), 
    .clk_data   (clk_data),
	 .clk        (clk)
    );
	 
reg[15:0]r_head;
reg[7 :0]r_text_view;
reg[15:0]r_x;
reg[15:0]r_y;
reg[15:0]r_w;
reg[15:0]r_h;	 
	
always @(posedge clk50M or posedge RST)   
begin
     if(RST)
	  begin
     r_head      <= 16'd0;
     r_text_view <= 8'd0;
     r_x         <= 16'd0;
     r_y         <= 16'd0;
     r_w         <= 16'd0;
     r_h         <= 16'd0;	  
	  end
else begin
     r_head      <= w_head;
     r_text_view <= w_text_view;
     r_x         <= w_x;
     r_y         <= w_y;
     r_w         <= w_w;
     r_h         <= w_h;	
     end
end

//字体显示
/
wire w_FLAG1;
test_load test_load_u(
    .i_clk (clk25M), 
    .i_rst (RST), 
	 .i_en  (r_text_view[7]|r_text_view[6]|r_text_view[5]|r_text_view[4]|r_text_view[3]|r_text_view[2]|r_text_view[1]|r_text_view[0]),
    .i_xcnt(x_cnt), //根据H和V的使能,得到视频区域的计数器
    .i_ycnt(y_cnt), //根据H和V的使能,得到视频区域的计数器
    .o_FLAG(w_FLAG1)
    );
	 
/
wire w_FLAG2;	 
box_load box_load_u(
    .i_clk   (clk25M), 
    .i_rst   (RST), 
    .i_xcnt  (x_cnt), //根据H和V的使能,得到视频区域的计数器
    .i_ycnt  (y_cnt), //根据H和V的使能,得到视频区域的计数器
    .i_width (r_w), //16'd300
    .i_height(r_h), //16'd200
    .i_xc    (r_x), //16'd1000
    .i_yc    (r_y), //16'd300
    .o_flag  (w_FLAG2)
    );		 
	 
	 
	 
wire[7:0]CCD_R;
wire[7:0]CCD_G;
wire[7:0]CCD_B;

wire[7:0]CCD_R1;
wire[7:0]CCD_G1;
wire[7:0]CCD_B1;

assign CCD_R1=(w_FLAG1==1'b1)?8'd255:{wvga_r,3'd0};
assign CCD_G1=(w_FLAG1==1'b1)?8'd255:{wvga_g,2'd0};
assign CCD_B1=(w_FLAG1==1'b1)?8'd255:{wvga_b,3'd0};


assign CCD_R=(w_FLAG2==1'b1)?8'd255:{CCD_R1};
assign CCD_G=(w_FLAG2==1'b1)?8'd255:{CCD_G1};
assign CCD_B=(w_FLAG2==1'b1)?8'd255:{CCD_B1};


assign vga_r=CCD_R[7:3];
assign vga_g=CCD_G[7:2];
assign vga_b=CCD_B[7:3];









//在线信号检测,实际最后可以删除
//在线信号检测,实际最后可以删除
//在线信号检测,实际最后可以删除	
//在线信号检测,实际最后可以删除
wire[99:0]testdata;

assign testdata[15:0]  = r_head;
assign testdata[23:16] = r_text_view; 
assign testdata[39:24] = r_x; 
assign testdata[55:40] = r_y; 
assign testdata[71:56] = r_w; 
assign testdata[87:72] = r_h; 
assign testdata[88]    = clk_data; 
assign testdata[89]    = clk; 

Chipscop Chipscop_u(
    .i_clk(clk), 
    .trig(8'b0000_0000), 
    .testdata(testdata)
    );

endmodule
13_014m

3.算法运行软件版本

MATLAB2022a

ISE14.7

芯片型号:

 使用的FPGA开发板型号如下:

黑金AX545开发板SPARTANT6 XC6S LX45

4.算法运行效果图预览

5.算法完整程序工程

OOOOO

OOO

O

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

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

相关文章

双向不循环链表的认识和基础操作(节点创建,头插头删,尾插尾删,输出和逆置)

头定义&#xff1a; typedef char datatype[20];//datatypechar[20] typedef struct Node {//数据域 数据元素datatype data;//指针域 下一个节点地址struct Node* next;//指针域 上一个节点地址struct Node* prev; }*DoubleLink; 创建节点&#xff1a; DoubleLink create_n…

校园电气安全风险分析及预防措施 安科瑞 许敏

摘要:校园属于人员密集场所&#xff0c;若安全风险排查、管控不到位&#xff0c;可能导致安全事故发生&#xff0c;造成严重事故后果。校园电气设备设施引起的电气火灾和触电等事故&#xff0c;是构成校园安全威胁之一&#xff0c;笔者通过对校园发生的电气安全事故案例原因分析…

一次线上OOM问题的个人复盘

我们一个java服务上线后&#xff0c;偶尔会发生内存OOM(Out Of Memory)问题&#xff0c;但由于OOM导致服务不响应请求&#xff0c;健康检查多次不通过&#xff0c;最后部署平台kill了java进程&#xff0c;这导致定位这次OOM问题也变得困难起来。 最终&#xff0c;在多次review代…

react目录结构

比较全面的react目录结构。 目录详解 assets&#xff1a;放置原始资源文件。 components&#xff1a;存放全局组件。 contants&#xff1a;常量文件夹&#xff0c;存放常量。 i18n&#xff1a;i18n国际化&#xff0c;各种语言的翻译。 pages&#xff1a;页面文件夹。 r…

es添加索引命令行和浏览器添加索引--图文详解

一、添加索引 创建索引 curl -X PUT "localhost:9200/my-index-00001?pretty" 获取索引 curl -X GET "localhost:9200/my-index-000001?pretty" 获取全部的索引 curl -X GET "http://localhost:9200/_cat/indices?v" 获取索引映射 cur…

2023 Pycharm 给项目配置解释器 基于已经创建的conda虚拟环境

我在2019年开始使用Pycharm作为python的IDE&#xff0c;最近配置解释器时&#xff0c;法线网上的方法大概过时了&#xff0c;自己尝试了好多次才发现新版本的Pycharm的解释配置方法&#xff0c;故记于此 背景描述&#xff1a; 我是用conda管理环境的&#xff0c;我已经创建好一…

C++ 单例模式(介绍+实现)

文章目录 一. 设计模式二. 单例模式三. 饿汉模式四. 懒汉模式结束语 一. 设计模式 单例模式是一种设计模式 设计模式(Design Pattern)是一套被反复使用&#xff0c;多数人知晓的&#xff0c;经过分类的&#xff0c;代码设计经验的总结。 为什么要有设计模式 就像人类历史发展会…

Docker容器网络和资源管理控制

Docker容器网络 一、Docker 网络实现原理二、Docker 的网络模式网络模式详解&#xff1a;①host模式②container模式③none模式④bridge模式⑤自定义网络 三、资源控制Ⅰ、CPU资源控制Ⅱ、对内存使用的限制Ⅲ、对磁盘IO配额控制&#xff08;blkio&#xff09;的限制 一、Docker…

前端vue uni-app仿美团下拉框下拉筛选组件

在前端Web开发中&#xff0c;下拉筛选功能是一种非常常见的交互方式&#xff0c;它可以帮助用户快速选择所需的选项。本文将介绍如何利用Vue.js和uni-app框架来实现一个高效的下拉筛选功能。通过使用这两个强大的前端框架&#xff0c;我们可以轻松地创建具有响应式用户操作的下…

Hbuildx下载内置浏览器失败

问题描述 刚开始接触Hbulidx&#xff0c;在下载内置浏览器时&#xff0c;报错 " Hbulidx内置浏览器下载失败 " 原因分析 从网上搜索相关的解决方法&#xff0c;一般都是说检查网络&#xff0c;或者关闭杀毒软件。这并没有解决问题&#xff0c;所以&#xff0c;我就…

【C++】STL之容器适配器——使用deque适配stack和queue

个人主页&#xff1a;&#x1f35d;在肯德基吃麻辣烫 分享一句喜欢的话&#xff1a;热烈的火焰&#xff0c;冰封在最沉默的火山深处。 文章目录 前言一、什么是容器适配器&#xff1f;二、stack的基本函数和模拟实现三、queue的基本函数和模拟实现 四、deque4.1deque的底层结构…

如何解决 Git 合并冲突

在遇到合并冲突时&#xff0c;请不要惊慌。通过一些娴熟的技巧协商&#xff0c;你可以解决任何冲突。 假设你和我正在共同编辑同一个名称为 index.html 的文件。我对文件进行了修改&#xff0c;进行了提交&#xff0c;并将更改推送到 Git 远程仓库。你也对同一个文件进行了修改…

K8S初级入门系列之六-控制器(RC/RS/Deployment)

一、前言 在第一章我们了解到&#xff0c;如果master节点是一个大脑&#xff0c;那么控制器组件就是大脑的总管&#xff0c;用来控制Pod的状态和行为。今天我们就来认识弹性扩缩容相关的控制器ReplicationController&#xff0c;ReplicaSet&#xff0c;Deployment。 二、Repli…

(汽车MCU)FS32K148UJT0VLLT、FS32K148HAT0MLLT、FS32K148UJT0VLUT基于32位Cortex-M4F内核 架构图

S32K 32位汽车通用微控制器 (MCU) 是一系列符合AEC-Q100标准、基于32位ARM Cortex-M4F内核的可扩展MCU&#xff0c;适用于通用汽车和高可靠性工业应用。这些系列提供具有可扩展性的软硬件兼容系列&#xff0c;有多种性能、存储器和特性可供选择。这些MCU提供ISO、CAN FD、CSEc硬…

如何使用curl下载github代码

首先通过chrome打开想要下载的源文件 如图&#xff0c;有那个下载图标时表示不需要鉴权即可下载&#xff0c;一般仓库都会开放只读权限&#xff0c;所以很大概率都有 比如我想下载这个crc32.c文件 那么我就需要知道它在哪个IP中&#xff0c;按下F12打开网络&#xff0c;点击下载…

qt学习——QMainWindow、基本控件

初识qt **QMainWindow——菜单栏和工具栏****状态栏、铆接部件、核心部件****资源文件得添加****模态和非模态对话框创建****消息对话框****其它标准对话框****登录窗口布局****控件按钮组****QListWidget控件****QTreeWidget树控件****QTableWidget控件****其他常用控件介绍**…

踩坑_vertical-align

目录 问题&#xff1a;vertical-align属性语法父元素的基线怎么找呢&#xff1f;特殊元素的基线行盒 解决 问题&#xff1a; 今天在做一个需求时遇到了如下问题&#xff1a; 代码 <style>*{margin:0;padding:0;}#app{width: 300px;height: 117px;background: #FFFFFF;bo…

验证回文串(力扣)双指针 JAVA

如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给你一个字符串 s&#xff0c;如果它是 回文串 &#xff0c;返回 true &#xff1b;否则&#xf…

访客报警定位管理系统:提升安全管理水平的创新解决方案

在当前日益复杂的安全环境下&#xff0c;保障人员安全、提高安全响应能力和管理效率成为了各行各业的首要任务。 作为一种先进的安全管理解决方案&#xff0c;访客报警定位管理系统凭借其独特的优势和广泛的应用场景&#xff0c;正逐渐成为各行业安全管理的重要工具。 那么&a…

web前端设计师的主要职责说明(合集)

web前端设计师的主要职责说明1 职责&#xff1a; 1. 根据UI设计师提供的设计图&#xff0c;实现一流的Web界面&#xff0c;优化代码并保持在各浏览器下良好的兼容性; 2. Web前端表现层及与后端交互的架构设计和开发; 3. JavaScript程序模块开发&#xff0c;通用类库、框架编…