ZYNQ之FPGA学习----UART串口实验

news2024/11/26 10:36:04

1 UART串口简介

UART串口基础知识学习:硬件设计基础----通信协议UART

2 实验任务

上位机通过串口调试助手发送数据给 Zynq,Zynq PL 端通过 RS232 串口接收数据并将接收到的数据发送给上位机,完成串口数据环回,管脚分配如下:

在这里插入图片描述
图片来自《领航者ZYNQ之FPGA开发指南》

3 实验设计

3.1 创建工程

新建工程,操作如图所示:

在这里插入图片描述

输入工程名字和工程路径,如图:

在这里插入图片描述

选择创建RTL工程,如图:

在这里插入图片描述

直接点击Next:

在这里插入图片描述

继续点击Next:

在这里插入图片描述

添加芯片型号,操作如图:

在这里插入图片描述

完成工程创建:

在这里插入图片描述

3.2 设计输入

创建工程顶层文件,操作如图:

在这里插入图片描述

创建uart_loopback_top顶层模块:

在这里插入图片描述

创建完成:

在这里插入图片描述

双击打开,输入代码如下:

module uart_loopback_top( 
    input           sys_clk,            //外部 50M 时钟 
    input           sys_rst_n,          //外部复位信号,低有效 

    input           uart_rxd,           //UART 接收端口 
    output          uart_txd            //UART 发送端口 
    ); 

//parameter define 
parameter  CLK_FREQ = 50000000;         //定义系统时钟频率 
parameter  UART_BPS = 115200;           //定义串口波特率 
  
//wire define    
wire       uart_recv_done;              //UART 接收完成 
wire [7:0] uart_recv_data;              //UART 接收数据 
wire       uart_send_en;                //UART 发送使能 
wire [7:0] uart_send_data;              //UART 发送数据 
wire       uart_tx_busy;                //UART 发送忙状态标志 
 
//串口接收模块      
uart_recv  #(                           
    .CLK_FREQ       (CLK_FREQ ),         //设置系统时钟频率 
    .UART_BPS       (UART_BPS ))         //设置串口接收波特率 
u_uart_recv(                  
    .sys_clk        (sys_clk ),  
    .sys_rst_n      (sys_rst_n ), 
    .uart_rxd       (uart_rxd ), 
    .uart_done      (uart_recv_done ), 
    .uart_data      (uart_recv_data) 
    ); 

//串口发送模块     
uart_send  #(                           
    .CLK_FREQ       (CLK_FREQ ),         //设置系统时钟频率 
    .UART_BPS       (UART_BPS ))         //设置串口发送波特率 
u_uart_send(                  
    .sys_clk        (sys_clk ), 
    .sys_rst_n      (sys_rst_n ), 
   
    .uart_en        (uart_send_en ), 
    .uart_din       (uart_send_data ), 
    .uart_tx_busy   (uart_tx_busy ), 
    .uart_txd       (uart_txd) 
    ); 
   
//串口环回模块     
uart_loop u_uart_loop( 
    .sys_clk        (sys_clk ),              
    .sys_rst_n      (sys_rst_n ),            

    .recv_done      (uart_recv_done ),   //接收一帧数据完成标志信号 
    .recv_data      (uart_recv_data ),   //接收的数据 
    .tx_busy        (uart_tx_busy ),     //发送忙状态标志       
    .send_en        (uart_send_en ),     //发送使能信号 
    .send_data      (uart_send_data)    //待发送数据 
    ); 
    
endmodule

如图所示:

在这里插入图片描述

创建uart_recv文件,如图:

在这里插入图片描述

双击打开,输入代码:

module uart_recv( 
    input             sys_clk,                  //系统时钟 
    input             sys_rst_n,                //系统复位,低电平有效 
    input             uart_rxd,                 //UART 接收端口 
    output   reg       uart_done,                //接收一帧数据完成标志 
    output   reg [7:0] uart_data                 //接收的数据 
    ); 
   
//parameter define 
parameter  CLK_FREQ = 50000000;                //系统时钟频率 
parameter  UART_BPS = 9600;                    //串口波特率 
localparam  BPS_CNT  = CLK_FREQ/UART_BPS;       //为得到指定波特率, 
                                               //需要对系统时钟计数 BPS_CNT 次 
