串行接口(UART)------verilog实现串口接收模块

2023-11-15

一、串口基本概念

串行接口(Serial port),主要用于串行式逐数据传输。常见的有一般计算机应用的RS-232(使用 25 针或 9 针连接器)和工业计算机应用的半双工RS-485全双工RS-422。----------维基百科

按照电气标准划分,串口可以分为RS-232-C、RS-422、RS-485。

RS-232-C:也称标准接口,是目前最常用的一种串行通讯接口。台式计算机一般有两个串行口:COM1和COM2,均为9针D形接口通常在计算机后面能看到,一般笔记本上有一个串口,超薄本除外。RS-232-C电气标准接口传输速率低,传输距离近。

RS-422:为改进RS-232-C传输距离近,传输速率低的特点,RS-422定义了一种平衡通信接口,传输速率提高到10Mb/s,并允许在一条接收总线上挂多个接收器。

RS-485:为扩展应用范围,EIA又于1983年在RS-422基础上制定了RS-485 标准,增加了多点、双向通信能力,即允许多个发送器连接到同一条总线上,同时增加了发送器的驱动能力和冲突保护特性,扩展了总线共模范围,后命名为 TIA/EIA-485-A标准。

 下图是串口公口实物图,在台式机和笔记本上一般都能找到。维基百科

串口公口
图1 串口公口

 2、串口传输时序-------参考【FPGA黑金开发板】Verilog HDL那些事儿--串口模块(十一)

图2  串口时序

 图2是串口传输数据的时序图,串口总线默认是高电平,一帧数据开始必须先拉低电平,对应图中起始位。串口传输数据是以数据包为单位的,一个数据包有11位,其中先传输起始位,紧接着传输8个数据位,数据位是按照由低到高的顺序进行传输的,接着传输校验位,最后传输停止位。

串口还有一个重要的参数就是波特率,一般用波特率来形容串口传输数据的速度。常用的波特率有9600bps和115200bps,本文主要介绍9600bps。bps:bit per second,就是每秒钟传输多少位;9600bps就是每秒钟传输9600位,对应的传输一位所用的时钟周期就是9600Hz。接下来本文参考《verilog那些事儿——建模篇》中串口模块的划分来实现串口的接收部分verilog代码。

3、串口接收分析

由于这里是串口接收模块的介绍,为简单考虑从串口外部输入的信号只考虑RX_data_in。由于串口接收数据有明显的先后顺序,因此可以使用状态机来描述串口接收数据过程。使用算法状态机描述串口接收过程如下图所示:

 

图3 算法状态机

图3中s0状态实现数据的初始化,start信号对应串口发送的起始位数据,使用沿检测电路实现;s2状态是接收8位有效数据状态,由于串口是串行将数据接收进来,然后转成并行数据,因此s1部分的电路可以用右移的移位寄存器实现(串口先发送低位数据,所以选用右移移位寄存器);图中虽然画出了s3状态执行校验功能,但是本代码不考虑检验问题,因此s3状态相当于是空状态;s4状态是串口接收数据完毕发出的标志信号。根据算法状态机可以看出,实现串口的接收所需要的基本电路有移位寄存器电路、计数器电路和触发器电路。

4、数据路径

图4 数据路径

 数据路径如图4所示,波特率定时信号的作用分析如下:

图5 FPGA接收数据过程

 由于FPGA的工作时钟较快,串口发送数据较慢。如图5所示,串口发送一位数据可能占用多个FPGA时钟周期,因此需要增加采样信号sampling_signal,采样信号有效时占一个时钟周期,在采样信号有效时,FPGA才接收数据,保证每位数据只接收一次。波特率定时计数器就是用来产生采样信号的,在波特率定时计数器计数到一定数据后,采样信号有效,否则,采样信号无效,这样就可以产生如图5所示的采样信号。

5、控制信号

图6  控制信号

