FPGA:uart原理+tx发送模块+rx接收模块

文章目录

  • 一、串口通信
  • 二、UART通信
  • 三、tx发送模块
  • 四、rx模块接收

一、串口通信

处理器与外部设备通信的两种方式:
串行通信: 指数据的各个位使用多条数据线同时进行传输。
并行通信: 将数据分成一位一位的形式在一条数据线上逐个传输。
在这里插入图片描述

串行通信的通信方式:
同步通信: 带时钟同步信号的数据传输,发送方和接收方在同一时钟控制下,同步传输数据。
异步通信: 不带时钟同步信号的数据传输,发送方和接收方使用各自的时钟控制数据的发送和接收过程。在这里插入图片描述

串行通信的传输方向:
单工: 数据只能沿一个方向进行传输。
半双工: 数据传输可以沿两个方向,但需要分时进行。
全双工: 数据可以同时进行双向传输。
在这里插入图片描述

常见的串行通信接口:
在这里插入图片描述

二、UART通信

通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART,是一种异步收发传输器。 它在发送数据时将并行数据转换为串行的数据来传输,在接收数据时将接收到的串行数据转换成并行数据。UART串口通信需要两根信号线来实现,一根用于发送,另一个用于接收。
在这里插入图片描述

协议层:
数据格式,1帧数据由4部分组成。

  • 起始位(1bit)
  • 数据位(6/7/8bit)
  • 奇偶校验位(1bit)
  • 停止位(1bit/1.5bit/2bit)
    在这里插入图片描述

奇校验:原始码流+校验位 总共有奇数个1
偶校验:原始码流+校验位 总共有偶数个1

传输速率:
串口通信速率用波特率表示,它表示每秒传输二进制数据的位数,单位是bit/s(位/秒),简称bps;常用的波特率有9600,115200等。

物理层:
串口电平标准:

  • TTL电平的串口(3.3V)
  • RS232电平的串口(+5V ~ +12V为低电平,-12V ~ -5V为高电平)

三、tx发送模块

tx发送模块:共四个状态,IDLE状态,START状态,DATA状态,FINISH状态。

/*
 * @Description: tx输出,波特率115200,系统时钟50M,传输1bit所需计数434个周期
 * @Author: Fu Yu
 * @Date: 2023-08-15 11:10:41
 * @LastEditTime: 2023-08-15 14:55:04
 * @LastEditors: Fu Yu
 */

module uart_tx (
    input           wire                clk         ,
    input           wire                rst_n       ,
    input           wire [7:0]          tx_din      ,
    input           wire                tx_din_vld  ,

    output          wire                tx_dout     ,
    output          wire                ready           
);

parameter MAX_BIT = 50_000_000/115200;//1bit计数最大值,434

localparam  IDLE   = 4'b0001,
            START  = 4'b0010,
            DATA   = 4'b0100,
            FINISH = 4'b1000;

reg [3:0]   state_c;//现态
reg [3:0]   state_n;//次态

wire        idle_start  ;// IDLE -> START
wire        start_data  ;// START -> DATA
wire        data_finish ;// DATA -> FINISH
wire        finish_idle ;// FINFISH -> IDLE

reg			[8:0]	cnt_bit	   	;
wire				add_cnt_bit	;
wire				end_cnt_bit	;

reg			[11:0]	cnt_data	   	;
wire				add_cnt_data	;
wire				end_cnt_data	;

reg [7:0]   tx_din_r;
reg         tx_dout_r;

//****************************************************************
//--                状态机
//****************************************************************
always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        state_c <= IDLE;
    end
    else begin
        state_c <= state_n;
    end
end

always @( *) begin
    case (state_c)
        IDLE : begin
            if(idle_start) begin
                state_n = START;
            end
            else begin
                state_n = state_c;
            end
        end

        START : begin
            if(start_data) begin
                state_n = DATA;
            end
            else begin
                state_n = state_c;
            end
        end

        DATA : begin
            if(data_finish) begin
                state_n = FINISH;
            end
            else begin
                state_n = state_c;
            end
        end

        FINISH : begin
            if(finish_idle) begin
                state_n = IDLE;
            end
            else begin
                state_n = state_c;
            end
        end

        default : state_n = IDLE;
            
    endcase
end


assign idle_start  = state_c == IDLE && tx_din_vld ;
assign start_data  = state_c == START &&  end_cnt_bit;
assign data_finish = state_c == DATA &&  end_cnt_data;
assign finish_idle = state_c == FINISH && end_cnt_bit;