//reg define 
reg        uart_rxd_d0; 
reg        uart_rxd_d1; 
reg [15:0] clk_cnt;                             //系统时钟计数器 
reg [ 3:0] rx_cnt;                              //接收数据计数器 
reg        rx_flag;                             //接收过程标志信号 
reg [ 7:0] rxdata;                              //接收数据寄存器 
 
//wire define 
wire       start_flag; 
 
//捕获接收端口下降沿(起始位),得到一个时钟周期的脉冲信号 
assign  start_flag = uart_rxd_d1 &  (~uart_rxd_d0 );    
//对 UART 接收端口的数据延迟两个时钟周期 
always  @( posedge sys_clk  or  negedge sys_rst_n)  begin  
    if  (!sys_rst_n)  begin  
        uart_rxd_d0  <= 1'b0; 
        uart_rxd_d1  <= 1'b0;           
    end 
    else  begin 
        uart_rxd_d0   <= uart_rxd;                    
        uart_rxd_d1   <= uart_rxd_d0; 
    end    
end 

//当脉冲信号 start_flag 到达时,进入接收过程            
always  @( posedge sys_clk  or  negedge sys_rst_n)  begin          
    if  (!sys_rst_n)                                   
        rx_flag  <= 1'b0; 
    else  begin 
        if(start_flag)                          //检测到起始位 
           rx_flag  <= 1'b1;                    //进入接收过程,标志位 rx_flag 拉高 
                                                //计数到停止位中间时,停止接收过程 
        else  if ((rx_cnt  == 4'd9)  && (clk_cnt  == BPS_CNT/2 )) 
            rx_flag  <= 1'b0;                    //接收过程结束,标志位 rx_flag 拉低 
        else 
            rx_flag  <= rx_flag; 
    end 
end 
 
//进入接收过程后,启动系统时钟计数器 
always  @( posedge sys_clk  or  negedge sys_rst_n)  begin          
    if  (!sys_rst_n)                              
        clk_cnt  <= 16'd0;                                   
    else  if ( rx_flag )  begin                   //处于接收过程 
        if (clk_cnt < BPS_CNT - 1) 
            clk_cnt  <= clk_cnt + 1'b1; 
        else 
            clk_cnt  <= 16'd0;                   //对系统时钟计数达一个波特率周期后清零 
        end 
        else                                             
            clk_cnt  <= 16'd0;                       //接收过程结束,计数器清零 
end
//进入接收过程后,启动接收数据计数器 
always  @( posedge sys_clk  or  negedge sys_rst_n)  begin          
    if  (!sys_rst_n)                              
        rx_cnt   <= 4'd0; 
    else  if ( rx_flag )  begin                   //处于接收过程 
        if (clk_cnt  == BPS_CNT - 1)             //对系统时钟计数达一个波特率周期 
            rx_cnt  <= rx_cnt + 1'b1;            //此时接收数据计数器加 1 
        else 
            rx_cnt  <= rx_cnt;        
    end 
    else 
        rx_cnt   <= 4'd0;                        //接收过程结束,计数器清零 
end 
 
//根据接收数据计数器来寄存 uart 接收端口数据 
always  @( posedge sys_clk  or negedge sys_rst_n)  begin 
    if ( !sys_rst_n)   
        rxdata  <= 8'd0;                                      
    else  if(rx_flag)                              //系统处于接收过程 
        if (clk_cnt  == BPS_CNT/2)  begin         //判断系统时钟计数器计数到数据位中间 
            case ( rx_cnt ) 
                4'd1 : rxdata[0]  <= uart_rxd_d1;   //寄存数据位最低位 
                4'd2 : rxdata[1]  <= uart_rxd_d1; 
                4'd3 : rxdata[2]  <= uart_rxd_d1; 
                4'd4 : rxdata[3]  <= uart_rxd_d1; 
                4'd5 : rxdata[4]  <= uart_rxd_d1; 
                4'd6 : rxdata[5]  <= uart_rxd_d1; 
                4'd7 : rxdata[6]  <= uart_rxd_d1; 
                4'd8 : rxdata[7]  <= uart_rxd_d1;   //寄存数据位最高位 
                default :;                                     
            endcase 
        end
        else  
            rxdata  <= rxdata; 
    else 
        rxdata  <= 8'd0; 
end


//数据接收完毕后给出标志信号并寄存输出接收到的数据 
always  @( posedge sys_clk  or  negedge sys_rst_n)  begin 
    if  (!sys_rst_n)  begin 
        uart_data  <= 8'd0;                                
        uart_done  <= 1'b0; 
    end 
    else  if(rx_cnt  == 4'd9)  begin               //接收数据计数器计数到停止位时            
        uart_data  <= rxdata;                    //寄存输出接收到的数据 
        uart_done  <= 1'b1;                      //并将接收完成标志位拉高 
    end 
    else  begin 
        uart_data  <= 8'd0;                                    
        uart_done  <= 1'b0;  
    end     
end 

endmodule

如图所示:

在这里插入图片描述

创建uart_send文件,如图所示:

在这里插入图片描述

双击打开文件,输入代码:

module uart_send( 
    input         sys_clk,                  //系统时钟 
    input         sys_rst_n,                //系统复位,低电平有效 
        
    input         uart_en,                  //发送使能信号 
    input  [7:0]  uart_din,                 //待发送数据 
    output        uart_tx_busy,             //发送忙状态标志       
    output   reg   uart_txd                  //UART 发送端口 
    ); 
   
//parameter define 
parameter  CLK_FREQ = 50000000;            //系统时钟频率 
parameter  UART_BPS = 9600;                //串口波特率 
localparam  BPS_CNT  = CLK_FREQ/UART_BPS;   //为得到指定波特率,对系统时钟计数 BPS_CNT 次 
 
//reg define 
reg        uart_en_d0;  
reg        uart_en_d1;   
reg [15:0] clk_cnt;                         //系统时钟计数器 
reg [ 3:0] tx_cnt;                          //发送数据计数器 
reg        tx_flag;                         //发送过程标志信号 
reg [ 7:0] tx_data;                         //寄存发送数据 

//wire define 
wire       en_flag; 
assign uart_tx_busy = tx_flag; 

//捕获 uart_en 上升沿,得到一个时钟周期的脉冲信号 
assign en_flag =  (~uart_en_d1) & uart_en_d0; 
 
//对发送使能信号 uart_en 延迟两个时钟周期 
always  @( posedge sys_clk  or  negedge sys_rst_n)  begin          
    if  (!sys_rst_n)  begin 
        uart_en_d0  <= 1'b0;
        uart_en_d1  <= 1'b0; 
    end                                                       
    else  begin                                                
        uart_en_d0  <= uart_en;                                
        uart_en_d1  <= uart_en_d0;                             
    end 
end 

//当脉冲信号 en_flag 到达时,寄存待发送的数据,并进入发送过程           
always  @( posedge sys_clk  or  negedge sys_rst_n)  begin          
    if  (!sys_rst_n)  begin                                   
        tx_flag  <= 1'b0; 
        tx_data  <= 8'd0; 
    end  
    else  if (en_flag)  begin                 //检测到发送使能上升沿                       
           tx_flag  <= 1'b1;                //进入发送过程,标志位 tx_flag 拉高 
           tx_data  <= uart_din;            //寄存待发送的数据 
       end 
                                            //计数到停止位结束时,停止发送过程 
       else  if  ((tx_cnt  == 4'd9)  && (clk_cnt  == BPS_CNT -(BPS_CNT/16) ))  begin                                        
           tx_flag  <= 1'b0;                //发送过程结束,标志位 tx_flag 拉低 
           tx_data  <= 8'd0; 
       end 
       else  begin 
           tx_flag  <= tx_flag; 
           tx_data  <= tx_data; 
       end  
end 
 
//进入发送过程后,启动系统时钟计数器 
always  @( posedge sys_clk  or  negedge sys_rst_n)  begin          
    if  (!sys_rst_n)                              
        clk_cnt  <= 16'd0;                                   
    else  if (tx_flag)  begin                 //处于发送过程 
        if (clk_cnt < BPS_CNT - 1) 
           clk_cnt  <= clk_cnt + 1'b1; 
        else 
           clk_cnt  <= 16'd0;               //对系统时钟计数达一个波特率周期后清零 
    end 
    else                              
       clk_cnt  <= 16'd0;                   //发送过程结束
end 
  
//进入发送过程后,启动发送数据计数器 
always  @( posedge sys_clk  or  negedge sys_rst_n)  begin          
    if  (!sys_rst_n)                              
        tx_cnt  <= 4'd0; 
    else  if (tx_flag)  begin                 //处于发送过程 
        if (clk_cnt  == BPS_CNT - 1)         //对系统时钟计数达一个波特率周期 
            tx_cnt  <= tx_cnt + 1'b1;        //此时发送数据计数器加 1 
        else 
            tx_cnt  <= tx_cnt;        
        end 
        else                               
            tx_cnt   <= 4'd0;                    //发送过程结束 
end 
 
//根据发送数据计数器来给 uart 发送端口赋值 
always  @( posedge sys_clk  or  negedge sys_rst_n)  begin         
    if  (!sys_rst_n)   
        uart_txd  <= 1'b1;         
    else  if (tx_flag) 
        case(tx_cnt) 
            4'd0: uart_txd  <= 1'b0;         //起始位  
            4'd1: uart_txd  <= tx_data[0 ];   //数据位最低位 
            4'd2: uart_txd  <= tx_data[1 ]; 
            4'd3: uart_txd  <= tx_data[2 ]; 
            4'd4: uart_txd  <= tx_data[3 ]; 
            4'd5: uart_txd  <= tx_data[4 ]; 
            4'd6: uart_txd  <= tx_data[5 ]; 
            4'd7: uart_txd  <= tx_data[6 ]; 
            4'd8: uart_txd  <= tx_data[7 ];   //数据位最高位 
            4'd9: uart_txd  <= 1'b1;         //停止位 
            default: ; 
        endcase 
    else  
        uart_txd  <= 1'b1;                   //空闲时发送端口为高电平 
end 

endmodule       

如图所示:

在这里插入图片描述

创建uart_loop文件,如图所示:

在这里插入图片描述

双击打开,输入代码:

module uart_loop( 
    input             sys_clk,                   //系统时钟 
    input            sys_rst_n,                 //系统复位,低电平有效 
     
    input            recv_done,                 //接收一帧数据完成标志 
    input      [7:0] recv_data,                 //接收的数据 
      
    input            tx_busy,                   //发送忙状态标志       
    output  reg       send_en,                   //发送使能信号 
    output  reg [7:0] send_data                  //待发送数据 
    ); 

reg recv_done_d0; 
reg recv_done_d1; 
reg tx_ready; 

wire recv_done_flag;
//捕获 recv_done 上升沿,得到一个时钟周期的脉冲信号 
assign recv_done_flag =  (~recv_done_d1) & recv_done_d0; 
                                                
//对发送使能信号 recv_done 延迟两个时钟周期 
always  @( posedge sys_clk  or  negedge sys_rst_n)  begin          
    if  (!sys_rst_n)  begin 
        recv_done_d0  <= 1'b0;                                   
        recv_done_d1  <= 1'b0; 
    end                                                       
    else  begin                                                
        recv_done_d0  <= recv_done;                                
        recv_done_d1  <= recv_done_d0;                             
    end 
end 
 
//判断接收完成信号,并在串口发送模块空闲时给出发送使能信号 
always  @( posedge sys_clk  or  negedge sys_rst_n)  begin          
    if  (!sys_rst_n)  begin 
        tx_ready   <= 1'b0;  
        send_en    <= 1'b0; 
        send_data  <= 8'd0; 
    end                                                       
    else  begin                                                
        if(recv_done_flag) begin                 //检测串口接收到数据 
            tx_ready   <= 1'b1;                  //准备启动发送过程 
            send_en    <= 1'b0; 
            send_data  <= recv_data;             //寄存串口接收的数据 
        end 
        else  if(tx_ready  &&  (~tx_busy ))  begin   //检测串口发送模块空闲 
            tx_ready  <= 1'b0;                   //准备过程结束
            send_en   <= 1'b1;                   //拉高发送使能信号 
        end 
    end 
end 

endmodule

如图所示:
在这里插入图片描述

3.3 分析与综合

对设计进行分析,操作如图:

在这里插入图片描述

分析后的设计,Vivado自动生成顶层原理图,如图:

在这里插入图片描述

对设计进行综合,操作如图:

在这里插入图片描述

综合完成后,弹出窗口如下,直接关闭:

在这里插入图片描述

3.4 约束输入

创建约束文件,操作如图所示:

在这里插入图片描述

创建约束文件,输入文件名:

在这里插入图片描述
双击打开,输入约束代码:

create_clock -period 20.000 -name clk [get_ports sys_clk] 
set_property -dict {PACKAGE_PIN U18 IOSTANDARD LVCMOS33} [get_ports sys_clk] 
set_property -dict {PACKAGE_PIN J15 IOSTANDARD LVCMOS33} [get_ports sys_rst_n] 
set_property -dict {PACKAGE_PIN J14 IOSTANDARD LVCMOS33} [get_ports uart_rxd] 
set_property -dict {PACKAGE_PIN K18 IOSTANDARD LVCMOS33} [get_ports uart_txd] 

如图所示:

在这里插入图片描述

3.5 设计实现

点击 Flow Navigator 窗口中的 Run Implementation,如图所示:

在这里插入图片描述

点击OK:

在这里插入图片描述

完成后,直接关闭:

在这里插入图片描述

3.6 功能仿真

创建TestBench,操作如图所示:

在这里插入图片描述

创建激励文件,输入文件名:

在这里插入图片描述

创建完成:

在这里插入图片描述

双击打开,输入TestBench(激励)代码:

`timescale 1ns / 1ps
module tb_uart_loopback_top();

reg    sys_clk;
reg    sys_rst_n;
reg    uart_rxd;

wire    uart_txd;

parameter SYS_CLK = 50;				//系统时钟频率,单位Mhz
parameter SYS_PRE = 1000/(SYS_CLK*2);	//时钟周期,单位ns
parameter UART_BPS = 115200;				//串口波特率
parameter BPS_CNT = 1_000_000_000/UART_BPS;//用于串口仿真的时延

//初始时刻定义
initial  begin 
    $timeformat(-9, 0, " ns", 10);	//定义时间显示格式
    sys_clk = 1'b0; 
    sys_rst_n = 1'b0; 
    uart_rxd <= 1'b1;
    #200 //系统开始工作
    sys_rst_n = 1'b1; 
    
    #3000
    rx_byte({$random} % 256);		//生成8位随机数1
	rx_byte({$random} % 256);		//生成8位随机数2
	rx_byte({$random} % 256);       //生成8位随机数3
	rx_byte({$random} % 256);       //生成8位随机数4
	rx_byte({$random} % 256);		//生成8位随机数5
	rx_byte({$random} % 256);		//生成8位随机数6
	rx_byte({$random} % 256);       //生成8位随机数7
	rx_byte({$random} % 256);       //生成8位随机数8
	#600
	$finish();
end

//定义任务,每次发送的数据10 位(起始位1+数据位8+停止位1)
task rx_byte(
	input [7:0] data
);
	integer i; //定义一个常量
	//用 for 循环产生一帧数据,for 括号中最后执行的内容只能写 i=i+1
	for(i=0; i<10; i=i+1) begin
		case(i)
		0: uart_rxd <= 1'b0;		//起始位
		1: uart_rxd <= data[0];		//LSB
		2: uart_rxd <= data[1];
		3: uart_rxd <= data[2];
		4: uart_rxd <= data[3];
		5: uart_rxd <= data[4];
		6: uart_rxd <= data[5];
		7: uart_rxd <= data[6];
		8: uart_rxd <= data[7];		//MSB
		9: uart_rxd <= 1'b1;		//停止位
		endcase
		#BPS_CNT; 						//每发送 1 位数据延时
	end		
endtask 							//任务结束

//设置主时钟
always #10 sys_clk <= ~sys_clk;		//时钟20ns,50M
//例化被测试的串口接收驱动

//例化被测试的串口接收驱动
uart_loopback_top
#(
	.UART_BPS			(UART_BPS),		
	.SYS_CLK		   (SYS_CLK)			
)
u_uart_loopback_top(
	.sys_clk        (sys_clk),
	.sys_rst_n        (sys_rst_n),
	.uart_rxd        (uart_rxd),
	.uart_txd        (uart_txd)	
);

endmodule

如图所示:

在这里插入图片描述

开始进行仿真,操作如下:

在这里插入图片描述

开始仿真,仿真波形如图:

在这里插入图片描述

选择需要观察的HDL仿真对象,波形如图:

在这里插入图片描述

3.7 下载验证

由于疫情,一直无法去实验室,故ZYNQ开发板不在身边,该步骤内容待更新

致谢领航者ZYNQ开发板,开启FPGA学习之路!

希望本文对大家有帮助,上文若有不妥之处,欢迎指正

分享决定高度,学习拉开差距

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件测试的分类

这里先讲一些概念&#xff0c;改日从这里边挑几个细讲。&#xff08;给小白看的&#xff09; 按测试对象划分&#xff1a; 界面测试&#xff1a; 软件只是一种工具&#xff0c;软件与人的信息交流是通过界面来进行的&#xff0c;界面是软件与用户交流的最直接的一层&#xff…

基于二次近似(BLEAQ)的双层优化进化算法_matlab程序

参考文献如上。 双层优化问题是一类具有挑战性的优化问题&#xff0c;包含两个层次的优化任务。在这些问题中&#xff0c;下层问题的最优解成为上层问题的可能可行候选。这样的要求使得优化问题难以解决&#xff0c;并使研究人员忙于设计能够有效处理该问题的方法。尽管付出了…

Redis常见面试问题总结

文章目录Redis 基础面试说说你对Redis的了解?说说Redis中的数据类型&#xff1f;说说Redis数据类型对应的数据结构&#xff1f;说说Redis对应的Java客户端有哪些&#xff1f;说说Redis 中持久化发生了什么&#xff1f;说说Redis中持久化以及方式&#xff1f;如何理解Redis中RD…

2022年超实用的推特营销策略

Twitter推广需知的13条基础知识&#xff1a; 1、Twitter日活用户达1亿 2、Twitter月活用户3.25亿 3、Twitter广告价格比其他渠道便宜33% 4、每天产生5亿条推文 5、Twitter推广能够提高29%的线下交易 6、37%的Twitter用户在18到29岁之间 7、86%的带链接推文会比普通推文效…

JUC并发编程与源码分析笔记03-CompletableFuture

Future接口理论知识复习 Future接口&#xff08;FutureTask实现类&#xff09;定义了操作异步任务执行的一些方法&#xff0c;如获取异步任务的执行结果、取消任务的执行、判断任务是否被取消、判断任务执行是否完毕等。 找到java.util.concurrent.Future&#xff0c;看到里面…

Node.js 入门教程 22 将所有 Node.js 依赖包更新到最新版本

Node.js 入门教程 Node.js官方入门教程 Node.js中文网 本文仅用于学习记录&#xff0c;不存在任何商业用途&#xff0c;如侵删 文章目录Node.js 入门教程22 将所有 Node.js 依赖包更新到最新版本22 将所有 Node.js 依赖包更新到最新版本 当使用 npm install <packagename&g…

pytorch 手写数字识别1

目录 概述 加载图片 绘图部分 backward 前言&#xff1a; 这里以一个手写数字识别的例子,简单了解一下pytorch 实现神经网络的过程. 本章重点讲一下加载数据过程 参考&#xff1a; 课时9 手写数字识别初体验-1_哔哩哔哩_bilibili Pytorch中的backward函数 - …

为了让线上代码可追溯, 我开发了这个vite插件

人生的第一个vite插件 前言 想在控制台输出一下前端代码的一些构建信息&#xff0c; 比如打包时间、打包的人, 代码分支、commit是那个&#xff0c;方便在控制台追溯。 背景 遇到的问题 1、场景一 前端多人协同开发的情况下&#xff0c;比方测试站&#xff0c; 你发的代码…

Java 反射系列 —— 学习笔记

Java 反射系列 1. 类成员 为了更好的描述&#xff0c;我们做个约定个通配符 XXXX&#xff0c; 如果是成员变量就代表 Field&#xff0c;如果是类方法就代表 Method&#xff0c;如果是构造器就代表 Constructor。 1.1 获取方法 那么怎么获取到这三类成员呢&#xff1f; 获…

逆势涨薪3k!新媒体运营毅然转行测试,我的入行秘籍是什么?

不尝试永远都不会成功&#xff0c;勇敢的尝试是成功的一半。 大学毕业做运营&#xff0c;业务难精进&#xff0c;薪资难提升 “你大学专业是商务英语&#xff0c;为什么毕业后会选择做新媒体运营呢&#xff1f;” 其实我当时没有想那么多的&#xff0c;商务英语的就业方向一个…

苹果电容笔值得买吗?2022最新电容笔推荐

如今&#xff0c;许多人都喜欢用IPAD来学习记录&#xff0c;或是安静地作画。很多ipad的用户&#xff0c;都很重视它的实用性&#xff0c;因为他们发现&#xff0c;如果有一款功能不错的电容笔来搭配ipad&#xff0c;那么ipad的实用性就会得到极大的提高。事实上&#xff0c;如…

开发 Chrome 扩展程序的利弊

作为一名软件开发人员,您总是希望从事能够提高您的技术技能并赚钱的项目。有什么比开发现金流 chrome 扩展程序更好的方法呢? 在本文中,我将从软件开发人员的角度概述开发 chrome 扩展程序的一些优点和缺点。 开发 Chrome 扩展程序的好处 Chrome 扩展程序是软件开发人员接…

基于遗传算法与神经网络的测井预测(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

【序列召回推荐】(task4)多兴趣召回MIND模型

note Hinton在2011年提出的capsule network&#xff0c;通过EM期望值最大化算法&#xff0c;用动态路由代替反向传播进行更新参数&#xff0c;学习不同capsule之间的连接权重&#xff0c;实现比CNN更优秀的空间关系建模效果&#xff08;CNN可能对同一个图像的旋转版本识别错误…

Java笔记(十四)

文献种类&#xff1a;专题技术总结文献 开发工具与关键技术&#xff1a; IntelliJ IDEA、Java 语言 作者&#xff1a; 方建恒 年级&#xff1a; 2020 撰写时间&#xff1a; 2022 年 11 月 28 日 Java笔记(十四) 今天我给大家继续分享一下我的Java笔记&#xff0c; 我们继续来…

终于读完了阿里云p9专家分享云原生Kubernetes全栈架构师实战文档

都说程序员工资高、待遇好&#xff0c; 2022 金九银十到了&#xff0c;你的小目标是 30K、40K&#xff0c;还是 16薪的 20K&#xff1f;作为一名 Java 开发工程师&#xff0c;当能力可以满足公司业务需求时&#xff0c;拿到超预期的 Offer 并不算难。然而&#xff0c;提升 Java…

Linux便捷操作

1. Tab 这是你不能没有的 Linux 快捷键。它将节省你 Linux 命令行中的大量时间。 只需要输入一个命令&#xff0c;文件名&#xff0c;目录名甚至是命令选项的开头&#xff0c;并敲击 tab 键。它将自动完成你输入的内容&#xff0c;或为你显示全部可能的结果。 如果你只记一个…

中国住宅设施杂志中国住宅设施杂志社中国住宅设施编辑部2022年第9期目录

景观园林《中国住宅设施》投稿&#xff1a;cnqikantg126.com 市政园林景观工程施工项目管理的基本方法与措施 蒋伟;刘巍;张辉; 1-3 低成本风景园林设计与相关问题分析 魏小静; 4-6 城市文化公园景观设计探究——以临夏河州牡丹文化公园为例 姜丽; 7-9 建筑设计 …

一文读懂:低代码和无代码的演进历程、应用范围

低代码和无代码技术的演进发展 整个软件开发的演进路径大致可以分为四个阶段&#xff1a;第一代程序设计语言&#xff1b;第二代是汇编语言&#xff1b;第三代是现在常见的高级语言&#xff0c;比如 Python、Java 等&#xff1b;第四代就是低代码和无代码技术。低代码、无代码…

Pro_11丨跟踪+目标出场自适应切换

量化策略开发&#xff0c;高质量社群&#xff0c;交易思路分享等相关内容 『正文』 ˇ 大家好&#xff0c;今天我们分享第11期策略——跟踪目标出场自适应切换策略。本期策略是2022年度倒数第2期策略&#xff0c;2023年度松鼠俱乐部内容会更加丰富&#xff0c;12月出预告敬请…