图6给出了控制信号在哪个状态有效。在s0状态,移位寄存器和计数器加载0,D触发器使能信号en_b有效,检测串口发送的数据rx_pin_in的起始信号,待检测到起始信号后,start信号有效,进入s1状态,在s1状态使能波特率采样计时信号cnt_en,判断串口采样信号sinpling_signal是否有效,若有效,设置计数器使能信号有效,反之,设置计数器使能信号无效;在计数器cnt=1时,进入s2状态,此状态开始接收串口发送的8位数据位,首先使能波特率采样计时信号cnt_en,判断sinpling_signal是否有效,若有效,计数器使能信号和移位寄存器使能信号均设置为有效,反之,设置为无效;待8位数据位接收完毕后,进入s3状态,此时仍然使能波特率采样计时信号cnt_en,判断采样信号sinpling_signal是否有效,若有效,设置计数器使能信号有效,反之,设置无效。待计数器记到10时,进入s3状态,串口发送的11位信号接收完毕标志信号done拉高,此时仍然使能波特率采样计时信号cnt_en,判断sinpling_signal是否有效,若有效设置计数器使能信号有效,反之,设置无效。然后进入s0空闲状态,等待下一次数据接收。

6、verilog描述

接下来就可以使用verilog语言描述上述电路:

module RECEIVE_MODULE(input clk_in,
							 input rst,
							 input rx_pin_in,
							 output [7:0] rx_data,
							 output reg done,
							 output clk_50m
    );
//wire clk_50m;	 
clk_1 clk_1 (
    .CLKIN_IN(clk_in), 
    .CLKFX_OUT(clk_50m), 
    .CLKIN_IBUFG_OUT(CLKIN_IBUFG_OUT), 
    .CLK0_OUT(CLK0_OUT)
    );

parameter s0 = 'b00001;
parameter s1 = 'b00010;
parameter s2 = 'b00100;
parameter s3 = 'b01000;
parameter s4 = 'b10000;
reg[4:0]current_state = 'd0;
reg[4:0]next_state = 'd0;
//
wire start;
reg en_b;
reg cnt_en;
wire simpling_signal;
reg load_c;
reg en_c;
reg en_a;
reg load_a;
wire [3:0]count;
/
always @(posedge clk_50m or negedge rst)
	if(!rst)
		current_state <= s0;
	else
		current_state <= next_state;