//****************************************************************
//--                    计数器
//****************************************************************
//1bit计数器
always @(posedge clk or negedge rst_n)begin 
   if(!rst_n)begin
        cnt_bit <= 'd0;
    end 
    else if(add_cnt_bit)begin 
        if(end_cnt_bit)begin 
            cnt_bit <= 'd0;
        end
        else begin 
            cnt_bit <= cnt_bit + 1'b1;
        end 
    end
end 

assign add_cnt_bit = state_c == START || state_c == FINISH || state_c == DATA;
assign end_cnt_bit = add_cnt_bit && cnt_bit == MAX_BIT - 1;

//8bit计数器
always @(posedge clk or negedge rst_n)begin 
   if(!rst_n)begin
        cnt_data <= 'd0;
    end 
    else if(add_cnt_data)begin 
        if(end_cnt_data)begin 
            cnt_data <= 'd0;
        end
        else begin 
            cnt_data <= cnt_data + 1'b1;
        end 
    end
end 

assign add_cnt_data = state_c == DATA && end_cnt_bit;
assign end_cnt_data = add_cnt_data && cnt_data == 8 - 1 ;


//****************************************************************
//--                输入数据寄存
//****************************************************************
always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        tx_din_r <= 0;
    end
    else begin
        tx_din_r <= tx_din;
    end
end


//****************************************************************
//--            实现串口时序
//****************************************************************
always @( *) begin
    case (state_c)
        IDLE : begin
            tx_dout_r = 1;
        end

        START : begin
            tx_dout_r = 0;
        end

        DATA : begin
            if(tx_din_r[cnt_data]) begin
                tx_dout_r = 1;
            end
            else begin
                tx_dout_r = 0;
            end
        end

        FINISH : begin
            tx_dout_r = 1;
        end

        default : tx_dout_r = 1;
    endcase
end

assign tx_dout = tx_dout_r;

assign ready = state_c == IDLE;


endmodule //uart_tx

测试文件:

/*
 * @Description: uart_tx仿真模块
 * @Author: Fu Yu
 * @Date: 2023-08-15 14:58:32
 * @LastEditTime: 2023-08-15 15:06:49
 * @LastEditors: Fu Yu
 */


