【FPGA学习】状态机实现UART通信

2023-10-27


前言

  在之前的文章中【FPGA学习】实例一、Cyclone IV串口通信(RS232)我们已经能够采用波形图的方法,实现9600bps的Uart通信。近期笔者在整理了状态机和计数器组合的设计方法以后,对状态机的设计又有了新的感悟和体会,所以又把经典的RS232协议拉出来当状态机的例子练手了哈哈哈。数据有效位为8bit,功能上增加了奇校验,并将波特率设置为115200bps,并借助这篇文章梳理一下状态机和计数器组合设计的思路和设计要点,文章奉上:


一、数据帧结构

在这里插入图片描述
  含校验位的RS232数据帧结构如上图所示,其中三个单元格为一个数据帧,数据有效为8bit 空闲状态下,rx信号为高电平,rx拉低一帧作为起始位。接下来按照数据位由低到高每一帧输出一位数据,发送到最高位Data[7]以后,有效数据发送完毕。
  接着PARITY为数据校验位。本文采用奇校验,即判断是否数据位和校验位的1的数量之和是否为奇数,若为奇数则满足奇校验,否则就认为数据在传输过程中出现了错误,从而将本次的8bit 数据丢弃。
  奇校验帧结束后为停止位,将rx拉高一帧作为结束信号,等待下一组数据传入。

二、接收模块

  接收模块是将接收到的串行数据转换为并行数据的模块,并同步输出一个数据有效使能信号。
  首先因为系统晶振为50MHz,串口的波特率为115200bps,因此每一帧数据所需时钟周期数为N = (1/115200)/(1/50000000) = 434,所以每一帧数据需要借助一个计数器判断当前的位数,该计数器计数到433后清零,采用组合逻辑赋值baud_max,当计数到433计满清零时拉高。
  接下来结合时序图介绍笔者的状态机部分设计思路:

2.1 状态设置

  接收模块状态机状态共包含IDLE、START、DATA、PARITY、STOP、WAIT六个状态,前五个状态望文生义即可,而WAIT状态是在校验位校验错误以及停止位没有读取到高电平时进入到的状态,意味着本次读取的8bit 数据是失效的,当在此状态下识别到停止位后直接进入IDLE状态,不进行数据的输出。

2.1 状态跳转

  状态机采用三段式的写法,比特率计数器baud_cntnext_state == DATA或者next_state == PARITY时进行循环计数(见时序图)。由于计数器慢一拍,所以进入状态DATA以后,baud_cnt从1开始计数,计数一帧即434个周期后,计数值为0,因此baud_cnt==0作为每一个状态跳转的必要条件(也保证了未开始计数时IDLE状态能在识别到起始位后直接进入到START状态)。
  START状态满足一帧时间就跳转到DATA状态,为了表征当前是数据的第几帧,引入帧计数器bit_cnt,该计数器在next_state == DATA或者next_state == PARITY时进行循环计数(见时序图),识别到帧结束信号baud_max==1以后,自加1。其他状态下,帧计数器清零。

2.2 奇校验

  由于帧计数器也慢实际数据一拍,和状态变化同步,因此判断校验位时,校验位相对于实际数据在第9帧。帧计数器慢一拍,所以当bit_cnt==8 && baud_max==1时对校验位进行判断。本文的奇数校验方式为判断parity == ~(^po_data) 是否成立,若成立,则校验位和数据位中1的个数之和为奇数(见时序图)。其中po_data为进行移位拼接后,准备并行输出的8位宽数据。
  满足校验位则进入校验位状态PARITY1帧,识别到停止位就进入到STOP状态。

在这里插入图片描述
在这里插入图片描述

2.3 数据输出

  接收模块的数据即为拼接结束以后的并行输出数据,并同步输出一个使能信号,在使能信号拉高时的数据信号才有效。因为是要把数据拼接为8位宽的数据,要保证移位8次,并且每次移位时数据正确,设置了移位标志信号shiftshift信号当波特率计数器计数到一帧的一半时state == DATA && baud_cnt == BAUD_CNT_MAX / 2拉高信号(见代码数据移位输出部分),此时数据稳定,并且在校验位前就可将八位数据移位完成,同时满足奇校验要求。又由于STOP状态只要发生错误就不会进入,保证了数据的正确性,所以选择当state==STOP时输出数据有效使能信号,并输出拼接完成的并行数据po_data。完整代码如下:

