【UART】Verilog实现UART接收和发送模块

2023-11-04

目录

 

写在前面

UART 工作原理

UART 接收部分

UART RX 模块图

UART RX 时序图

Verilog 实现  UART RX 模块

UART 发送部分

UART TX 模块图

UART TX 时序图

Verilog 实现  UART TX 模块

总结


 

写在前面

UART协议在之前的一篇博客中有介绍,直达链接如下:

【总线】一文看懂 UART 通信协议

这里只是做简单的介绍,重点在 Verilog 实现部分。

UART 工作原理

将要传输数据的UART从数据总线接收数据。数据总线用于通过另一个设备(如CPU,内存或微控制器)将数据发送到UART。数据以并行形式从数据总线传输到传输UART。在发送UART从数据总线获取并行数据后,它会添加一个起始位、一个奇偶校验位和一个停止位,从而创建数据包。接下来,数据包在Tx引脚上逐位串行输出。接收UART在其Rx引脚上逐位读取数据包。然后,接收的UART将数据转换回并行形式,并删除起始位、奇偶校验位和停止位。最后,接收UART将数据包并行传输到接收端的数据总线:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

 UART传输的数据被组织成数据包。每个数据包包含 1 个起始位、5 到 9 个数据位(取决于 UART)、一个可选的奇偶校验位以及 1 个或 2 个停止位:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

UART 接收部分

UART RX 模块图

UART 接受模块的作用是将接受到的串行数据转换成并行数据。

由于我做的实验工程是将 UART 和 RS485 共同使用,所以需要一个信号 dir 控制RS485的传输方向,如果不用 RS485 的话可以将此信号忽略。

UART 的接受模块分为六个信号,三个输入信号:时钟信号clk、复位信号(低有效)rst_n、接受串行数据信号;三个输出信号:并行数据po_data、输出并行数据的同步标志信号pi_flag、控制方向信号 dir。

54627046424e41528d41fa547e201ab9.png

UART RX 时序图

时序图清晰的描述了数据是如何变化的。

09f1fdd5cf8b4cfc8b4ea6558a03da42.png

Verilog 实现  UART RX 模块

