【FPGA/verilog -入门学习17】vivado 实现串口自发自收程序

1,需求

PC使用串口助手给FPGA板发送9600 波特率的数据,FPGA板接收到数据后,回复同样的数据给PC

2,需求分析

按模块可以划分为:

rx接收模块,将输入的8位并行rx 数据转换成[7:0]rx_data 信号,当数据接收完成后,同时生成一个rx_done 信号。

bsp_generate_clk_en:接收波特率时钟产生模块,当rx接收到数据时,给一个start信号给波特率时钟产生模块,由bsp时钟产生模块按9600波特率产生时钟使能信号bsp_generate_clk_en 用于同步rx 接收模块接收数据的时序。

tx发送模块:当接收到来子rx 接收模块发过来的rx_done 信号后,将[7:0]rx_data 的数据按波特率时钟产生模块的顺序依次发送出去。

bsp_generate_clk_en:发送波特率时钟产生模块,功能同接收模块

3,绘制框图和时序图

4,编写发送tx 模块,并编写行为测试模块代码测试其功能


`timescale 1ns/1psmodule testbench_top();//参数定义`define CLK_PERIORD        20        //时钟周期设置为20ns(50MHz)    //接口申明
reg i_clk;
reg i_rest_n;wire o_uart_tx;
wire o_uart_tx_done;vlg_design vlg_design_inst(.i_clk(i_clk),.i_rest_n(i_rest_n),.o_uart_tx(o_uart_tx),.o_uart_tx_done(o_uart_tx_done));initial begini_clk <= 0;
i_rest_n <= 0;
#20;
i_rest_n <= 1;#2_000_000_000;
$stop;endalways #(`CLK_PERIORD/2) i_clk = ~i_clk;endmodule
//my_uart_tx
//put o_rx_data to i_uart_tx`timescale 1ns/1ps
module vlg_1ms(input i_clk,  //25Mhzinput i_rest_n,output [7:0]o_data, output reg tx_en);localparam CNT_1MS_MAX = 25*2000 - 1;wire clk_25m;
wire clk_12r5m;
wire clk_100m;
wire locked;clk_wiz_0 instance_name
(// Clock out ports.clk_out1(clk_25m),     // output clk_out1.clk_out2(clk_12r5m),     // output clk_out2.clk_out3(clk_100m),     // output clk_out3// Status and control signals.reset(!i_rest_n), // input reset.locked(locked),       // output locked// Clock in ports.clk_in1(i_clk) // input clk_in1
);      // 每隔1ms 产生一个 tx_en 上升沿脉冲  
reg [15:0] r_cnt_1ms;    
always @(posedge i_clk) beginif(!i_rest_n) r_cnt_1ms <= 0;else if(r_cnt_1ms < CNT_1MS_MAX)  r_cnt_1ms <= r_cnt_1ms + 1;else r_cnt_1ms <= 0;
end    always @(posedge i_clk) beginif(!i_rest_n) tx_en <= 0;else if(r_cnt_1ms == CNT_1MS_MAX)  tx_en <= 1;else tx_en <= 0;
end    
reg [7:0]r_data;
// 每隔1ms ,data = 0000_0001 自增 
always @(posedge i_clk) beginif(!i_rest_n)  r_data <= 0;else if(r_data == 100) r_data <= 0;else if(r_cnt_1ms == CNT_1MS_MAX) r_data <= r_data+1;else ;endassign o_data = r_data;endmodule
//my_uart_tx
//put o_rx_data to i_uart_tx`timescale 1ns/1ps
module vlg_design(input i_clk,  //25Mhzinput i_rest_n,output  o_uart_tx,    output  o_uart_tx_done );wire clk_25m;
wire clk_12r5m;
wire clk_100m;
wire locked;wire tx_bps_start;
wire o_bps_clk_en;wire [7:0]w_data;
wire w_tx_en;clk_wiz_0 instance_name(// Clock out ports.clk_out1(clk_25m),     // output clk_out1.clk_out2(clk_12r5m),     // output clk_out2.clk_out3(clk_100m),     // output clk_out3// Status and control signals.reset(!i_rest_n), // input reset.locked(locked),       // output locked// Clock in ports.clk_in1(i_clk));      // input clk_in1//对被测试的设计进行例化vlg_speed_generate        vlg_speed_generate_inst(.i_clk(clk_25m),.i_rest_n(i_rest_n),.i_bps_start(tx_bps_start),.o_bps_clk_en(o_bps_clk_en) );    ///vlg_my_uart_tx vlg_my_uart_tx_inst(.i_clk(clk_25m),.i_rest_n(i_rest_n),.i_uart_tx_bps_en(o_bps_clk_en),.i_rx_data(w_data),.tx_en(w_tx_en),.tx_bps_start(tx_bps_start),.o_uart_tx(o_uart_tx),.o_uart_tx_done(o_uart_tx_done));///vlg_1ms vlg_1ms_inst(.i_clk(clk_25m),.i_rest_n(i_rest_n),.o_data(w_data),.tx_en(w_tx_en));endmodule

//my_uart_tx
//put o_rx_data to i_uart_tx`timescale 1ns/1ps
module vlg_my_uart_tx(input i_clk,  //25Mhzinput i_rest_n,input i_uart_tx_bps_en, input [7:0]i_rx_data, input tx_en,output reg tx_bps_start,output reg o_uart_tx,    output reg o_uart_tx_done);reg [3:0]txdata_cnt;    //检测tx_en 的高电平脉冲
//检测到高脉冲 tx_bps_start 置1
//当数据发送完成,即start,D0~D7,Stop .txdata_cnt = 10 时结束tx_bps_start 置0reg [1:0]r_tx_en_plus;
wire w_tx_en_pos;always @(posedge i_clk) beginif(!i_rest_n) r_tx_en_plus <= 2'b00;else r_tx_en_plus <= {r_tx_en_plus[0],tx_en};
endassign w_tx_en_pos = r_tx_en_plus[0]& ~r_tx_en_plus[1];//产生 tx_bps_start
always @(posedge i_clk) begin
if(!i_rest_n) tx_bps_start <= 0;
else if(txdata_cnt == 11) tx_bps_start <= 0;
else if(w_tx_en_pos) tx_bps_start <= 1;
end//txdata_cnt 计数 0~10 
always @(posedge i_clk) begin
if(!i_rest_n) txdata_cnt <= 0;
else if(txdata_cnt == 11)  txdata_cnt <= 0;
else if(i_uart_tx_bps_en) txdata_cnt <= txdata_cnt + 1;
end//发出o_uart_tx
wire [9:0]w_data_10 = {1'b1,i_rx_data,1'b0}; // 1,d7,d6,d5,d4,d3,d2,d1,d0,0
always @(posedge i_clk) beginif(!i_rest_n) o_uart_tx <= 1;else if(i_uart_tx_bps_en)  begin case (txdata_cnt)0: o_uart_tx <= w_data_10[0];1: o_uart_tx <= w_data_10[1];2: o_uart_tx <= w_data_10[2];3: o_uart_tx <= w_data_10[3];4: o_uart_tx <= w_data_10[4];5: o_uart_tx <= w_data_10[5];6: o_uart_tx <= w_data_10[6];7: o_uart_tx <= w_data_10[7];8: o_uart_tx <= w_data_10[8];9: o_uart_tx <= w_data_10[9];10: o_uart_tx <= 1;default : o_uart_tx <= 1;endcase end
end//o_uart_tx_done
always @(posedge i_clk) begin
if(!i_rest_n) o_uart_tx_done <= 0;
else if(txdata_cnt == 11)  o_uart_tx_done <= 1;
else  o_uart_tx_done <= 0;
endendmodule
 
`timescale 1ns/1ps
module vlg_speed_generate(input i_clk,  //input 25Mhzinput i_rest_n,input i_bps_start,output reg o_bps_clk_en);localparam bpsrate = 115200;
localparam BPS_COUNT_MAX = 1*25*1000_000/bpsrate - 1;
localparam BPS_COUNT_MAX_DIV_2 = 1*25*1000_000/bpsrate/2-1;reg [11:0]bsp_cnt;always @(posedge i_clk) begin
if(!i_rest_n) bsp_cnt <= 0;
else if(!i_bps_start) bsp_cnt <= 0;
else if(bsp_cnt < BPS_COUNT_MAX)  bsp_cnt <= bsp_cnt+1;else bsp_cnt <= 0;
endalways @(posedge i_clk) beginif(!i_rest_n) o_bps_clk_en <= 0;else if (bsp_cnt == BPS_COUNT_MAX_DIV_2)  o_bps_clk_en <= 1;else o_bps_clk_en <= 0;
endendmodule

仿真波形

5,编写RX接收模块,并编写行为测试模块代码测试其功能


`timescale 1ns/1psmodule testbench_top();//参数定义`define CLK_PERIORD        20        //时钟周期设置为20ns(50MHz)    //接口申明
reg [7:0]data;
reg i_clk;
reg i_rest_n;
reg i_rx;wire o_uart_tx;
wire o_uart_tx_done;wire i_uart_rx_bps_en;
wire [7:0]o_rx_data;
wire o_rx_start;
wire o_uart_rx_done;wire locked;clk_wiz_0 instance_name(// Clock out ports.clk_out1(clk_25m),     // output clk_out1.clk_out2(clk_12r5m),     // output clk_out2.clk_out3(clk_100m),     // output clk_out3// Status and control signals.reset(!i_rest_n), // input reset.locked(locked),       // output locked// Clock in ports.clk_in1(i_clk));      // input clk_in1vlg_my_uart_rx vlg_my_uart_rx_inst(.i_clk(clk_25m),.i_rest_n(i_rest_n),.i_rx(i_rx),.i_uart_rx_bps_en(i_uart_rx_bps_en),.o_rx_data(o_rx_data),.o_rx_start(o_rx_start),.o_uart_rx_done(o_uart_rx_done)); vlg_speed_generate        vlg_speed_generate_inst(.i_clk(clk_25m),.i_rest_n(i_rest_n),.i_bps_start(o_rx_start),.o_bps_clk_en(i_uart_rx_bps_en) );    integer i;initial begini_rx <= 1;
i_clk <= 0;
i_rest_n <= 0;
#20;
i_rest_n <= 1;
data <= 8'b0101_0101;  endalways #(`CLK_PERIORD/2) i_clk = ~i_clk;initial begin@(posedge i_clk);
@(posedge i_rest_n);
#2000_000;
i_rx <= 0;
#10_4166;  //等待1个时钟 1_000_000_000 / 9600for(i = 0;i<8;i=i+1) begin i_rx <= data[i];#10_4166;
end
i_rx <= 1;
#10_4166;
#2000_000;data <= 8'b0000_0101;  
i_rx <= 0;
#10_4166;  //等待1个时钟 1_000_000_000 / 9600for(i = 0;i<8;i=i+1) begin i_rx <= data[i];#10_4166;
end
i_rx <= 1;
#10_4166;
#2000_000;data <= 8'b1111_0000;  
i_rx <= 0;
#10_4166;  //等待1个时钟 1_000_000_000 / 9600for(i = 0;i<8;i=i+1) begin i_rx <= data[i];#10_4166;
end
i_rx <= 1;
#10_4166;
#2000_000;data <= 8'b0000_1111;  
i_rx <= 0;
#10_4166;  //等待1个时钟 1_000_000_000 / 9600for(i = 0;i<8;i=i+1) begin i_rx <= data[i];#10_4166;
end
i_rx <= 1;
#10_4166;
#2000_000;$stop;endendmodule
//my_uart_tx
//put rx_data to i_uart_tx`timescale 1ns/1ps
module vlg_design(input i_clk,  //25Mhzinput i_rest_n,input i_rx,output o_tx
);wire o_uart_tx;
wire o_uart_tx_done;
wire i_uart_rx_bps_en;
(*mark_debug = "true"*)wire [7:0]o_rx_data;
wire o_rx_start;
(*mark_debug = "true"*)wire o_uart_rx_done;
wire locked;wire clk_25m;
wire clk_12r5m;
wire clk_100m;
wire locked;wire tx_bps_start;
wire i_uart_tx_bps_en;//灏唕x_data 杞垚 tx ///vlg_my_uart_tx vlg_my_uart_tx_inst(.i_clk(clk_25m),.i_rest_n(i_rest_n),.i_uart_tx_bps_en(i_uart_tx_bps_en),.i_rx_data(o_rx_data),.tx_en(o_uart_rx_done),.tx_bps_start(tx_bps_start),.o_uart_tx(o_tx),.o_uart_tx_done(o_uart_tx_done));vlg_speed_generate        vlg_speed_generate_tx_inst(.i_clk(clk_25m),.i_rest_n(i_rest_n),.i_bps_start(tx_bps_start),.o_bps_clk_en(i_uart_tx_bps_en) );    //浜х敓rx 杞琩ata鏁版嵁
vlg_my_uart_rx vlg_my_uart_rx_inst(.i_clk(clk_25m),.i_rest_n(i_rest_n),.i_rx(i_rx),.i_uart_rx_bps_en(i_uart_rx_bps_en),.o_rx_data(o_rx_data),.o_rx_start(o_rx_start),.o_uart_rx_done(o_uart_rx_done)
); vlg_speed_generate        vlg_speed_generate_rx_inst(.i_clk(clk_25m),.i_rest_n(i_rest_n),.i_bps_start(o_rx_start),.o_bps_clk_en(i_uart_rx_bps_en) );    // 浜х敓鏃堕挓淇″彿clk_wiz_0 instance_name(// Clock out ports.clk_out1(clk_25m),     // output clk_out1.clk_out2(clk_12r5m),     // output clk_out2.clk_out3(clk_100m),     // output clk_out3// Status and control signals.reset(!i_rest_n), // input reset.locked(locked),       // output locked// Clock in ports.clk_in1(i_clk));      // input clk_in1endmodule
//my_uart_tx
//put o_rx_data to i_uart_tx`timescale 1ns/1ps
module vlg_my_uart_rx(input i_clk,  //25Mhzinput i_rest_n,input(*mark_debug = "true"*) i_rx,  //杈撳叆 input i_uart_rx_bps_en, output  [7:0]o_rx_data, output reg o_rx_start,output reg o_uart_rx_done);reg [3:0]rxdata_cnt;    
wire w_rx_pos;
reg  r_rx_start_pos;
reg [1:0]rx_plus;always @(posedge i_clk) beginif(!i_rest_n)  rx_plus <= 2'b00;else rx_plus <= {rx_plus[0],i_rx};
end    assign w_rx_pos = ~rx_plus[0] & rx_plus[1];// 鎵?鏈塺x 涓嬮檷娌?///
//浜х敓 r_rx_start_pos 鑴夊啿锛屽綋rx 绗竴娆? = 0鏃讹紝杈撳嚭楂樼數骞筹紝鍏朵粬鏃跺埢鎷変綆
always @(posedge i_clk) beginif(!i_rest_n) r_rx_start_pos <= 0;else if(rxdata_cnt == 0) r_rx_start_pos <= w_rx_pos;else r_rx_start_pos <= 0;end    //妫?娴嬪埌 rx 1涓剦鍐茬殑涓嬮檷娌匡紝琛ㄧず淇″彿寮?濮嬶紝鎶?鏈粨鏉燂紝瀹屾垚
//o_rx_start
always @(posedge i_clk) beginif(!i_rest_n) o_rx_start <= 0;else if(rxdata_cnt == 11)o_rx_start <= 0;else if(r_rx_start_pos) o_rx_start <= 1;else  ;
end//浜х敓rxdata_cnt璁℃暟
always @(posedge i_clk) beginif(!i_rest_n) rxdata_cnt <= 0;else if (rxdata_cnt == 11) rxdata_cnt <= 0;else if(i_uart_rx_bps_en)rxdata_cnt <= rxdata_cnt + 1;else ;
endreg [7:0]r_rx_data;    
//鏀堕泦鏁版嵁
always @(posedge i_clk) beginif(!i_rest_n) r_rx_data <= 8'b0000_0000;  else if(i_uart_rx_bps_en)   case (rxdata_cnt)4'd0:    ;//start4'd1:    r_rx_data[0] <= i_rx;4'd2:    r_rx_data[1] <= i_rx;4'd3:    r_rx_data[2] <= i_rx;4'd4:    r_rx_data[3] <= i_rx;4'd5:    r_rx_data[4] <= i_rx;4'd6:    r_rx_data[5] <= i_rx;4'd7:    r_rx_data[6] <= i_rx;4'd8:    r_rx_data[7] <= i_rx;4'd9:;//stop4'd10:;//nonedefault:;//noneendcase end    assign o_rx_data= (rxdata_cnt == 11)?r_rx_data:o_rx_data;//浜х敓o_uart_rx_done
always @(posedge i_clk) beginif(!i_rest_n)  o_uart_rx_done <= 0;else if(rxdata_cnt == 11) o_uart_rx_done <= 1;else o_uart_rx_done <= 0;  
end
endmodule

6,配置IO端口,生成bit文件烧录到板子测试

7,问题1:2024年1月10日

发送单个数据没有问题,但是连发出现异常数据。

对比代码发现例程代码的发送数据,结束位并没有保持1个bsp的完整高电平,而是只保持了一个脉冲的电平

修改代码后,测试ok

//my_uart_tx
//put o_rx_data to i_uart_tx`timescale 1ns/1ps
module vlg_my_uart_tx(input i_clk,  //25Mhzinput i_rest_n,input i_uart_tx_bps_en, input [7:0]i_rx_data, input tx_en,output reg tx_bps_start,output reg o_uart_tx,    output reg o_uart_tx_done);reg [3:0]txdata_cnt;    //检测tx_en 的高电平脉冲
//检测到高脉冲 tx_bps_start 置1
//当数据发送完成,即start,D0~D7,Stop .txdata_cnt = 10 时结束tx_bps_start 置0reg [1:0]r_tx_en_plus;
wire w_tx_en_pos;always @(posedge i_clk) beginif(!i_rest_n) r_tx_en_plus <= 2'b00;else r_tx_en_plus <= {r_tx_en_plus[0],tx_en};
endassign w_tx_en_pos = r_tx_en_plus[0]& ~r_tx_en_plus[1];//产生 tx_bps_start
always @(posedge i_clk) begin
if(!i_rest_n) tx_bps_start <= 0;
else if(txdata_cnt == 10) tx_bps_start <= 0;
else if(w_tx_en_pos) tx_bps_start <= 1;
end//txdata_cnt 计数 0~10 
always @(posedge i_clk) begin
if(!i_rest_n) txdata_cnt <= 0;
else if(txdata_cnt == 10)  txdata_cnt <= 0;
else if(i_uart_tx_bps_en) txdata_cnt <= txdata_cnt + 1;
end//发出o_uart_tx
wire [9:0]w_data_10 = {1'b1,i_rx_data,1'b0}; // 1,d7,d6,d5,d4,d3,d2,d1,d0,0
always @(posedge i_clk) beginif(!i_rest_n) o_uart_tx <= 1;else if(i_uart_tx_bps_en)  begin case (txdata_cnt)0: o_uart_tx <= w_data_10[0];1: o_uart_tx <= w_data_10[1];2: o_uart_tx <= w_data_10[2];3: o_uart_tx <= w_data_10[3];4: o_uart_tx <= w_data_10[4];5: o_uart_tx <= w_data_10[5];6: o_uart_tx <= w_data_10[6];7: o_uart_tx <= w_data_10[7];8: o_uart_tx <= w_data_10[8];9: o_uart_tx <= w_data_10[9];default : o_uart_tx <= 1;endcase end
end//o_uart_tx_done
always @(posedge i_clk) beginif(!i_rest_n) o_uart_tx_done <= 0;else if(txdata_cnt == 10)  o_uart_tx_done <= 1;else  o_uart_tx_done <= 0;
end
endmodule

8,问题2:{} 数据合并要加上前缀

wire [9:0]w_data_10 = {1,i_rx_data,0}; //错误

wire [9:0]w_data_10 = {1'b1,i_rx_data,1'b0}; //正确

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

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

相关文章

C++面试宝典第18题:旋转数组

题目 给定一个数组,将数组中的元素向右移动k个位置,其中k是非负数。要求如下: (1)尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。 (2)使用时间复杂度为O(n)和空间复杂度为O(1)的原地算法解决这个问题。 示例 1: 输入: [1, 2, 3, 4, 5, 6, 7] 和 k…

NR中如何判断是否需要measurement gap来做邻区的测量?

先看下NR中定义的测量。 intra-freq 测量和inter-freq测量可以分为以下几类&#xff1a; 1 SSB based intra-freq 测量&#xff1a;serving cell SSB的center freq与邻区 SSB的center freq 相同并且两个SSB 的SCS也相同。 2 SSB based inter-freq 测量&#xff1a;serving ce…

vue3中ref和reactive联系与区别以及如何选择

vue3中ref和reactive区别与联系 区别 1、ref既可定义基本数据类型&#xff0c;也可以定义引用数据类型&#xff0c;reactive只能定义应用数据类型 2、ref在js中取响应值需要使用 .value&#xff0c;而reactive则直接取用既可 3、ref定义的对象通过.value重新分配新对象时依旧…

自学Python,需要注意哪些?

为什么要学习Python&#xff1f; 在学习Python之前&#xff0c;你不要担心自己没基础或“脑子笨”&#xff0c;我始终认为&#xff0c;只要你想学并为之努力&#xff0c;就能学好&#xff0c;就能用Python去做很多事情。在这个喧嚣的时代&#xff0c;很多技术或概念会不断兴起…

php 函数声明与调用

在 PHP 中&#xff0c;函数声明和调用的语法如下&#xff1a; 函数声明的一般形式为&#xff1a; function functionName($param1, $param2, ...) {// 函数体return $result; // 可选 } 例如&#xff1a; function add($a, $b) {return $a $b; } 函数调用的一般形式为&am…

Elasticsearch 地理空间搜索 - 远超 OpenSearch

作者&#xff1a;来自 Elastic Nathan_Reese 2021 年&#xff0c;OpenSearch 和 OpenSearch Dashboards 开始作为 Elasticsearch 和 Kibana 的分支。 尽管 OpenSearch 和 OpenSearch Dashboards 具有相似的血统&#xff0c;但它们不提供相同的功能。 在分叉时&#xff0c;只能克…

纯化蛋白质树脂ES-4060_用于吸附蛋白质树脂

蛋白纯化树脂是一种固定在基质中的化学物质&#xff0c;具有选择性地与目标蛋白结合&#xff0c;并通过洗脱将其从混合物中分离出来。蛋白纯化树脂的工作原理主要分为三个步骤:吸附、洗脱和再生。 吸附 蛋白纯化树脂通过与目标蛋白之间的特定相互作用来吸附目标蛋白。这些相互…

2023年全国职业院校技能大赛(高职组)“云计算应用”赛项赛卷5

某企业根据自身业务需求&#xff0c;实施数字化转型&#xff0c;规划和建设数字化平台&#xff0c;平台聚焦“DevOps开发运维一体化”和“数据驱动产品开发”&#xff0c;拟采用开源OpenStack搭建企业内部私有云平台&#xff0c;开源Kubernetes搭建云原生服务平台&#xff0c;选…

Kafka集群部署 (KRaft模式集群)

KRaft 模式是 Kafka 在 3.0 版本中引入的新模式。KRaft 模式使用了 Raft 共识算法来管理 Kafka 集群元数据。Raft 算法是一种分布式共识算法&#xff0c;具有高可用性、可扩展性和安全性等优势。 在 KRaft 模式下&#xff0c;Kafka 集群中的每个 Broker 都具有和 Zookeeper 类…

飞腾FT2000-4/D2000-8 VPX主板

产品特点 ①国产飞腾FT2000-4或D2000-8处理器 &#xff0c;同一模块兼容两种处理器&#xff0c;可以根据性能需要选择 ②丰富的万兆以太网、千兆以太网、USB、SATA接口&#xff0c;可用作数据处理、存储、通信服务器 ③内部集成FPGA-V7协处理器&#xff0c;支持SRIO、LVDS等…

【LangChain学习之旅】—(5) 提示工程(上):用少样本FewShotTemplate和ExampleSelector创建应景文案

【LangChain学习之旅】—&#xff08;5&#xff09; 提示工程&#xff08;上&#xff09;&#xff1a;用少样本FewShotTemplate和ExampleSelector创建应景文案 提示的结构LangChain 提示模板的类型使用 PromptTemplate使用 ChatPromptTemplateFewShot 的思想起源使用 FewShotPr…

Android通过Recyclerview实现流式布局自适应列数及高度

调用 FlowAdapter 跟普通recyclerview一样使用 RecyclerView rvLayout holder.getView(R.id.spe_tag_layout); FlowAdapter rvAdapter new FlowAdapter(); FlowLayoutManager flowLayoutManager new FlowLayoutManager(); rvLayout.setLayoutManager(flowLayoutManager); r…

MyBatis源码分析(六):数据源模块

1. 概述 本文&#xff0c;我们来分享 MyBatis 的数据源模块&#xff0c;对应 datasource 包。如下图所示&#xff1a; ​ 在 MyBatis源码分析&#xff08;二&#xff09;&#xff1a;项目结构 中&#xff0c;简单介绍了这个模块如下&#xff1a; 数据源是实际开发中常用的组件…

Python Jinja2:强大易用的模板引擎

Jinja2是一个基于Python的模板引擎&#xff0c;它的功能类似于PHP的smarty&#xff0c;J2ee的Freemarker和velocity。 模板引擎的应用场景非常广泛&#xff0c;它可以将动态数据与静态模板结合&#xff0c;提高发效率和代码可维护性。 我们平时接触各类网页&#xff0c;邮件通…

RIS 辅助无线网络:基于模型、启发式和机器学习の优化方法

目录 abstractintroduction相关研究BACKGROUND AND PROBLEM FORMULATIONS FOR OPTIMIZING RIS-AIDED WIRELESS NETWORKSA 优化RIS-AIDED无线网络的背景和问题公式RIS操作原则&#xff1a;RIS控制&#xff1a;RIS部署 B 总速率/容量最大化C 功率最小化D 能源效率最大化E 用户公平…

Opencv实验合集——实验七:二维码和条形码匹配

1.概念 二维码&#xff08;QR码&#xff09; 概念&#xff1a; 二维码是一种矩阵式的二维条码&#xff0c;由黑白方块组成&#xff0c;可以存储大量的信息&#xff0c;包括文本、链接、数字等。QR码的编码方式是在矩阵中通过不同的黑白方块组合表示不同的信息。 特点&#xf…

李沐-《动手学深度学习》--02-目标检测

一 、目标检测算法 1. R-CNN a . 算法步骤 使用启发式搜索算法来选择锚框&#xff08;选出多个锚框大小可能不一&#xff0c;需要使用Rol pooling&#xff09;使用预训练好的模型&#xff08;去掉分类层&#xff09;对每个锚框进行特征抽取&#xff08;如VGG,AlexNet…)训练…

招投标系统是Electron的纯内网编辑Office Word,可以设置部分区域可编辑,其他的地方不能编辑吗?

问题&#xff1a; 我们是招投标系统的开发公司&#xff0c;框架是用的Electron&#xff0c;需要在纯内网的环境下编辑Office Word&#xff0c;可以设置部分区域可编辑&#xff0c;其他的地方不能编辑吗&#xff08;如下红框位置&#xff09;并且在用户忘记填写一些区域的时候做…

爬虫技术的法律风险与规避方法,你必须知道!

在互联网时代&#xff0c;信息的获取变得异常重要。爬虫技术&#xff0c;一种可以自动提取网页数据的工具&#xff0c;应运而生。然而&#xff0c;随着爬虫技术的广泛应用&#xff0c;一个问题愈发凸显&#xff1a;爬虫究竟是合法的工具&#xff0c;还是潜藏着法律风险的数字探…

K8S 存储卷

意义&#xff1a;存储卷----数据卷 容器内的目录和宿主机的目录进行挂载 容器在系统上的生命周期是短暂的&#xff0c;delete,k8s用控制器创建的pod&#xff0c;delete相当于重启&#xff0c;容器的状态也会回复到初始状态 一旦回到初始状态&#xff0c;所有的后天编辑的文件…