// *****************************************************************************************************************************
// ** 作者 : 彼方云城                                                  
// ** 邮箱 : zwr2059341302@163.com
// ** 博客 : https://blog.csdn.net/weixin_45451974?spm=1000.2115.3001.5343
// ** 日期 : 2022/10/10
// ** 功能 : 1、串口接收模块,接收串行数据,转换成并行数据输出
//            2、8bit数据(先接受低字节数据,再接收高字节数据),奇校验(不可在宏定义处删除奇校验)
// *****************************************************************************************************************************
module uart_rx_fsm
#(
    parameter   BAUD        =   115200   ,  //串口波特率
                CLK_FREQ    =   50_000_000, //时钟周期
                BAUD_CNT_MAX = CLK_FREQ / BAUD  //每帧数据对应的时钟周期
)
(
    //系统接口
    input   wire            sys_clk     ,
    input   wire            sys_rst_n   ,

    //输入数据
    input   wire            in_data     ,

    //输出数据
    output  reg     [7:0]   po_data     ,
    output                  po_flag     
);

//in_data_reg同步数据,in_data_reg1和in_data_reg2打两拍减小亚稳态
//in_data_reg2为稳定数据
reg     in_data_reg     ;
reg     in_data_reg1    ;
reg     in_data_reg2    ;

always@(posedge sys_clk or negedge sys_rst_n)begin
    if(!sys_rst_n)begin
        in_data_reg <=  1'b1;
        in_data_reg1 <= 1'b1;
        in_data_reg2 <= 1'b1;
    end
    else begin
        in_data_reg  <= in_data;
        in_data_reg1 <= in_data_reg;
        in_data_reg2 <= in_data_reg1;
    end
end

//**********************状态机********************//

parameter   IDLE = 3'd0,START = 3'd1,DATA = 3'd2;
parameter   PARITY = 3'd3,WAIT = 3'd4,STOP = 3'd5;

reg [2:0]   state,next_state;

//状态机状态转换
always@(posedge sys_clk or negedge sys_rst_n)begin
    if(!sys_rst_n)begin
        state <=    IDLE;
    end
    else begin
        state <=    next_state;
    end
end

//波特率计数器及计满脉冲信号
reg     [9:0]   baud_cnt;
wire            baud_max;