`timescale 1ns / 1ps
//
// Company: 
// Engineer: Linest-5
// Create Date: 2022/04/14
// Design Name: 
// Module Name: UART_RX
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: UART 接收模块,将串行的数据转成并行的数据接收
// Dependencies: 
// Revision:
// Additional Comments:
// 
//


module UART_RX #(
	parameter	BAUD_RATE = 'd9600,					//波特率
	parameter	CLK_FREQ  = 'd250000000,			//时钟周期
	parameter	BAUD_CNT_MAX = CLK_FREQ/BAUD_RATE
	)
	(
	input	wire		  clk,						//接收到的数据
	input	wire		  rst_n,					//复位信号,低电平有效
	input	wire		  rx,						//输入的串行数据		
	output	reg   [7:0]	  po_data,					//输出的并行数据
	output	reg           po_flag					//并行数据输出的同步标志信号
	);			
				
	reg					  rx_reg1;					//打三拍,稳定数据
	reg 				  rx_reg2;		
	reg 				  rx_reg3;		
	reg 				  start_flag;				//数据稳定信号
	reg 				  work_en;					//开始提取数据有效信号
	reg 				  bit_flag;					//数据提取标志信号
	reg   [3:0]			  bit_cnt;					//数据位计数信号
	reg   [12:0]		  baud_cnt;					//比特计数信号,一个数据需要多少个时钟周期
	reg   [7:0]			  rx_data; 					//串转并数据
	reg 				  rx_flag;					//串转并完成信号


	//消除亚稳态
	always @(posedge clk or negedge rst_n) begin
		if (rst_n == 'd0) begin
			rx_reg1 <= 'd1;
		end
		else begin
			rx_reg1 <= rx;
		end
	end

	always @(posedge clk or negedge rst_n) begin
		if (rst_n == 'd0) begin
			rx_reg2 <= 'd1;
		end
		else begin
			rx_reg2 <= rx_reg1;
		end
	end

	always @(posedge clk or negedge rst_n) begin
		if (rst_n == 'd0) begin
			rx_reg3 <= 'd1;
		end
		else begin
			rx_reg3 <= rx_reg2;
		end
	end
	//下降沿检测
	always @(posedge clk or negedge rst_n) begin
		if (rst_n == 'd0) begin
			start_flag <= 'd0;
		end
		else if ((rx_reg2 == 0) && (rx_reg3 == 1) && (work_en == 'd0)) begin 
			start_flag <= 'd1;
		end
		else begin
			start_flag <= 'd0;
		end
	end
	//开始数据计数信号
	always @(posedge clk or negedge rst_n) begin
		if (rst_n == 'd0) begin
			work_en <= 'd0;
		end
		else if (start_flag == 1) begin
			work_en <= 'd1;
		end
		else if ((bit_flag == 1) && (bit_cnt == 'd8)) begin
			work_en <= 'd0;
		end
	end
	//波特计数信号,用时钟频率除以波特率即每个数据需要的时钟周期数
	always @(posedge clk or negedge rst_n) begin
		if (rst_n == 'd0) begin
			baud_cnt <= 'd0;
		end
		else if ((baud_cnt == BAUD_CNT_MAX-1) || (work_en == 'd0)) begin
			baud_cnt <= 'd0;
		end
		else begin
			baud_cnt <= baud_cnt + 'd1;
		end
	end
	//数据中间提取最稳定
	always @(posedge clk or negedge rst_n) begin
		if (rst_n == 'd0) begin
			bit_flag <= 'd0;
		end
		else if (baud_cnt == BAUD_CNT_MAX/2-1) begin
			bit_flag <= 'd1;
		end
		else begin
			bit_flag <= 'd0;
		end
	end
	//数据位计数信号,只去有效的数据位,起始位和结束位不要
	always @(posedge clk or negedge rst_n) begin
		if (rst_n == 'd0) begin
			bit_cnt <= 'd0;
		end
		else if ((bit_flag == 'd1) && (bit_cnt == 'd8)) begin
			bit_cnt <= 'd0;
		end
		else if (bit_flag == 'd1) begin
			bit_cnt <= bit_cnt + 'd1;
		end
	end
	//将提取的数据串转并
	always @(posedge clk or negedge rst_n) begin
		if (rst_n == 'd0) begin
			rx_data <= 'd0;
		end
		else if ((bit_flag == 'd1) && (bit_cnt >= 'd1) && (bit_cnt <= 'd8)) begin
			rx_data <= {rx_reg3,rx_data[7:1]};
		end
	end
	//完成最后一个数据的拼接之后, 就把此信号拉高 
	always @(posedge clk or negedge rst_n) begin
		if (rst_n == 'd0) begin
			rx_flag <= 'd0;
		end
		else if ((bit_flag == 'd1) && (bit_cnt == 'd8)) begin
			rx_flag <= 'd1;
		end
		else begin
			rx_flag <= 'd0;
		end
	end
	//并行数据输出
	always @(posedge clk or negedge rst_n) begin
		if (rst_n == 'd0) begin
			po_data <= 'd0;
		end
		else if (rx_flag == 'd1) begin
			po_data <= rx_data;
		end
		else begin
			po_data <= po_data;
		end
	end
	//并行数据输出标志信号
    always @(posedge clk or negedge rst_n) begin
        if (rst_n == 'd0) begin
            po_flag <= 'd0;
        end
        else begin
            po_flag <= rx_flag;
        end
    end
	
endmodule

UART 发送部分

UART TX 模块图

输入信号:时钟信号clk、复位信号rst_n、输入并行数据、输入并行数据的同步标志信号

输出信号:发送串行数据tx、数据发送完成标志信号tx_done、方向控制信号dir、发哦是那个端空闲标志信号tx_ready

7e05b53b55ec45d68afd3ffd42e14539.png

UART TX 时序图

014a900e3d75424295a0c1e8d51f3015.png

Verilog 实现  UART TX 模块

`timescale 1ns / 1ps
//
// Company: 
// Engineer: Linest-5
// Create Date: 2022/04/15
// Design Name: 
// Module Name: UART_TX
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: UART 发送模块,将接收到的并行数据转成串行数据并发送
// Dependencies: 
// Revision:
// Additional Comments:
// 
//

