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

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

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

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

指令解析模块
指令解析模块用于解析接收到的指令,提取控制参数。指令可以是设定目标位置的命令,例如“MOVE X=100 Y=200”,其中X和Y为目标位置的横纵坐标。指令解析模块通过解析指令中的参数,提取目标位置的横纵坐标。
51d1eaa9e2052c6873af85e8578aa995_82780907_202309112318050067736303_Expires=1694446085&Signature=kfMvW6Qbj%2BdnORmCoX5gg8FIz9c%3D&domain=8.png

2.算法运行软件版本
MATLAB2022a

ISE14.7

芯片型号:

5a688cd30443da578d02acee770c1bf1_82780907_202309112318160910507047_Expires=1694446096&Signature=SWoZiNRkg62F0avDDnUqZZg64y8%3D&domain=8.png

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

黑金AX545开发板SPARTANT6 XC6S LX45

3.算法运行效果图预览

718d75bc76b57da630e0d520e760f04f_82780907_202309112322040019904455_Expires=1694446324&Signature=E8tC5FFl4gBYM5ypWHWeEurCErE%3D&domain=8.png
4fb439225bae83cad51c82889a669739_82780907_202309112322040394991610_Expires=1694446324&Signature=7CjJg6KiAumMc6VGrcOuXUAlMoA%3D&domain=8.png

4.部分核心程序

```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

```

相关文章
|
异构计算
串口协议FPGA实现
串口协议FPGA实现
127 0
串口协议FPGA实现
|
Web App开发 .NET Go
【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验十三:串口模块② &mdash; 接收
实验十三:串口模块② — 接收 我们在实验十二实现了串口发送,然而这章实验则要实现串口接收 ... 在此,笔者也会使用其它思路实现串口接收。 图13.1 模块之间的数据传输。 假设我们不考虑波特率,而且一帧数据之间的传输也只是发生在FPGA之间,即两只模块之间互转,并且两块模块都使用相同的时钟频率,结果如图13.1所示。
1021 0
|
异构计算 C语言
【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验十二:串口模块① — 发送
实验十二:串口模块① — 发送 串口固然是典型的实验,想必许多同学已经作烂,不过笔者还要循例介绍一下。我们知道串口有发送与接收之分,实验十二的实验目的就是实现串口发送,然而不同的是 ... 笔者会用另一种思路去实现串口发送。
1211 0
|
异构计算
【嵌入式开发】FPGA/CPLD控制串口(VHDL版)
作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/ 采用自顶向下设计: top_rs232_port.vhd library ieee; use ieee.
751 0
|
6天前
|
机器学习/深度学习 算法 异构计算
m基于FPGA的多通道FIR滤波器verilog实现,包含testbench测试文件
本文介绍了使用VIVADO 2019.2仿真的多通道FIR滤波器设计。展示了系统RTL结构图,并简述了FIR滤波器的基本理论,包括单通道和多通道的概念、常见结构及设计方法,如窗函数法、频率采样法、优化算法和机器学习方法。此外,还提供了Verilog核心程序代码,用于实现4通道滤波器模块,包含时钟、复位信号及输入输出接口的定义。
22 7
|
2月前
|
算法 异构计算
基于FPGA的ECG信号滤波与心率计算verilog实现,包含testbench
基于FPGA的ECG信号滤波与心率计算verilog实现,包含testbench
|
1月前
|
算法 异构计算
m基于FPGA的电子钟verilog实现,可设置闹钟,包含testbench测试文件
该文介绍了基于FPGA的电子钟设计,利用Vivado2019.2平台进行开发并展示测试结果。电子钟设计采用Verilog硬件描述语言,核心包括振荡器、分频器和计数器。时间显示为2个十进制格式,闹钟功能通过存储器和比较器实现,当当前时间等于设定时间时触发。文中给出了Verilog核心程序示例,展示了时钟信号、设置信号及输出的交互。
28 2

热门文章

最新文章