always@(posedge sys_clk or negedge sys_rst_n)begin
    if(!sys_rst_n)begin
        baud_cnt <= 10'd0;
    end
    else if(baud_cnt == BAUD_CNT_MAX - 1'b1)begin
        baud_cnt <= 10'd0;
    end
    else if(next_state==START || next_state==DATA 
            || next_state==PARITY || next_state==STOP)begin
        baud_cnt <= baud_cnt + 1'b1;
    end
end

assign baud_max = (baud_cnt == 10'd0);

//起始位及结束位标志信号
wire        start;
wire        stop;

assign start    = (in_data_reg2 == 1'b0) & baud_max;
assign stop     = (in_data_reg2 == 1'b1) & baud_max;

//bit位计数器
reg     [3:0]   bit_cnt;
wire            bit_done;//计数到8时拉高

always@(posedge sys_clk or negedge sys_rst_n)begin
    if(!sys_rst_n)begin
        bit_cnt <= 4'd0;
    end
    else if(next_state == DATA & bit_cnt == 4'd9 & baud_max)begin
        bit_cnt <= 4'd0;
    end
    else if((next_state == DATA || next_state == PARITY)&& baud_max)begin
        bit_cnt <= bit_cnt + 1'b1;
    end
    else if(next_state == DATA)begin
        bit_cnt <= bit_cnt;
    end
    else begin
        bit_cnt <= 4'd0;
    end
end

assign bit_done = (bit_cnt == 4'd8);

//奇校验位
wire    parity;

assign  parity  =  baud_max && bit_done && in_data_reg2 == ~(^po_data);
//*******当奇校验位与数据奇数相反时数据正确

//状态机下一状态描述
always@(*)begin
    case(state)
        IDLE    :   next_state = start?START:IDLE;
        START   :   next_state = baud_max?DATA:START;
        DATA    :   next_state = (bit_done&baud_max)?(parity?PARITY:WAIT):DATA;
        PARITY  :   next_state = baud_max?(stop?STOP:WAIT):PARITY;
        WAIT    :   next_state = baud_max?(stop?STOP:WAIT):WAIT;
        STOP    :   next_state = baud_max?(start?START:IDLE):STOP;
        default :   next_state = IDLE;
    endcase
end

//数据移位标志信号
wire    shift;

assign  shift   = (next_state == DATA && baud_cnt == BAUD_CNT_MAX/2);
//当数据在波特率计数器满值一半时提取

//状态机输出及数据有效使能信号
always@(posedge sys_clk or negedge sys_rst_n)begin
    if(!sys_rst_n)begin
        po_data <= 8'd0;
    end
    else if(shift)begin
        po_data <= {in_data_reg2,po_data[7:1]};
    end
    else begin
        po_data <= po_data;
    end
end

//输出同步使能信号
assign  po_flag = (state==STOP);

endmodule

三、发送模块

  发送模块主要是将接受到的并行多位宽数据以串行形式RS232的协议发出,接下来结合时序图和状态转移图介绍发送模块状态机实现的设计思路:

3.1 状态跳转

  发送模块的状态去除了WAIT状态,同样采用一个波特率计数器对一帧对应的434个时钟周期进行计数,baud_cnt以及baud_max作为每帧的时钟计数信号和跳转信号,初始状态为IDLE,接收到pi_flag后跳转为START状态,经过一帧跳转到DATA状态,进入到DATA状态后,用计数器bit_cnt来计数数据帧数,计满8位数据后跳转到校验位状态PARITY,校验位采用parity_data = (state==PARITY)?(~(^pi_data)):1'b0;进行赋值,仅在校验位状态下将校验位数据赋值为原数据缩减异或运算的取反。一帧后进入STOP状态,输出1帧高电平。随后判断是否有输入使能,有就跳转到START状态,否则进入IDLE状态,等待下一个有效数据使能信号。
在这里插入图片描述
在这里插入图片描述

3.2 数据输出

  发送模块数据的输出采用组合逻辑输出的方式,因为延迟next_state一拍的帧计数器bit_cnt和当前状态state同步,所以可以在DATA状态下用计数器来读取并输出采集数据的由低到高的不同位,而在START状态输出低电平,STOP状态输出高电平,其他状态均为空闲状态的高电平。完整代码如下:

// *****************************************************************************************************************************
// ** 作者 : 彼方云城                                                  
// ** 邮箱 : zwr2059341302@163.com
// ** 博客 : https://blog.csdn.net/weixin_45451974?spm=1000.2115.3001.5343
// ** 日期 : 2022/10/13
// ** 功能 : 1、串口发送模块,接收并行数据,读取数据后串行输出
//            2、8bit数据(先接受低字节数据,再接收高字节数据),奇校验(不可在宏定义处删除奇校验)
//            3、波特率115200
// *****************************************************************************************************************************
module  uart_tx_fsm
#(
    parameter   BAUD        =   115200   ,  //串口波特率
                CLK_FREQ    =   50_000_000, //时钟周期
                BAUD_CNT_MAX = CLK_FREQ / BAUD  //每帧数据对应的时钟周期
)
(
    //系统接口
    input   wire            sys_clk     ,
    input   wire            sys_rst_n   ,

    //输入数据及同步信号
    input   wire    [7:0]   pi_data     ,
    input   wire            pi_flag     ,
    
    //输出串行数据
    output  reg             out_data     
);

//**********************状态机********************//

parameter   IDLE = 3'd0,START = 3'd1,DATA = 3'd2;
parameter   PARITY = 3'd3,STOP = 3'd4;

reg [2:0]   state,next_state;

//状态机状态转换
always@(posedge sys_clk or negedge sys_rst_n)begin
    if(!sys_rst_n)begin
        state <=    IDLE;
    end
    else begin
        state <=    next_state;
    end
end

//波特率计数器及计满脉冲信号
reg     [9:0]   baud_cnt;
wire            baud_max;

always@(posedge sys_clk or negedge sys_rst_n)begin
    if(!sys_rst_n)begin
        baud_cnt <= 10'd0;
    end
    else if(baud_cnt == BAUD_CNT_MAX - 1'b1)begin
        baud_cnt <= 10'd0;
    end
    else if(next_state==START || next_state==DATA 
            || next_state==PARITY || next_state==STOP)begin
        baud_cnt <= baud_cnt + 1'b1;
    end
end

assign baud_max = (baud_cnt == 10'd0);

//起始位及结束位标志信号
wire        start;//进入start状态

assign start    =   pi_flag;

//bit位计数器
reg     [3:0]   bit_cnt;

always@(posedge sys_clk or negedge sys_rst_n)begin
    if(!sys_rst_n)begin
        bit_cnt <= 4'd0;
    end
    else if((next_state == DATA || next_state == PARITY)&& baud_max)begin
        bit_cnt <= bit_cnt + 1'b1;
    end
    else if(next_state == DATA || next_state == PARITY)begin
        bit_cnt <= bit_cnt;
    end
    else begin
        bit_cnt <= 4'd0;
    end
end

//奇校验位数据
wire    parity;
wire    parity_data;

assign  parity  =   (bit_cnt==4'd8) && baud_max;
assign  parity_data  =  (state==PARITY)?(~(^pi_data)):1'b0;
//*******仅在PARITY状态下有效

//状态机下一状态描述
always@(*)begin
    case(state)
        IDLE    :   next_state  =   start?START:IDLE;
        START   :   next_state  =   baud_max?DATA:START;
        DATA    :   next_state  =   parity?PARITY:DATA;
        PARITY  :   next_state  =   baud_max?STOP:PARITY;
        STOP    :   next_state  =   baud_max?(start?START:IDLE):STOP;
        default :   next_state  =   IDLE;
    endcase
end

//状态机输出
always@(*)begin
    case(state)
        START   :   out_data    =   1'b0;
        DATA    :   out_data    =   pi_data[bit_cnt - 1'b1];
        PARITY  :   out_data    =   parity_data;
        STOP    :   out_data    =   1'b1;
        default :   out_data    =   1'b1;
    endcase
end

endmodule

四、顶层模块

实例化连接两个模块,代码如下:

// *****************************************************************************************************************************
// ** 作者 : 彼方云城                                                  
// ** 邮箱 : zwr2059341302@163.com
// ** 博客 : https://blog.csdn.net/weixin_45451974?spm=1000.2115.3001.5343
// ** 日期 : 2022/10/14
// ** 功能 : 1、RS232协议顶层模块
//            2、实例化接收模块和发送模块,并组成串口回环
//            3、波特率115200
// *****************************************************************************************************************************

module  rs232_fsm(

//系统接口
    input   sys_clk     ,
    input   sys_rst_n   ,
    
//输入串行数据
    input   in_data     ,

//输出串行数据
    output  out_data    
);

wire    [7:0]   po_data;
wire            po_flag;

uart_rx_fsm
#(
    .BAUD        (115200    ),  //串口波特率
    .CLK_FREQ    (50_000_000) //时钟周期
)
uart_rx_fsm_inst
(
    //系统接口
    .sys_clk     (sys_clk  ),
    .sys_rst_n   (sys_rst_n),

    //输入数据
    .in_data     (in_data),

    //输出数据
    .po_data     (po_data),
    .po_flag     (po_flag)
);

uart_tx_fsm
#(
    .BAUD        (115200    ),  //串口波特率
    .CLK_FREQ    (50_000_000) //时钟周期
)
uart_tx_fsm_inst
(
    //系统接口
    .sys_clk     (sys_clk  ),
    .sys_rst_n   (sys_rst_n),

    //输入数据及同步信号
    .pi_data     (po_data),
    .pi_flag     (po_flag),
    
    //输出串行数据
    .out_data     (out_data)
);

endmodule

  将串口接收模块和发送模块直接相连,形成一个串口回环,并上板进行验证,验证结果如下,输入数据"112256478ff",设置波特率为115200,数据位8,校验位为奇校验,发送后返回数据与输入数据相同,可知模块设计无误。
在这里插入图片描述

总结

  本文采用状态机和计数器组合的方式实现了RS232协议,在代码中笔者也采用了将时序逻辑中较为复杂的条件判断条件以组合逻辑的形式单独列出来的方式,的确使得状态机的转变条理更加清晰,也易于修改拓展了,笔者能力尚浅,还请读者多多指正!

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

【FPGA学习】状态机实现UART通信 的相关文章

  • verilog 中的“<<”运算符

    我有一个verilog代码 其中有一行如下 parameter ADDR WIDTH 8 parameter RAM DEPTH 1 lt lt ADDR WIDTH 这里将存储什么RAM DEPTH以及什么是 lt lt 操作员在这里做
  • Verilog 错误:必须连接到结构网络表达式

    我收到错误 output or inout port Qout must be connected to a structural net expression 我评论了下面代码中发生错误的行 代码被修剪 压缩 我搜索了答案 似乎我无法将输
  • 使用双寄存器方法解决亚稳态问题

    为了解决Verilog中不同时钟域引起的亚稳态 采用双寄存器方法 但据我所知 亚稳态的最终输出尚未确定 输出独立于输入 那么 我的问题是如何保证使用双寄存器方法输出的正确性 Thanks 您不能完全确定您避免了亚稳态 正如您所提到的 亚稳态
  • 计算机Java项目|基于SSM的微课学习系统

    作者主页 编程指南针 作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智
  • 【GRNN-RBFNN-ILC算法】【轨迹跟踪】基于神经网络的迭代学习控制用于未知SISO非线性系统的轨迹跟踪(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 2 1 第1部分 2 2 第2部分
  • 为什么我强烈推荐大学生打CTF!

    前言 写这个文章是因为我很多粉丝都是学生 经常有人问 感觉大一第一个学期忙忙碌碌的过去了 啥都会一点 但是自己很难系统的学习到整个知识体系 很迷茫 想知道要如何高效学习 这篇文章我主要就围绕两点 减少那些罗里吧嗦的废话 直接上干货 CTF如
  • DSCA190V 57310001-PK

    DSCA190V 57310001 PK DSCA190V 57310001 PK 具有两个可编程继电器功能 并安装在坚固的 XP 外壳中 DSCA190V 57310001 PK 即可使用 只需最少的最终用户校准 DSCA190V 573
  • if 语句导致 Verilog 中的锁存推断?

    我正在编写用于合成算法的 Verilog 代码 我对哪些情况可能导致推断锁存器有点困惑 下面是这样的一段代码 虽然它在模拟中工作得很好 但我担心它可能会导致硬件问题 always b1 or b2 b1 map b2 map m1 map
  • verilog $readmemh 对于 50x50 像素 RGB 图像花费太多时间

    我正在尝试编译用于 FPGA 编程的 verilog 代码 我将在其中实现 VGA 应用程序 我使用 QuartusII 和 Altera 我正在尝试正确使用 readmemh 来逐像素获取图片 现在 我已经使用 matlab 将图片转换为
  • 在 Verilog 中判断总线是否包含单个 x 的最佳方法是什么?

    我有一个监控总线的测试台 总线内的一些信号 位 可以是 1 bx 由于多种原因 我需要知道总线内是否有任何信号是 1 bx 如果总线包含任何 x 测试 不用于综合 仅用于模拟目的 的最佳方法是什么 我曾希望我可以使用减少或然后使用 但这似乎
  • 为什么 Verilog 不被视为编程语言? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 教授在课堂上说学生不应该说他们学会了用Verilog 编程 他说 Verilog 之类的东西不是用来编程的 而是用来设计的 那么 Verilog
  • 标识符必须用端口模式声明:busy。 (Verilog)

    我有如下所示的 Verilog 代码 当我编译它时 我收到以下错误消息 并且代码的第一行突出显示 Error 标识符必须用端口模式声明 busy Code module main clk rst start busy ready cnt s
  • VIM 高亮匹配开始/结束

    我正在尝试找到一个插件 它将突出显示与 Verilog 匹配的开始 结束语句 VIM 可以使用花括号 方括号 但不能使用它的开始 结束 我希望 VIM 突出显示正确的开始到正确的结束 在我看来 最好的选择是使用 matchit 该脚本是 v
  • 我怎样才能让我的verilog移位器更通用?

    这里我有一个移位器 但现在它最多只能工作 3 位 我一直在寻找 但不知道如何让它工作最多 8 位 module shifter a b out input 7 0 a b output 7 0 out wire 7 0 out1 out2
  • 如何在 Verilog 中推断 Block RAM

    我在一个项目中遇到了一个非常具体的问题 这个问题已经困扰我好几天了 我有以下 RAM 模块的 Verilog 代码 module RAM param clk addr read write clear data in data out pa
  • reg 声明中的位顺序

    如果我需要使用 4 个 8 位数字 我会声明以下 reg reg 7 0 numbers 3 0 我对第一个和第二个声明 7 0 和 3 0 之间的区别感到很困惑 他们应该按什么顺序来 第一个是保留数字的大小 而第二个是保留数字的数量 还是
  • 具有内部赋值延迟的阻塞和非阻塞语句之间的区别

    以下 2 个 verilog 代码片段有什么区别 1 always in out 5 in AND 2 always in out lt 5 in 考虑到always块中不存在其他行 输出会有什么不同吗 问题参考幻灯片 16 参见 o5 和
  • Verilog 双向握手示例

    我正在完成一个项目 要求是处理器内部功能单元之间的双向握手 我知道它是什么 但是有没有任何 标准 或一个简单的例子 我唯一能想到的就是两个单元之间 当它们之间有一条数据线并且当 X 发送到 Y 时 会给出一个单独的 发送 信号 当 Y 接收
  • Verilog 数组语法

    我是 Verilog 新手 并且遇到了很多麻烦 例如 我想要一个包含八个单元的数组 每个单元都是 8 位宽 以下不起作用 reg 7 0 transitionTable 0 7 assign transitionTable 0 10 仅仅做
  • 如何迭代创建参数化大小的总线来连接同样迭代创建的模块?

    我正在尝试使用组合逻辑方法在 verilog 中创建乘法器模块 以便不涉及时钟 我希望模块有一个通用的定义 即我希望乘法器分别接收大小为 M 和 N 位的两个因子 并返回大小为 M N 位的乘积 基本思想是计算部分积的和 每个部分积根据其级

随机推荐

  • RabbitMQ--集成Springboot--3.2--消息确认机制

    RabbitMQ 集成Springboot 3 2 消息确认机制 代码位置 https gitee com DanShenGuiZu learnDemo tree master rabbitMq learn rabbitMq 01 1 介绍
  • dedecms支持Word内容一键导入

    1 4 2之后官方并没有做功能的改动 1 4 2在word复制这块没有bug 其他版本会出现手动无法转存的情况 本文使用的后台是Java 前端为Jsp 前端都一样 后台如果语言不通得自己做 Base64编码解码 因为公司业务需要支持IE8
  • 设计模式--观察者模式

    观察者模式 属于行为型模式基本原理 当一个对象被修改时 会自动通知它的依赖对象 主要流程 1 创建一个对象 存储它的所有依赖对象 2 在对象被修改的时候 通知所有依赖的对象 3 创建依赖对象 有统一的刷新方法 注意 避免循环依赖 inclu
  • uni-app-初识

    uniApp 初识 初识uni app 作用 特点 uni app的目录结构 运行编译环境准备 index vue页面分析 常用组件 条件编译 常用条件 模板中 常用条件 样式中 常用条件 配置中 配置页面 pages json 初识uni
  • 无人机集群作战仿真研究现状及在城市作战中的应用前景(附最新无人集群项目内容)

    随着人工智能 分布式系统 组网通信等技术的推进 以及机载硬件水平的显著提升 无人机集群受到以中美为首的军事强国高度关注和大力发展 无人机集群也被认为能够颠覆未来战场形势的一种作战手段 因此军事强国均在加紧无人机集群技术攻关并开展集群飞行试验
  • c语音中打印参数调用层级即call stack, call trace

    http stackoverflow com questions 105659 how can one grab a stack trace in c There s backtrace and backtrace symbols From
  • 智慧电塔倾斜在线监测解决方案

    一 方案背景 我国科技的不断进步 电塔的建设正在飞速发展 由于高压线路途经地域环境复杂 在运行过程中往往会受到多种因素的影响导致电塔变形 倾斜 倒塌 造成巨大的经济损失 因此需要电塔倾斜监测系统来预防此类事件的发生 智慧电塔倾斜监测解决方案
  • LightOJ 1220 Mysterious Bacteria

    Problem LightOJ 1220 Mysterious Bacteria 题意 输入一个 x 2 lt x lt 2 32 求满足 x b p 的最大的 p x b p都是整数 暴力版 枚举b或者枚举p 然后求另外一个 枚举b只要从
  • GLTF编辑器:在线模型材质编辑工具

    GLTF 编辑器 是一个功能强大 易于使用的在线3D模型编辑和查看工具 它支持多种格式的3D模型导入并将模型导出为GLB格式 除了可以对3D模型进行基本属性的修改之外 还支持对模型原点重置以及模型材质纹理修改 对于3D开发者和设计师来说 G
  • 简易聊天室代码分享 js+socket.io

    先言 这我以前写的 这里就是单纯分享下代码 不算正经文章 效果如下 前端用一个单html文件 然后后端用node js和socket io 也是只用一个单js文件就好 这里可以看下代码的实现逻辑就好 因为来连数据库才能运行的 有需要的话告诉
  • java2习题3

    1 编写应用程序求1 2 10 1 用for和while循环语句进行1 2 10 的计算 package yingshu public class one public static void main String args TODO A
  • Mybatis——基础使用学习

    Mybatis 基础使用学习 1 简介 1 1 什么时Mybatis 1 2 持久化 1 3 持久层 1 4 为什么需要Mybatis 2 第一个Mybatis程序 2 1 搭建环境 2 2 创建一个模块 配置好mybatis 2 3 编写
  • Eclipse导入maven项目Pom.xml文件报错处理方法

    文章转载自 https blog csdn net jianzhonghao article details 72858465 Eclipse导入maven项目时 Pom xml文件报错处理方法 导入maven项目 FIle Import
  • css实现分页效果

  • 设有n项任务,加工时间分别表示为正整数t1,t2,...,tn。背包问题系列

    设有n项任务 加工时间分别表示为正整数t1 t2 tn 现有2台同样的机器 从0时刻可以安排对这些任务的加工 知道T时刻所有任务完成 总加工时间为T 设计算法使得总加工时间T最小的调度方案 设给定的实例 t1 1 t2 5 t3 2 t4
  • linux学习(五)解决github网页无法进入

    文章目录 前言 1 问题 2 解决 前言 准确来说这个内容不属于linux学习 但是使用git管理代码时需要用到 这里就提前准备一下 1 问题 github网页无法刷出来 一直转圈 2 解决 step1 找到C Windows System
  • 取整函数_6个Excel取整函数技巧,让你的数据规规矩矩!

    Excel技巧是十分神奇的 可以用来娱乐 也能用来工作 更重要的是可以工作效率 不管是在什么地方 最不讨人喜欢的就是有小数点的数据 那怎么办了 今天就来教给大家6个超简单又很实用的Excel取整函数 1 CEILING 函数取整 CEILI
  • windows10编译open3d 0.13

    目录 写在前面 准备 获取源码 cmake cmake版本 开始cmake 1 命令行 2 cmake gui 编译 安装 测试 完 写在前面 1 环境 win10 visual studio2019 cmake3 22 0 rc1 下载源
  • C语言浮点数存储规则

    1 浮点型数据类型 float double long double 目前常用的类型为float 用于存储单精度浮点数和双精度浮点数 浮点数使用IEEE 电气和电子工程协会 格式 浮点类型的32位浮点数具有 4 个字节 包括一个符号位 一个
  • 【FPGA学习】状态机实现UART通信

    文章目录 前言 一 数据帧结构 二 接收模块 2 1 状态设置 2 1 状态跳转 2 2 奇校验 2 3 数据输出 三 发送模块 3 1 状态跳转 3 2 数据输出 四 顶层模块 总结 前言 在之前的文章中 FPGA学习 实例一 Cyclo