module UART_TX(

    input 			clk,					//系统时钟
    input 			rst_n,					//系统复位,低电平有效
    input 			valid,					//数据有效信号
    input [7:0] 	pi_data,				//输入的并行数据

    output 			tx,						//并转串的输出数据
    output 			tx_done, 				//并转串的输出数据发送完成标志信号
    output	reg		dir=1,					//控制max3485的dir使能信号
    output	reg 	ready,					//tx模块可以接收数据信号
    output	reg 	ena 					//使能信号
    );

    reg   [7:0] 	pi_data_reg;			//输入数据寄存
    reg 			work_en;				//开始提取数据有效信号
    reg   [17:0] 	baud_cnt;				//波特计数信号,每个数据需要的波特数
    reg   [3:0] 	bit_cnt;				//数据位计数信号
    reg 			bit_flag;				//数据提取标志信号
    reg 			tx_reg;					//发送数据寄存
    reg 			tx_done_reg;			//发送数据完成标志信号

    //参数定义
    parameter	CLK_FREQ 	 = 'd50000000;				
    parameter	BAUD_RATE 	 = 'd9600;
    parameter	BAUD_CNT_MAX = CLK_FREQ/BAUD_RATE;

	//检测输入数据的到来,并将数据寄存
    always @(posedge clk or negedge rst_n) begin
        if (rst_n == 'd0) begin
            pi_data_reg <= 'd0;
        end
        else if (valid == 'd1) begin
            pi_data_reg <= pi_data ;
        end
        else begin
            pi_data_reg <= pi_data_reg;
        end
    end
	//工作使能,在数据标志信号为高时拉高,在发送数据完成信号为高时拉低
   	always @(posedge clk or negedge rst_n) begin
   	    if (rst_n == 'd0) begin
   	        work_en <= 'd0;
   	    end
   	    else if (valid == 'd1) begin 
   	        work_en <= 'd1;
   	    end
   	    else if (tx_done == 'd1) begin
   	        work_en <= 'd0;
   	    end
   	end
	//根据不同的波特率,对每个数据需要波特数进行计数
    always @(posedge clk or negedge rst_n) begin
        if(rst_n == 'd0)begin
            baud_cnt <= 'd0;
        end
        else if(work_en == 'd1 && (baud_cnt == BAUD_CNT_MAX - 'd1))begin
			baud_cnt <= 'd0 ;
        end
        else if (work_en == 'd1) begin
            baud_cnt <= baud_cnt + 'd1 ; 
        end
        else begin
            baud_cnt <= 'd0;
        end
    end
	//比特标志信号拉高,在每一个波特计数为1时拉高,相当于对数据的提取标志信号
    always @(posedge clk or negedge rst_n) begin
        if (rst_n == 'd0) begin
            bit_flag <= 'd0;
        end
        else if (baud_cnt == 'd1) begin
            bit_flag <= 'd1;
        end
        else begin
            bit_flag <= 'd0;
        end
    end
    //比特计数信号,在对每一个数据为进行计数
    always @(posedge clk or negedge rst_n) begin
        if(rst_n == 'd0)begin
            bit_cnt <= 'd0;
        end
        else if ((work_en == 'd1) && (bit_flag == 'd1) && (bit_cnt == 'd11)) begin
			bit_cnt <= 'd0;                       
        end
        else if ((work_en == 'd1) && (bit_flag == 'd1)) begin
            bit_cnt <= bit_cnt + 'd1;
        end
        else if (work_en == 'd0) begin
            bit_cnt <= 'd0;
        end
    end
	//对并行数据映射到串行数据
    always @(posedge clk or negedge rst_n) begin
        if (rst_n == 'd0) begin
            tx_reg <= 'd0;
        end
        else begin
            case (bit_cnt)
                4'd1: tx_reg <= 'd0;
                4'd2: tx_reg <= pi_data_reg[0];
                4'd3: tx_reg <= pi_data_reg[1];
                4'd4: tx_reg <= pi_data_reg[2];
                4'd5: tx_reg <= pi_data_reg[3];
                4'd6: tx_reg <= pi_data_reg[4];
                4'd7: tx_reg <= pi_data_reg[5];
                4'd8: tx_reg <= pi_data_reg[6];
                4'd9: tx_reg <= pi_data_reg[7];
                4'd10:tx_reg <= 'd1;
                4'd11:tx_reg <= 'd1;
                default :tx_reg <= 'd1; 
            endcase
        end
    end
	//发送数据完成标志信号
    always @(posedge clk or negedge rst_n) begin
        if (rst_n == 'd0) begin
            tx_done_reg <= 'd0;
        end
        else if ((bit_flag == 'd1) && (bit_cnt == 'd10)) begin
            tx_done_reg <= 'd1;
        end
        else begin
            tx_done_reg <= 'd0;
        end
    end
    //在tx模块发送数据完成时或者空闲状态时拉高,拉高表示可以接收上游传来的数据,在数据并转串时拉低
    always @(posedge clk or negedge rst_n) begin
    	if (rst_n == 'd0) begin
    		ready <= 'd1;
    	end
    	else if (tx_done == 'd1) begin
    		ready <= 'd1;
    	end
    	else if (valid == 'd1) begin
    		ready <= 'd0;
    	end
    end
    //Bram的使能信号
    always @(posedge clk or negedge rst_n) begin
    	if (rst_n) begin
    		ena <= 'd0;
    	end
    	else begin
    		ena <= tx_done;
    	end
    end
    
    assign tx = tx_reg;
    assign tx_done = tx_done_reg;

endmodule

总结

UART 的时序并不复杂,最重要的是理解比特率的概念,以及在计数当中如何设定,这两个模块在实际的工程中可以正常跑通。

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【UART】Verilog实现UART接收和发送模块 的相关文章

  • 时序约束理解

    异步配置信息 跨时钟域 配置信息一般set max delay按照3delay来约束 2 异步回读 rst clear信号 设置set false path 放松时序约束要求 不应分析设计中的逻辑路径 因为不关心点到点时序要求
  • IOError:[Errno 2]没有这样的文件或目录(当它确实存在时)Python [重复]

    这个问题在这里已经有答案了 我正在通过 python 中的 uart 传输文件文件夹 下面您可以看到简单的功能 但有一个问题 因为我收到如标题所示的错误 IOError Errno 2 No such file or directory 1
  • Verilog 中总是后面跟着 #(...) pound 是什么意思?

    在一个简单的时钟生成器示例中 我看到以下代码 always cycle 2 clk clk 我以前总是见过 但没见过井号 我试图在文档中找到它 但我所能找到的只是一些对 实值端口 的引用 没有进一步的阐述 这是一个延迟操作 它本质上只是读取
  • 用于 Verilog 或 SystemVerilog 的 TAP(测试任何协议)模块

    是否有 TAP 测试任何协议 http testanything org Verilog 的实现 那就太好了 因为这样我就可以使用证明来自动检查我的结果 更新 10 9 09 有人问为什么不使用断言 部分 TAP 为我提供了一些很好的报告
  • 如何生成异步复位verilog总是阻塞凿子

    Chisel 始终生成敏感度列表中仅包含时钟的块 always posedge clk begin end 是否可以将模块配置为使用异步重置并生成这样的始终块 always posedge clk or posedge reset begi
  • 如何在RTL中使用时钟门控?

    我正在对一些时钟进行门控latch以及我设计中的逻辑 我在综合和布局布线方面没有太多经验 在 RTL 中实现时钟门控的正确方法是什么 示例1 always comb begin gated clk clk latch update en e
  • 将枚举转换为逻辑

    考虑以下模块声明 module DFF d q CLK RESET parameter W 2 input W 1 0 d input CLK input RESET output logic W 1 0 q endmodule 当 d 和
  • 英特尔伽利略裸机 UART

    我想编写一些 hello world 程序裸机申请于英特尔伽利略木板 当然 使用 UEFI 打印文本 到 UART 1 效果很好 但我想 手动 访问 UART 而不需要 UEFI 的任何帮助 在 QEMU 中我的代码运行良好 h file
  • TRICONEX MA2211-100 芯片上相互连接

    TRICONEX MA2211 100 芯片上相互连接 TRICONEX MA2211 100 所有相同的组件 io的电源 处理器 和内存将需要 但是 你可以看到所有这些带存储器和处理器的OO板 针不能嵌入到一个小的单片机上 现在是 普拉克
  • 从测试台访问 uvm_config_db 的最佳方式?

    我想在我的顶级测试平台中创建一个时钟 其周期可以通过测试进行控制 我所做的是将周期设置到 uvm config db 中并将其返回到测试台中 我必须输入 1 以确保构建阶段已完成 否则 get 返回错误值 module testbench
  • if 语句导致 Verilog 中的锁存推断?

    我正在编写用于合成算法的 Verilog 代码 我对哪些情况可能导致推断锁存器有点困惑 下面是这样的一段代码 虽然它在模拟中工作得很好 但我担心它可能会导致硬件问题 always b1 or b2 b1 map b2 map m1 map
  • 如何在 Verilog 中综合 While 循环?

    我尝试设计一个 Booth 乘法器 它在所有编译器中运行良好 包括 Modelsim Verilogger Extreme Aldec Active Hdl 和 Xilinx Isim 我知道模拟和综合是两个不同的过程 而且只有少数Veri
  • 开始后跟冒号和变量是什么意思?

    什么是data mux意思是这里 它只是块的名称吗 if PORT CONFIG 32 P0 1 b1 begin data mux end 这些是块名称 它们特别适用于generate块 例如 您可以定义一个generate块如 genv
  • Verilog 中的 If 语句和分配连线

    我试图弄清楚基于组合逻辑分配电线的基础知识 I have wire val wire x wire a wire b always begin if val 00 I want to assign x a if val 01 I want
  • Verilog 中的大括号是什么意思?

    我很难理解 Verilog 中的以下语法 input 15 0 a 16 bit input output 31 0 result 32 bit output assign result 16 a 15 a 15 0 我知道assign语句
  • 使用 /dev/tty* 进行 9 位 uart 仿真

    我有一个不常见的协议 它需要 9600 波特率 9 位和 1 个停止位 我找不到任何可以实现此发送 接收的驱动程序 我可以寄东西到 dev tty 用于模拟这些查询 我应该发送什么 如何模拟 9600 波特率 您可以使用粘性奇偶校验 也称为
  • 系统 verilog 中没有类型的输入

    我在一个系统 verilog 代码的输入和输出的示例中遇到过module没有说明它们的类型 例如logic wire module mat to stream input 2 0 2 0 2 0 a b input newdata inpu
  • 如何修复实例上的错误:未定义的变量 B?

    我想编译此 Verilog 代码 但在实例中出现错误B模块中的MultiP module error 1 Undefined variable B error 2 near Adder1 syntax error unexpected ID
  • 学习 Verilog 的资源 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我是 Verilog 新手 有人可以推荐学习资源 书籍 视频 博客或任何他们有良好个人经验并帮助他们更
  • Verilog 中如何使用函数?

    在我的 FPGA Verilog 课程中 我的教授只是回顾了函数 他说在函数中 你可以按程序编写代码 然后 当您想要调用该函数时 您可以在always块中调用它 即 程序性地 也可以使用分配语句来调用它 对我来说 如何使用过程代码编写函数

随机推荐

  • redis教程

    Redis和tp使用 类型 支持多种数据结构类型 包括string 字符串 hash 哈希 list 链表 set 无序集合 Zset 有序集合 Redis能读的速度是110000次 s 写的速度是81000次 s Redis所有单个命令的
  • AIX字体丢失——解决方案

    问题 图标中文显示为方框 报表工具FineReport 解决办法 拷贝中文字体到操作系统 1 将 WINDOWS Fonts 目录下SIMSUN TTC 宋体 拷贝到 AIX JDK安装目录 jre lib fonts 目录下 2 如果是j
  • Pixel手机电信4G破解(含解锁BL和root)

    Pixel电信4G破解 由于谷歌没有支持电信 因此若想使用电信的网络就需要破解 仅支持欧洲版 其它版的可以试试 本文分为两种电信破解方式 第二种不需要格式化 要想破解电信 必须root 首先需要下载电脑的驱动 下载完成后还需要安装 方法 安
  • 学习笔记借助ChatGPT自动制作PPT

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 一 两步实现自动制作PPT 二 步骤 1 通过ChatGPT生成文本文档 2 借助MINDSHOW生成PPT 总结 一 两步实现自动制作PPT 文本内容生成 cha
  • Git基础操作:合并某个分支的一个commit到另一个分支

    有的时候不小心在错误的分支A上开发了一点代码 也已经提交了 这个时候如果想把这部分代码移到正确的分支B上可以如下操作 使用git log命令找到错误提交的那次commitid git log commit 8b19200eed045d5be
  • QT布局

    布局管理 以下是Qt手册中的 布局管理 的译文 在一个Widget中 Qt布局管理系统提供了一个简单而有效的方式来自动组织子widget 以保证他们能够很好地利用可用空间 介绍 Qt包含一个布局管理类的集合 它们被用来描述widgets如何
  • JSON的编写规则

    JSON的规则很简单 对象是一个无序的 名称 值 对 集合 一个对象以 左括号 开始 右括号 结束 每个 名称 后跟一个 冒号 名称 值 对 之间使用 逗号 分隔 规则如下 1 映射用冒号 表示 名称 值 2 并列的数据之间用逗号 分隔 名
  • 敏感性、特异度、α、β、阳性预测值(PPV)、阴性预测值(NPV)等指标及置信区间计算(附R语言代码)

    这个虽然简单但老是被绕进去 所以整理一下方便查阅 首先画一个2 2的混淆矩阵confusion matrix TP True positive 真阳性 FP False positive 假阳性 FN False negative 假阴性
  • 微信小程序存在的风险_浅谈微信小程序会中病毒事件

    小程序其实是云端数据 不在软件里 所以小程序没有进入的端口 所以华为的管家也检测不出来 但是你按照腾讯的方法收索的话 就等于默认开通小程序 把你的数据放到云端 同时你拥有的账号就绑定了一大堆应用程序 这些程序你永远也别想删除掉 除非不用那个
  • C语言学习(四)——字符串处理函数

    字符串处理函数 17个 1 gets include
  • Jmeter(十五) - 从入门到精通 - JMeter导入自定义的Jar包(详解教程)

    1 简介 原计划这一篇是介绍前置处理器的基础知识的 结果由于许多小伙伴或者童鞋们在微信和博客园的短消息中留言问如何引入自己定义的Jar包呢 我一一回复告诉他们和引入插件的Jar包一样的道理 一通百通 但是感觉他们还是很迷糊很迷惘 因此在这里
  • powerdesigner 创建物理结构视图

    PowerDesigner系列产品提供了一个完整的建模解决方案 业务或系统分析人员 设计人员 数据库管理员DBA和开发人员可以对其裁剪以满足他们的特定的需要 本系列将简单介绍PowerDesigner入门使用操作 若有不足或需要补充之处 欢
  • 深度学习环境配置9——Ubuntu下的tensorflow-gpu==2.4.0环境配置

    深度学习环境配置9 Ubuntu下的tensorflow gpu 2 4 0环境配置 注意事项 一 2022 09 04更新 学习前言 各个版本tensorflow2的配置教程 环境内容 环境配置 一 Anaconda安装 1 Anacon
  • 股票获取最大利润

    1 题目背景 给定一个数组 prices 它的第i个元素prices i 表示一支给定股票第i天的价格 你只能选择某一天买入这只股票 并选择在未来的某一个不同的日子卖出该股票 设计一个算法来计算你所能获取的最大利润 返回你可以从这笔交易中获
  • 操作中 "Chinese_PRC_CI_AS" 和 "Chinese_PRC_CI_AI" 之间的排序规则冲突 的解决办法

    最主要就一句话 在条件中不同排序规则的列后面加上 collate Chinese PRC CI AS 即可解决 有个需求 要求数据库系统自动同步两个不同数据库中的人员信息 首先想到写一个存储过程然后由系统任务来自动处理 尝试性的写了下面的查
  • H5实现高德地图的uni.chooseLocation

    在uniapp中获取当前定位和选择当前位置都是做了兼容 在各个平台都可以使用 这篇文章讲解如何定位当前位置 搜索位置 点击进行定位在H5中实现uni chooseLocation 如下图所示 左侧微信小程序的选择位置 右侧为高德地图在H5中
  • 微信小程序 修改三方组件中的自带样式

    众所周知 微信小程序会引用诸如vant weiui等三方组件 当我们想要对组件自带样式进行修改的时候该怎么做呢 1 在调试器中找到想要修改样式的组件的class类名 在对应的wxss中添加样式 此时样式未生效 2 官方文档中提到可以在ext
  • python写的串口助手并连接腾讯云服务器数据库

    结合上一期的基于pyqt5开发的图书管理系统UI 带登录页面 文章做一个此章节的补充 因为老师说需要结合数据库实现登录系统 于是我就想起了自己在腾讯云上买的一个服务器 因此经过百度查询大量的资料 功夫不负有心人 在这个Pyqt5实现的可视化
  • three.js展示obj模型

    利用three js展示obj模型 环境 必须是在web服务器中 下载objShow js
  • 【UART】Verilog实现UART接收和发送模块

    目录 写在前面 UART 工作原理 UART 接收部分 UART RX 模块图 UART RX 时序图 Verilog 实现 UART RX 模块 UART 发送部分 UART TX 模块图 UART TX 时序图 Verilog 实现 U