/
always @(*)
	case(current_state)
		s0:	begin
			if(start)
				next_state = s1;
			else
				next_state = s0;
		end
		s1:	begin///起始位
			if(count == 'd1)
				next_state = s2;
			else
				next_state = s1;
		end
		s2:	begin///数据位
			if(count == 'd9)
				next_state = s3;
			else
				next_state = s2;
		end
		s3:	begin
			if(count == 'd10)
				next_state = s4;
			else
				next_state = s3;
		end
		s4:	begin
			if(count == 'd0)
				next_state = s0;
			else
				next_state = s4;
		end
		default:next_state = s0;			
	endcase
/
always @(*)
	case(current_state)
		s0:	begin
			en_b = 'd1;
			load_a = 'd1;
			load_c = 'd1;
			cnt_en = 'd0;
			en_a = 'd0;
			en_c = 'd0;
			done = 'd0;
		end
		s1:	begin
			en_b = 'd1;
			load_a = 'd0;
			load_c = 'd1;
			cnt_en = 'd1;
			en_c = 'd0;
			done = 'd0;
			if(simpling_signal)	begin
				en_a = 'd1;
			end
			else	begin
				en_a = 'd0;
			end
		end
		s2:	begin
			en_b = 'd0;
			load_a = 'd0;
			load_c = 'd0;
			cnt_en = 'd1;
			done = 'd0;
			if(simpling_signal)	begin
				en_c = 'd1;
				en_a = 'd1;
			end
			else	begin
				en_c = 'd0;
				en_a = 'd0;
			end
		end
		s3:	begin
			en_b = 'd0;
			load_a = 'd0;
			load_c = 'd0;
			cnt_en = 'd1;	
			en_c = 'd0;
			done = 'd0;
			if(simpling_signal)
				en_a = 'd1;
			else
				en_a = 'd0;
		end
		s4:	begin
			en_b = 'd0;
			load_a = 'd0;
			load_c = 'd0;
			cnt_en = 'd1;	
			en_c = 'd0;
			done = 'd1;
			if(simpling_signal)
				en_a = 'd1;
			else
				en_a = 'd0;			
		end
		default:	begin
			en_b = 'd0;
			load_a = 'd0;
			load_c = 'd0;
			cnt_en = 'd0;
			en_a = 'd0;
			en_c = 'd0;
			done = 'd0;
		end
	endcase
// Instantiate the module
edge_detection edge_detection (
    .clk_50m(clk_50m), 
    .en_b(en_b), 
    .rx_pin_in(rx_pin_in), 
    .start(start)
    );
// Instantiate the module
BPS_TIMER BPS_TIMER (
    .clk_50m(clk_50m), 
    .cnt_en(cnt_en), 
    .simpling_signal(simpling_signal)
    );
// Instantiate the module
right_shifter right_shifter (
    .clk_50m(clk_50m), 
    .load_c(load_c), 
    .en_c(en_c), 
    .rx_pin_in(rx_pin_in), 
    .rx_data(rx_data)
    );
// Instantiate the module
COUNT_NUM COUNT_NUM (
    .clk_50m(clk_50m), 
    .load_a(load_a), 
    .en_a(en_a), 
    .count(count)
    );
endmodule

 边沿检测模块代码:

module edge_detection(input clk_50m,
							 input en_b,
							 input rx_pin_in,
							 output start
    );
reg rx_pin_in_1 = 'd0;
always @(posedge clk_50m)
	if(en_b)
		rx_pin_in_1 <= rx_pin_in;
	else
		rx_pin_in_1 <= rx_pin_in_1;
		
assign start = (!rx_pin_in) & rx_pin_in_1;

endmodule

 波特率定时模块代码:

由于使用的时钟是50mhz的,而串口的波特率是9600bps,即串口发送数据的时钟是9600hz,因此需要使用50mhz的时钟产生个计数器,
///使其每1/9600s产生一个允许采样脉冲。
//计数器大小设置:500*10^3/96 = 5208,\,因此计数器需要计数5208个数,由于在数据中间在中间时刻更稳定,因此,在5208/2=2604时对数据进行采样更准确,
//由于计数是从零开始,因此在2603时对数据进行采样,数据计数到5207清零。
//
module BPS_TIMER(input clk_50m,
					  input cnt_en,
					  output simpling_signal
    );
reg [12:0] cnt = 'd0;
always @(posedge clk_50m)
	if(cnt_en)	begin
		if(cnt == 'd5207)
			cnt <= 'd0;
		else
			cnt <=  cnt + 'd1;
	end
	else
		cnt <= 'd0;
assign simpling_signal = (cnt == 'd2603)?'b1:'b0;
endmodule

 右移寄存器模块代码:

//此模块用于将串行发送的数据转成并行接收
//
module right_shifter(input clk_50m,
							input load_c,
							input en_c,
							input rx_pin_in,
							output reg[7:0]rx_data
    );
always @(posedge clk_50m)
	if(load_c)
		rx_data <= 'd0;
	else if(en_c)
		rx_data <= {rx_pin_in,rx_data[7:1]};
	else
		rx_data <= rx_data;
endmodule

 计数器模块代码:

module COUNT_NUM(input clk_50m,
					  input load_a,
					  input en_a,
					  output reg [3:0]count
    );
always @(posedge clk_50m)
	if(load_a)
		count <= 'd0;
	else if(en_a)	begin
		if(count == 'd10)
			count <= 'd0;
		else
			count <= count + 'd1;
	end
	else
		count <= count;
		
endmodule

 仿真激励文件代码:

module test;

	// Inputs
	reg clk_in;
	reg rst;
	reg rx_pin_in = 'd1;

	// Outputs
	wire [7:0] rx_data;
	wire done;
	wire clk_50m;

	// Instantiate the Unit Under Test (UUT)
	RECEIVE_MODULE uut (
		.clk_in(clk_in), 
		.rst(rst), 
		.rx_pin_in(rx_pin_in), 
		.rx_data(rx_data), 
		.done(done),
		.clk_50m(clk_50m)
	);

	initial begin
		// Initialize Inputs
		clk_in = 0;
		rst = 0;
		rx_pin_in = 1;

		// Wait 100 ns for global reset to finish
		#100;
		// Add stimulus here

	end
	reg clk1= 'd1;
      always #5 clk_in = ~clk_in;
		
	reg [15:0]cnt = 'd0;
	always @(posedge clk_50m)
		if(cnt>0)
			rst <= 'd1;
		else
			rst <= rst;
			
		always @(posedge clk_50m)
			if(cnt == 'd60000)/'d57287
				cnt <= 'd0;
			else
				cnt <= cnt + 'd1;
		always @(posedge clk_50m)
			if(cnt>'d10&&cnt<='d5208)
				rx_pin_in <= 'd0;//1
			else if(cnt>='d5208&&cnt<='d10415)
				rx_pin_in <= 'd1;//2
			else if(cnt>='d10416&&cnt<='d15623)
				rx_pin_in <= 'd0;3
			else if(cnt>='d15624&&cnt<='d20831)
				rx_pin_in <= 'd1;///4
			else if(cnt>='d20832&&cnt<='d26039)
				rx_pin_in <= 'd0;5
			else if(cnt>='d26040&&cnt<='d31247)
				rx_pin_in <= 'd1;///6
			else if(cnt>='d31248&&cnt<='d36455)
				rx_pin_in <= 'd0;///7
			else if(cnt>='d36456&&cnt<='d41663)
				rx_pin_in <= 'd1;///8
			else if(cnt>='d41664&&cnt<='d46871)
				rx_pin_in <= 'd1;///9
			else if(cnt>='d46872&&cnt<='d52079)
				rx_pin_in <= 'd1;///10
			else if(cnt>='d52080&&cnt<='d57287)
				rx_pin_in <= 'd1;///11
endmodule

Isim行为仿真结果:

图7 仿真结果

从仿真波形中可以看出,当串行发送信号 01010101111时,在done信号拉高时接收数据完毕,显示接收的数据是11010101。因此,从仿真上看串口的接收可以正常工作。

 

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

串行接口(UART)------verilog实现串口接收模块 的相关文章

  • Flutter

    前言 Image 是 Flutter 用于显示图像的小组件 它可以加载网络 本地 文件或者内存中的图像 支持 JPEG PNG GIF 动画 GIF WebP 动画 WebP BMP 和 WBMP 格式 Flutter Image 本身也实
  • springboot如何集成redis哨兵集群?

    前言 redis主从集群和redis sentinel集群都配置完毕了 现在我们需要了解spring boot 如何连接上该集群 才能用上这两个集群带来的便利 本章内容 为什么需要关注这个问题 怎么配置 记住 本章是针对redis已经配置了
  • Spark的新方案UnifiedMemoryManager内存管理模型分析

    StaticMemoryManager继承与MemoryManager 它是静态的内存分配 是1 6版本以前的实现 就像是建筑商建造好了房子 用户来到直接住进去就好了 弊端 有的人多住了小房子 有的人少住了大房子 而UnifiedMemor
  • neo4j下载安装配置步骤

    目录 一 介绍 简介 Neo4j和JDK版本对应 二 下载 官网下载 直接获取 三 解压缩安装 四 配置环境变量 五 启动测试 一 介绍 简介 Neo4j是一款高性能的图数据库 专门用于存储和处理图形数据 它采用节点 关系和属性的图形结构
  • linux安装服务器步骤,Linux服务器的安装配置流程

    不积跬步无以至千里 贴士 因为是装在Ubuntu系统上 其中有几个常用的命令告诉大家 下面在操作中你也会见到如下等命令 sudo gedit 文件目录对某个文件进行编辑和vi命令差不多 因为好多系统文件是只读的 可通过此方式来进行编辑修改
  • k8s六

    参考资料 从Docker到Kubernetes进阶 阳明 这里写目录标题 一 StatefulSet的设计原理 二 有状态服务的拓扑状态 三 有状态服务的存储状态 四 使用StatefulSet控制器部署ES集群 1 创建无头服务 2 部署
  • 华为云云耀云服务器L实例评测|在Docker环境下部署Mysql数据库

    华为云云耀云服务器L实例评测 在Docker环境下部署Mysql数据库 一 前言 1 1 云耀云服务器L实例简介 1 2 Mysql数据库简介 二 本次实践介绍 2 1 本次实践简介 2 2 本次环境规划 三 购买云耀云服务器L实例 3 1
  • vagrant加virtualbox轻松搭建k8s集群脚本

    文章目录 环境准备 配置k8s节点 环境准备 windows 电脑上使用vagrant 加 virtualbox 搭建k8s 集群 不熟悉vagrant 与 virtualbox 的可以查看这篇文章 使用VirtualBox和Vagrant
  • 由ValueError: not enough values to unpack (expected 2, got 1)报错说开去

    一 背景 今日做了一个文本分类任务 在更换对应的语料库的时候 处理完的语料报了个如题的错误 究其原因 这里用到了一个split t 作为content和label的分割 也就是在语料库中使用 t作为语料库中句子和标签的分隔符 但是在我写下
  • 基于Pytorch框架的ResNet:MNIST数据集手写数字识别

    Debug经验总结 一 常规ResBlock的输出尺寸与输入尺寸相同 否则需要进行尺寸变换 二 在数据集较大时设置num work进行多线程处理 可以很大提高训练效率 三 较复杂的网络在搭建前可以先用草图计算每个输出位置的矩阵尺寸 减少De
  • C++ opencv 识别火焰 (代码)

    brief 火焰识别
  • Java中anyMatch()、allMatch()、noneMatch()用法详解

    说明 anyMatch 匹配到任何一个元素和指定的元素相等 返回 true allMatch 匹配到全部元素和指定的元素相等 返回 true noneMatch 与 allMatch 效果相反 验证 一 anyMatch 1 正常匹配 多元
  • 解决mac下每次git pull/push都需要输入密码的问题

    首先本身项目是走ssh克隆下来的 之前也配置过密钥 按理来说不应该出现这样的问题 在日常开发过程中突然需要我输入密码 小朋友你是否有很多问号 在经过多方面资料查找与解决方案尝试后终于找到了原因 背后的黑手是系统升级了 在升级为macOS c
  • Mysql-提示java.sql.SQLException: Cannot convert value '0000-00-00 00:00:00' from column 7 to TIMESTAMP...

    在Mysql数据库中使用DATETIME类型来存储时间 使用JDBC中读取这个字段的时候 应该使用 ResultSet getTimestamp 这样会得到一个java sql Timestamp类型的数据 在这里既不能使用 ResultS
  • Shader学习笔记:BRDF简单概述

    这篇文章写于一年多以前的一次课程作业 这次作为一个 存货 给放出来 仅仅只是针对代码和一些要点进行简单叙述 如果想听完整的版本 请搜索毛星云大神的博客或者书籍 关于基本的物理渲染公式 网络上的博客和典籍已经多如牛毛了 这里只是自己在之前整理
  • 统计学习之方差分析

    零 案例说明 为了检验某小学六年级教学质量的差异 从该小学六年级的三个班级中分别选取一定数量的学生 分成三个组 三个样本 对他们期末考试的平均分进行统计分析 如果实验显示每个每组的均值相同 即三个班期末考试的成绩差异不大 则表明该小学六年级
  • chatgpt赋能python:Python题目搜索软件:提升你的编程水平

    Python题目搜索软件 提升你的编程水平 对于那些喜欢编程的人来说 学习Python是一个非常不错的选择 但是 学习Python的难度并不小 需要大量的时间和精力 一个好的学习方式是通过完成Python编程题目来加深对该编程语言的理解 但
  • firebug 调试ajax,Jquery使用Firefox FireBug插件调试Ajax步骤讲解

    首先 我们用一个示例来说明JQuery的Ajax调用过程 实现的一个功能是 点击确认支付按钮之后 实现余额支付的功能 1 首先在php页面将相关需要调用的函数绑定到按钮上 function pay btn bind click ABC ba
  • qq引流有哪些模式? QQ引流的几种方法

    现在做QQ营销的方法真的是太多了 花样百出 什么招式都有的 QQ作为我们常用的交流工具 用于营销也是无可厚非的事情 现在做互联网的 永远离不开两个话题 就是 流量 和 变现 缺少其中一个 你所做的所有事情就完全没有任何意义 1 QQ空间引流
  • Mysql 多表关联查询

    文章目录 1 Mysql中表之间的关系 1 1 多表关系 1 2 外键约束 2 多表联合查询 2 1 交叉连接查询 笛卡尔积 2 2 内连接查询 inner join 2 3 外连接查询 2 3 1 左连接 2 3 2 右连接 2 3 4

随机推荐

  • 【接口测试 】Day3-Postman高级用法1(附项目实战)

    目录 课程大纲 昨日回顾 今日目标 Postman高级用法1 一 用例管理 二 Postman断言 三 环境变量与全局变量 四 请求前置脚本 了解 五 Postman关联 重点 课程大纲 接口测试 Day1 接口测试基础 附项目实战 小慌慌
  • 父页面调用easyui datagrid

    opener tt datagrid insertRow index 0 row name name
  • 关于kerberos使用keytab安全认证连接hive票据过期的问题及解决方法。

    关于kerberos使用keytab安全认证连接hive票据过期的问题及解决方法 问题描述 解决方法 问题描述 本人在使用HiveStreaming的过程中 使用kerberos keytab进行安全验证 程序会保持长期连接 hive jd
  • 动手强化学习(六):DQN 算法

    动手强化学习 六 DQN 算法 1 简介 2 CartPole 环境 3 DQN 3 1 经验回放 3 2 目标网络 4 DQN 代码实践 5 以图像为输入的 DQN 算法 6 小结 文章转于 伯禹学习平台 动手学强化学习 强推 本文所有代
  • 5.1-集成学习

    文章目录 集成框架 Framework of Ensemble 一 Ensemble Bagging 1 1 决策树 Decision Tree 1 2 随机森林 Random Forest 二 Ensemble Boosting 2 1
  • 大模型的普及与应用,数据保护非常重要

    随着AI技术的不断发展和应用 大模型已经成为了AI领域中的一个热门话题 随着大模型的应用越来越广泛 保护隐私和数据安全的重要性也越来越突出 隐私和数据安全不仅仅是技术要求 更是对个人权利和社会发展的必然需求 在AI大模型的应用中 数据是非常
  • ROS机械臂正逆运动学

    这里做一个六轴机械臂用于正逆运动学实验 这里其实一共只有3轴 只有3轴位置没有姿态 所以urdf文件里我在末端做了3个虚拟关节 以便将kdl的frame能够填满 使得齐次坐标变换是规则的 1 urdf建模
  • I2C学习

    参考链接 I2C基础知识学习 主机向从机写数据的过程 1 start信号 2 从机地址 7位地址 3 读写位 一位读写 R W 位 0 写 1 读 4 等待从机应答信号 5 当主机收到从机的应答信号 然后发送访问的从机寄存器地址 6 再次等
  • HTTP协议各个版本之间区别?

    HTTP协议各个版本之间区别 1 区别 2 持久连接 3 管线化 4 持久连接和管线化区别 5 分块传输编码 6 二进制协议 7 多路复用 7 1多路复用与管线话和持久连接的区别 7 2多路复用是如何实现在同一个TCP连接上同时发送多个HT
  • 如何在DSP CCS开发环境中添加VLIB图像处理的库

    CCS Version 5 5 0 00077 VLIB VLIB Function Reference Release 3 3 2 0
  • IDEA使用手册之Java Web项目 debug调试方法

    点击图中按钮开始运行web工程 启动成功 设置断点 通过浏览器发送请求 请求发送之后会自动跳到断点处 并且在断点之前会有数据结果显示 按F8 在 Debug 模式下 进入下一步 如果当前行断点是一个方法 则不进入当前方法体内 跳到下一条执行
  • IDEA插件系列(11):Translation插件——翻译插件

    1 插件介绍 可以翻译词汇 语句 十分方便 2 安装方式 第一种安装方式是使用IDEA下载插件进行安装 第二种方式是使用离线插件进行安装 插件下载地址 http plugins jetbrains com plugin 8579 trans
  • vscode 方法代码块的注释生成方法

    1 安装插件 Document This 2 将光标放置于function上面 快捷键是 Ctrl Alt D 加 Ctrl Alt D 注 vue里的method方法中的function用这个不行 单独的一个文件中可以 类似下面的代码 获
  • ElasticSearch7.6入门学习笔记

    在学习ElasticSearch之前 先简单了解一下Lucene Doug Cutting开发 是apache软件基金会4 jakarta项目组的一个子项目 是一个开放源代码的全文检索引擎工具包 不是一个完整的全文检索引擎 而是一个全文检索
  • ApiPost使用教程

    怎样先新建一个简单的接口 首先打开ApiPost界面点击新建 选择POST请求 输入url 请求参数选择json 输入对应的请求参数 点击发送 就可以请求成功啦 当然我们点击右侧保存 就可以保存该接口 并且左侧可以出现该保存的结果目录 如何
  • 我用js写了一个,除夕烟花秀和春节随机祝福语

    项目截图 进入后的界面 点击按钮 点击之后的动画 烟花结束后的界面 代码实现 涉及的技术 HTML5多媒体 CSS定位 动画 js面向对象 Jquery动画 事件 首先来看HTML代码
  • [原创]脚本小技巧:awk变量传递到shell变量

    简介 常用网名 猪头三 出生日期 1981 XX XX 个人网站 https www x86asm org QQ交流 643439947 编程生涯 2001年 至今 共20年 职业生涯 18年 开发语言 C C 80x86ASM PHP P
  • MySQL数据库的性能优化及自动化运维与Mysql高并发优化详细教程

    首先 我们来看看DBA的具体工作 我觉得 DBA 真的很忙 备份和恢复 监控状态 集群搭建与扩容 数据迁移和高可用 这是我们 DBA 的功能 了解这些功能以后要对体系结构有更加深入的了解 你不知道怎么处理这些故障和投诉的事情 所以我们要去了
  • 剑指offer 学习笔记 最长不含重复字符的子字符串

    面试题48 最长不含重复字符的子字符串 请从字符串中找出一个最长的不包含重复字符的子字符串 计算该最长子字符串的长度 假设字符只包含 a z 的字符 如在字符串 arabcacfr 中 最长的不含重复字符的子字符串是 acfr 长度为4 我
  • 串行接口(UART)------verilog实现串口接收模块

    一 串口基本概念 串行接口 Serial port 主要用于串行式逐位数据传输 常见的有一般计算机应用的RS 232 使用 25 针或 9 针连接器 和工业计算机应用的半双工RS 485与全双工RS 422 维基百科 按照电气标准划分 串口