`timescale 1ns/1ns
    
module tb_uart_tx();

//激励信号定义 
    reg				tb_clk  	;
    reg				tb_rst_n	;
    reg		[7:0]   tb_tx_din	;
    reg             tb_tx_din_vld;

//输出信号定义	 
    wire			tx_dout	;
    wire			ready    ;

//时钟周期参数定义	
    parameter		CLOCK_CYCLE = 20;   
    defparam  u_uart_tx.MAX_BIT = 10;
//模块例化
uart_tx u_uart_tx(
   /*input           wire       */  .       clk       (tb_clk)  ,
   /*input           wire       */  .       rst_n     (tb_rst_n)  ,
   /*input           wire [7:0] */  .       tx_din    (tb_tx_din) ,
   /*input           wire       */  .       tx_din_vld(tb_tx_din_vld) ,
   /*output          wire       */  .       tx_dout   (tx_dout)  ,
   /*output          wire       */  .       ready     (ready)      
);

//产生时钟
    initial 		tb_clk = 1'b0;
    always #(CLOCK_CYCLE/2) tb_clk = ~tb_clk;

//产生激励
    initial  begin 
        tb_rst_n = 1'b1;
        tb_tx_din = 0;
        tb_tx_din_vld = 0;
        #(CLOCK_CYCLE*2);
        tb_rst_n = 1'b0;
        #(CLOCK_CYCLE*20);
        tb_rst_n = 1'b1;

        
        repeat(10) begin
            tb_tx_din_vld = 1;
            tb_tx_din = {$random};
            #20;
            tb_tx_din_vld = 0;
            wait(ready == 1);
            #20;
        end

        #1000;
        $stop;
    end

endmodule 

仿真波形图:
在这里插入图片描述
上板验证:
加入按键控制模块,每一次按下,输出8’hAB

按键消抖模块:

/*
 * @Description: 按键消抖,使用延迟方法,消抖后输出高电平信号
 * @Author: Fu Yu
 * @Date: 2023-08-07 14:22:56
 * @LastEditTime: 2023-08-07 14:48:48
 * @LastEditors: Fu Yu
 */


module key_filter #(
    parameter WITDH = 3//WITDH表示位宽
)(
    input       wire                clk         ,
    input       wire                rst_n       ,

    input       wire [WITDH-1:0]    key_in      ,

    output      wire [WITDH-1:0]    key_down
);

parameter MAX_20MA = 20'd999_999;//20ms

reg [WITDH - 1:0]   key_r0;//同步信号
reg [WITDH - 1:0]   key_r1;//打拍
reg [WITDH - 1:0]   key_r2;
reg [WITDH - 1:0]   key_down_r;
reg [19:0]          cnt_20ms;
reg                 flag;//开始计数信号

wire [WITDH - 1:0]  nedge;//下降沿
wire add_cnt_20ms;
wire end_cnt_20ms;


//****************************************************************
//--同步,打拍
//****************************************************************
always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        key_r0 <= {WITDH{1'b1}};
        key_r1 <= {WITDH{1'b1}};
        key_r2 <= {WITDH{1'b1}};
    end
    else begin
        key_r0 <= key_in;
        key_r1 <= key_r0;
        key_r2 <= key_r1;
    end
end

//下降沿检测
assign nedge = ~key_r1 & key_r2;


//****************************************************************
//--flag
//****************************************************************
always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        flag <= 1'b0;
    end
    else if(nedge) begin//检测到下降沿开始计数
        flag <= 1'b1;
    end
    else if(end_cnt_20ms) begin//20ms后停止计数
        flag <= 1'b0;
    end
    else begin
        flag <= flag;
    end
end


//****************************************************************
//--20ms计数器
//****************************************************************


always @(posedge clk or negedge rst_n)begin 
   if(!rst_n)begin
        cnt_20ms <= 20'd0;
    end 
    else if(add_cnt_20ms)begin 
        if(end_cnt_20ms)begin 
            cnt_20ms <= 20'd0;
        end
        else begin 
            cnt_20ms <= cnt_20ms + 1'b1;
        end 
    end
end 

assign add_cnt_20ms = flag;
assign end_cnt_20ms = add_cnt_20ms && cnt_20ms == MAX_20MA;

//****************************************************************
//--key_down
//****************************************************************
always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        key_down_r <= {WITDH{1'b0}};
    end
    else if(end_cnt_20ms) begin
        key_down_r <= ~key_r2;
    end
    else begin
        key_down_r <= {WITDH{1'b0}};
    end
end

assign key_down = key_down_r;

endmodule //key_filter

顶层模块:

module top (
    input           wire            clk         ,
    input           wire            rst_n       ,
    input           wire            key_in      ,

    output          wire            tx
);


wire        key_wire;
wire        ready;


key_filter #(.WITDH(1)) u_key_filter(
   /* input       wire            */.   clk     (clk)    ,
   /* input       wire            */.   rst_n   (rst_n)    ,
   /* input       wire [WITDH-1:0]*/.   key_in  (key_in)    ,
   /* output      wire [WITDH-1:0]*/.   key_down(key_wire)
);

uart_tx u_uart_tx(
   /*input           wire       */  .       clk       (clk)  ,
   /*input           wire       */  .       rst_n     (rst_n)  ,
   /*input           wire [7:0] */  .       tx_din    (8'hab)  ,
   /*input           wire       */  .       tx_din_vld(key_wire && ready)  ,
   /*output          wire       */  .       tx_dout   (tx)  ,
   /*output          wire       */  .       ready     (ready)      
);


endmodule //top

效果展示:
在这里插入图片描述

四、rx模块接收

/*
 * @Description: rx接收,波特率115200,系统时钟50M,传输1bit所需计数434个周期
 * @Author: Fu Yu
 * @Date: 2023-08-15 11:10:41
 * @LastEditTime: 2023-08-16 10:03:27
 * @LastEditors: Fu Yu
 */

module uart_rx (
    input           wire                clk         ,
    input           wire                rst_n       ,
    input           wire                rx_din       ,

    output          wire [7:0]          rx_dout      ,
    output          wire                rx_dout_vld  ,
    output          wire                ready           
);

parameter MAX_BIT = 50_000_000/115200;//1bit计数最大值,434

localparam  IDLE   = 4'b0001,
            START  = 4'b0010,
            DATA   = 4'b0100,
            FINISH = 4'b1000;

reg [3:0]   state_c;//现态
reg [3:0]   state_n;//次态

wire        idle_start  ;// IDLE -> START
wire        start_data  ;// START -> DATA
wire        data_finish ;// DATA -> FINISH
wire        finish_idle ;// FINFISH -> IDLE

reg			[8:0]	cnt_bit	   	;
wire				add_cnt_bit	;
wire				end_cnt_bit	;

reg			[11:0]	cnt_data	   	;
wire				add_cnt_data	;
wire				end_cnt_data	;

reg     [7:0]       rx_dout_r;

//****************************************************************
//--                状态机
//****************************************************************
always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        state_c <= IDLE;
    end
    else begin
        state_c <= state_n;
    end
end

always @( *) begin
    case (state_c)
        IDLE : begin
            if(idle_start) begin
                state_n = START;
            end
            else begin
                state_n = state_c;
            end
        end

        START : begin
            if(start_data) begin
                state_n = DATA;
            end
            else begin
                state_n = state_c;
            end
        end

        DATA : begin
            if(data_finish) begin
                state_n = FINISH;
            end
            else begin
                state_n = state_c;
            end
        end

        FINISH : begin
            if(finish_idle) begin
                state_n = IDLE;
            end
            else begin
                state_n = state_c;
            end
        end

        default : state_n = IDLE;
            
    endcase
end


assign idle_start  = state_c == IDLE && rx_din == 0 ;
assign start_data  = state_c == START &&  end_cnt_bit;
assign data_finish = state_c == DATA &&  end_cnt_data;
assign finish_idle = state_c == FINISH && end_cnt_bit;

//****************************************************************
//--                    计数器
//****************************************************************
//1bit计数器
always @(posedge clk or negedge rst_n)begin 
   if(!rst_n)begin
        cnt_bit <= 'd0;
    end 
    else if(add_cnt_bit)begin 
        if(end_cnt_bit)begin 
            cnt_bit <= 'd0;
        end
        else begin 
            cnt_bit <= cnt_bit + 1'b1;
        end 
    end
end 

assign add_cnt_bit = state_c == START || state_c == FINISH || state_c == DATA;
assign end_cnt_bit = add_cnt_bit && cnt_bit == MAX_BIT - 1;

//8bit计数器
always @(posedge clk or negedge rst_n)begin 
   if(!rst_n)begin
        cnt_data <= 'd0;
    end 
    else if(add_cnt_data)begin 
        if(end_cnt_data)begin 
            cnt_data <= 'd0;
        end
        else begin 
            cnt_data <= cnt_data + 1'b1;
        end 
    end
end 

assign add_cnt_data = state_c == DATA && end_cnt_bit;
assign end_cnt_data = add_cnt_data && cnt_data == 8 - 1 ;



//****************************************************************
//--            实现数据接收
//****************************************************************
always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        rx_dout_r <= 0;
    end
    else if(state_c == DATA && cnt_bit == MAX_BIT >> 1) begin
        rx_dout_r[cnt_data] <= rx_din;
    end
end

assign rx_dout = rx_dout_r;

assign rx_dout_vld = data_finish;

assign ready = state_c == IDLE;


endmodule //uart_rx

ip核fifo调用:

module ctrl (
    input           wire            clk                 ,
    input           wire            rst_n               ,
    input           wire [7:0]      rx_data             ,
    input           wire            rx_data_vld         ,
    input           wire            tx_ready            ,

    output          wire [7:0]      tx_data             ,
    output          wire            tx_data_vld     
);


wire  fifo_rd_empty;
wire  fifo_wr_full;




fifo	fifo_inst (
	.aclr ( ~rst_n ),

	.data ( rx_data ),
	.wrclk ( clk ),
	.wrreq ( rx_data_vld && ~fifo_wr_full ),

	.q ( tx_data ),
    .rdclk ( clk ),
	.rdreq ( tx_ready && ~fifo_rd_empty ),

	.rdempty ( fifo_rd_empty ),
	.wrfull ( fifo_wr_full )
	);


assign tx_data_vld = tx_ready && ~fifo_rd_empty ;

endmodule //ctrl

顶层模块:

module top (
    input           wire            clk         ,
    input           wire            rst_n       ,
    input           wire            key_in      ,
    input           wire            rx          ,

    output          wire            tx
);


wire        key_wire;
wire        tx_ready;
wire [7:0]  rx_data;
wire        rx_data_vld;
wire [7:0]  tx_data;
wire        tx_data_vld;


key_filter #(.WITDH(1)) u_key_filter(
   /* input       wire            */.   clk     (clk)    ,
   /* input       wire            */.   rst_n   (rst_n)    ,
   /* input       wire [WITDH-1:0]*/.   key_in  (key_in)    ,
   /* output      wire [WITDH-1:0]*/.   key_down(key_wire)
);

uart_tx u_uart_tx(
   /*input           wire       */  .       clk       (clk)  ,
   /*input           wire       */  .       rst_n     (rst_n)  ,
   /*input           wire [7:0] */  .       tx_din    (tx_data)  ,
   /*input           wire       */  .       tx_din_vld(tx_data_vld)  ,

   /*output          wire       */  .       tx_dout   (tx)  ,
   /*output          wire       */  .       ready     (tx_ready)      
);


uart_rx u_uart_rx(
   /* input           wire       */.         clk        (clk ) ,
   /* input           wire       */.         rst_n      (rst_n ) ,
   /* input           wire       */.         rx_din     (rx )  ,

   /* output          wire [7:0] */.         rx_dout    (rx_data)  ,
   /* output          wire       */.         rx_dout_vld(rx_data_vld)  ,
   /* output          wire       */.         ready      ()     
);



ctrl  u_ctrl(
    /* input           wire         */ .   clk        (clk) ,
    /* input           wire         */ .   rst_n      (rst_n) ,
    /* input           wire [7:0]   */ .   rx_data    (rx_data) ,
    /* input           wire         */ .   rx_data_vld(rx_data_vld) ,
    /* input           wire         */ .   tx_ready   (tx_ready) ,

    /* output          wire [7:0]   */ .   tx_data    (tx_data) ,
    /* output          wire         */ .   tx_data_vld(tx_data_vld)
);


endmodule //top

将rx接收模块与tx发送模块联合使用,效果如下:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Dodaf架构的学习分享

一.Dodaf的内容 Dodaf的背景 DODAF&#xff08;Department of Defense Architecture Framework&#xff09;起源于美国国防部&#xff0c;是一个用于支持复杂系统设计、规划和实施的架构框架。以下是DODAF的背景和起源&#xff1a; 复杂系统需求&#xff1a;在军事和国防领域&…

stm32单片机开关输入控制蜂鸣器参考代码(附PROTEUS电路图)

说明&#xff1a;这个buzzer的额定电压需要改为3V&#xff0c;否则不会叫&#xff0c;源代码几乎是完全一样的 //gpio.c文件 /* USER CODE BEGIN Header */ /********************************************************************************* file gpio.c* brief Thi…

idea新建web项目

步骤一 步骤二 步骤三 新建两个目录lib、classes 步骤四 设置两个目录的功能lib、classes 步骤五 发布到tomcat

网络编程面试笔试题

一、OSI 7层模型&#xff0c;TCP/IP 4层模型 5层模型。 以及每一层的功能&#xff08;重点&#xff1a;第三层 第四层&#xff09; 答&#xff1a; 7层模型&#xff08;①物理层&#xff1a;二进制比特流传输&#xff0c;②数据链路层&#xff1a;相邻结点的可靠传输&#xf…

选择大型语言模型自定义技术

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建可二次编辑器的3D应用场景 企业需要自定义模型来根据其特定用例和领域知识定制语言处理功能。自定义LLM使企业能够在特定的行业或组织环境中更高效&#xff0c;更准确地生成和理解文本。 自定义模型使企业能够创建符合其品牌…

“之江数据安全治理论坛”暨《浙江省汽车数据处理活动规定(专家建议稿)》研讨会顺利召开

研讨会主题 8月10日&#xff0c;“之江数据安全治理论坛”暨《浙江省汽车数据处理活动规定&#xff08;专家建议稿&#xff09;》研讨会在浙江大学计算机创新技术研究院举办。 本次研讨会的主题聚焦于“智能网联汽车的数据安全与数据合规”&#xff0c;邀请行业主管部门和数据…

近 2000 台 Citrix NetScaler 服务器遭到破坏

Bleeping Computer 网站披露在某次大规模网络攻击活动中&#xff0c;一名攻击者利用被追踪为 CVE-2023-3519 的高危远程代码执行漏洞&#xff0c;入侵了近 2000 台 Citrix NetScaler 服务器。 研究人员表示在管理员安装漏洞补丁之前已经有 1200 多台服务器被设置了后门&#x…

Fork/Join框架

是什么 Fork/Join框架是Java 7提供的一个用于并行执行任务的框架&#xff0c;是一个把大任务分割成若干个小任务&#xff0c;最终汇总每个小任务结果后得到大任务结果的框架。 Fork: 把一个大任务切分为若干子任务并行的执行 Join: 合并这些子任务的执行结果&#xff0c;最后…

版本控制工具Git集成IDEA的学习笔记(第一篇Gitee)

目录 一、Gitee的使用 1、注册网站会员 2、用户中心 3、创建远程仓库 4、配置SSH免密登录 二、集成IDEA&#xff0c;Git项目搭建 1、本地仓库搭建 1&#xff09;创建一个新项目 2&#xff09;打开终端&#xff0c;在当前目录新建一个Git代码库 3&#xff09;忽略文件 …

Linux命令200例:tail用来显示文件的末尾内容(常用)

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌。CSDN专家博主&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &…

通过Git使用GitHub

目录 一、建立个人仓库 二、配置SSH密钥 三、克隆仓库代码 四、推送代码到个人仓库 五、代码拉取 一、建立个人仓库 1.建立GitHub个人仓库&#xff0c;首先注册GitHub用户。注册好了之后&#xff0c;打开用户的界面 然后就是配置问题 配置好后拉到最下方点击create repos…

【C++入门到精通】C++入门 —— 容器适配器、stack和queue(STL)

阅读导航 前言stack1. stack概念2. stack特点3. stack使用 queue1. queue概念2. queue特点3. queue使用 容器适配器1. 什么是适配器2. STL标准库中stack和queue的底层结构3. STL标准库中对于stack和queue的模拟实现⭕stack的模拟实现⭕stack的模拟实现 总结温馨提示 前言 文章…

鲁棒优化入门(5)—Matlab+Yalmip求解鲁棒优化编程实战

之前的博客&#xff1a;鲁棒优化入门&#xff08;二&#xff09;——基于matlabyalmip求解鲁棒优化问题 去年发布了使用Yalmip工具箱求解鲁棒优化问题的博客之后&#xff0c;陆陆续续有朋友问我相关的问题&#xff0c;有人形容从学习这篇博客到求解论文中的鲁棒优化问题&#x…

(二)结构型模式:4、组合模式(Composite Pattern)(C++实例)

目录 1、组合模式&#xff08;Composite Pattern&#xff09;含义 2、组合模式应用场景 3、组合模式的优缺点 4、组合模式的UML图学习 5、C实现组合模式的简单示例&#xff08;公司的OA系统&#xff09; 1、组合模式&#xff08;Composite Pattern&#xff09;含义 组合模…

【C语言学习】二维数组

二维数组 int[3][5];//通常理解为a是一个3行5列的矩阵二维数组的遍历 for(i0; i<3; i){for(j0; j<5; j){a[i][j] i*j;} }

Vivado使用入门之三:I/O约束

一、导图概览 二、I/O约束 2.1 I/O约束的内容 I/O约束主要是对port的位置和电气特性进行设置&#xff0c;进入菜单栏Window的IO Ports&#xff0c;可以查看可约束的相关内容。 一些port的常用特性解释如下 Name: port的名称 Direction:port的输入输出类型&#xff0c;有三种…

DNNGP、DeepGS 和 DLGWAS模型构成对比

一、DNNGP DNNGP 是基于深度卷积神经网络&#xff0c;这个结构包括一个输入层&#xff0c;三个卷积层&#xff0c;一个批标准化层&#xff0c;两个dropout层&#xff0c;一个平坦化层&#xff0c;一个 dense层。 dropout层&#xff1a;在神经网络中,dropout层是一个非常有效的正…

[JavaWeb]【一】入门JavaWeb开发总概及HTML、CSS、JavaScript

目录 一 特色 二 收获​编辑 三 什么是web? 四 网站的工作流程 五 web网站的开发模式​编辑 六 web开发课程学习安排 七、初始web前端 八 HTML、CSS 8.1 什么是HTNL\CSS(w3cschool) 8.2 HTML快速入门 8.3 VS Code开发工具 8.3.1 插件 8.3.2 主题&#xff08;改变颜色&…

破解难题:如何应对项目中的‘老油条’障碍

引言 在项目管理的实践中&#xff0c;我们经常遇到各种各样的人员挑战。其中&#xff0c;有一种特殊的挑战被称为“老油条”现象。这些“老油条”通常在表面上表现得非常配合&#xff0c;但在实际工作中却常常没有任何进展。这种情况不仅会影响项目的进度&#xff0c;还可能对…

Kestrel和ISS服务器下的配置

一、Kestrel服务器 Kestrel是ASP.NET Core框架中的一个跨平台的Web服务器。它是ASP.NET Core应用程序默认的HTTP服务器&#xff0c;并且可作为独立的Web服务器来托管ASP.NET Core应用程序。 Kestrel具有以下特点和功能 1、跨平台 Kestrel是完全跨平台的&#xff0c;可以在Wind…