当前位置: 首页 > news >正文

Xilinx FPGA:vivado关于真双端口的串口传输数据的实验

一、实验内容

      用一个真双端RAM,端口A和端口B同时向RAM里写入数据0-99,A端口读出单数并存入单端口RAM1中,B端口读出双数并存入但端口RAM2中,当检测到按键1到来时将RAM1中的单数读出显示到PC端,当检测到按键2到来时,将RAM2中的双数显示到pc端。

二、信号流向图

TIPS:这里我本来想将single_ram_1和single_ram_2分成两个单独的模块,但是经过实验后发现,如果分成两个单独的模块的话会导致:

       ①两个单端RAM模块的tx_start(0或1)都会有值给uart_tx模块,即使是RAM1给【1】,RAM2中没有值【0】,uart_tx模块是无法判断 tx_start 到底来自于哪个模块,所以此时uart_tx模块只是能接收到一个tx_start的脉冲信号,但是无法判断信号来自哪个RAM模块,无法获取到相应的uart_data ,最终导致tx_flag都无法变成高电平,那就更不会返回给RAM模块tx_done信号了。

       ②如果单独为了正确信号能赋值给tx_start而重新去写一个ctrl模块的话,那么在ctrl模块中将无法使用判断条件,因为我们将状态作为了赋值条件而不仅仅是key_flag信号。

       那么我的解决方法就是把single_ram_2例化到single_ram_1当中,将single_ram_2输出的数据(uart_data_b及tx_start_b)和single_ram_1输出的数据(douta即tx_start_a)全部放在一个模块即single_ram_1中去做判断,但是我们仍然无法将single_ram_2的状态作为赋值的条件,所以只能采用这种比较粗暴的方式,也就是除了( cur_state == REG || cur_state == READ )时候tx_start <= tx_start_a ;那么其他情况就是tx_start <= tx_start_b ; uart_data的处理也是同样。详见后面程序。

       其实最好的方式是将single_ram_2和single_ram_1写在同一个模块中,程序放在文章最后了。

三、程序设计

(1)按键消抖模块:

这里注意key1和key2不能使用同一个计数器,不然在同一个模块中也会判断出问题。

`timescale 1ns / 1ps
module key_debounce(input           sys_clk    ,input           rst_n      ,input           key1        ,input           key2        ,output          key_flag_1   ,output          key_flag_2);
//    parameter              delay = 100_000_0   ; //20msparameter              delay = 100;// 测试用reg[19:0]               cnt1   ;reg[19:0]               cnt2   ;key_flag_1  always@(posedge sys_clk )if(!rst_n)cnt1 <= 0 ;else if ( key1 == 0 )beginif ( cnt1 == delay -1 )cnt1 <= cnt1 ;else cnt1 <= cnt1 +1 ;endelsecnt1 <= 0 ;assign  key_flag_1 = ( cnt1 == delay -2 )?1:0 ;///key_flag_2always@(posedge sys_clk )if(!rst_n)cnt2 <= 0 ;else if ( key2 == 0 )beginif ( cnt2 == delay -1 )cnt2 <= cnt2 ;else cnt2 <= cnt2 +1 ;endelsecnt2 <= 0 ;assign  key_flag_2 = ( cnt2 == delay -2 )?1:0 ;  endmodule

(2)真双端模块:

IP参数:

`timescale 1ns / 1ps
module the_true_ram(input                 sys_clk     ,input                 rst_n       ,output  [7:0]         ram_odd_data  ,output  [7:0]         ram_even_data);A端口reg          wea     ;reg  [6 : 0] addra   ;reg  [7 : 0] dina    ;wire [7 : 0] douta   ;always@(posedge sys_clk )if(!rst_n)wea <= 0 ;else if ( addra >= 99 )wea <= 0 ;elsewea <= 1 ;always@(posedge sys_clk )if(!rst_n)addra <= 0 ;else if ( addra >= 99 )addra <= 99 ;elseaddra <= addra +1 ;always@(posedge sys_clk )if(!rst_n)dina <= 0 ;else if (dina >= 99)dina <= 99 ;elsedina <= dina +1 ;wire [7:0]        data_a  ;assign       data_a = douta ;assign       ram_odd_data = (data_a%2 == 1)?data_a : ram_odd_data ;///b端口reg          web    ; reg  [6 : 0] addrb  ;reg  [7 : 0] dinb   ;wire [7 : 0] doutb  ;always@(posedge sys_clk )if(!rst_n)web <= 0 ;else if ( addrb >= 99 )web <= 0 ;elseweb <= 1 ;always@(posedge sys_clk )if(!rst_n)addrb <= 0 ;else if ( addrb >= 99 )addrb <= 99 ;elseaddrb <= addrb +1 ;always@(posedge sys_clk )if(!rst_n)dinb <= 0 ;else if ( dinb >= 99 )dinb <= 99 ;elsedinb <= dinb +1 ;wire[7:0]   data_b  ;assign      data_b = doutb ;assign      ram_even_data = (data_b %2 == 0 )? data_b : ram_even_data ;//----------- Begin Cut here for INSTANTIATION Template ---// INST_TAG
true_ram your_instance_name (.clka(sys_clk ),    // input wire clka.ena(1),      // input wire ena.wea(wea),      // input wire [0 : 0] wea.addra(addra),  // input wire [6 : 0] addra.dina(dina),    // input wire [7 : 0] dina.douta(douta),  // output wire [7 : 0] douta.clkb(sys_clk ),    // input wire clkb.enb(1),      // input wire enb.web(web),      // input wire [0 : 0] web.addrb(addrb),  // input wire [6 : 0] addrb.dinb(dinb),    // input wire [7 : 0] dinb.doutb(doutb)  // output wire [7 : 0] doutb
);
// INST_TAG_END ------ End INSTANTIATION Template ---------endmodule

(3)单端RAM2模块:

但其实深度在50就够用了。(100里面的奇数和偶数50)

`timescale 1ns / 1ps
module single_ram_2_FMS(input               sys_clk        ,input               rst_n          ,input               key_flag_2     ,input               tx_done        ,input    [7:0]      ram_even_data  ,output   reg        tx_start_b       ,output   reg[7:0]   uart_data_b);存双数的RAMreg          ena           ;reg  [0 : 0] wea           ;reg  [6 : 0] addra         ;reg  [7 : 0] dina          ;wire [7 : 0] douta         ;//先写再读出localparam         IDLE  = 3'd0 ;localparam         WRITE = 3'd1 ;localparam         REG   = 3'd2 ;localparam         READ  = 3'd3 ;reg[2:0]           cur_state    ;reg[2:0]           next_state   ;//state1always@(posedge sys_clk )if(!rst_n)cur_state <= IDLE ;else cur_state <= next_state ;//state2always@(*)case(cur_state)IDLE  :beginnext_state = WRITE ;endWRITE :beginif ( key_flag_2 )next_state = REG ;elsenext_state = cur_state ;endREG   :beginnext_state = READ ;endREAD  :beginif(addra == 49)next_state = IDLE ;elsenext_state <= cur_state ;enddefault:;endcase//state3always@(posedge sys_clk )if(!rst_n)beginena   <= 0 ;wea   <= 0 ;addra <= 0 ;dina  <= 0 ;tx_start_b <= 0 ;endelsecase(cur_state)IDLE   :beginena   <= 0 ;wea   <= 0 ;addra <= 0 ;dina  <= ram_even_data ;endWRITE  :beginena <= 1 ;wea <= 1 ;if(addra == 49)addra <= 49 ;elseaddra <= addra +1 ;dina <= ram_even_data ;endREG    :beginaddra <= 0 ;ena   <= 0 ;wea   <= 0 ;dina  <= 0 ;tx_start_b <= 1 ;endREAD   :beginena <= 1 ;wea <= 0 ;dina<= 0 ;if(tx_done)begintx_start_b <= 1 ;addra <= addra +1 ;endelse begintx_start_b <= 0 ;addra <= addra ;endenddefault:;endcase//----------- Begin Cut here for INSTANTIATION Template ---// INST_TAG
single_ram ram2 (.clka(sys_clk ),    // input wire clka.ena(ena),      // input wire ena.wea(wea),      // input wire [0 : 0] wea.addra(addra),  // input wire [6 : 0] addra.dina(dina),    // input wire [7 : 0] dina .douta(douta)  // output wire [7 : 0] douta
);
// INST_TAG_END ------ End INSTANTIATION Template ---------always@(posedge sys_clk )if(!rst_n)uart_data_b <= 0 ;else if ( cur_state == READ )uart_data_b <= douta ;elseuart_data_b <= uart_data_b ;always@(posedge sys_clk )if(!rst_n)tx_start_b <= 0 ;else if ( cur_state == REG || cur_state == READ  )tx_start_b <= 1 ;elsetx_start_b <= tx_start_b ;  endmodule

(4)单端RAM1模块

配置和前面一样

`timescale 1ns / 1ps
module single_ram_1_FMS(input                 sys_clk      ,input                 rst_n        ,input                 key_flag_1   ,input                 key_flag_2   ,input                 tx_done      ,input[7:0]            ram_odd_data ,input[7:0]            ram_even_data,output      reg       tx_start     ,output   reg[7:0]     uart_data        );/读单数的RAMreg          ena     ;       reg          wea     ;reg  [6 : 0] addra   ;reg  [7 : 0] dina    ;wire [7 : 0] douta   ;reg           tx_start_a  ;wire           tx_start_b     ; wire[7:0]      uart_data_b    ; 先写再读出localparam             IDLE   = 3'd0 ;localparam             ERITE  = 3'd1 ;localparam             REG    = 3'd2 ;localparam             READ   = 3'd3 ;reg[2:0]        cur_state    ;reg[2:0]        next_state   ;//state1always@(posedge sys_clk )if(!rst_n)cur_state <= IDLE  ;elsecur_state <= next_state ;//state2always@(*)case(cur_state)IDLE  :beginnext_state = ERITE ;endERITE :beginif(key_flag_1)next_state = REG ;elsenext_state <= cur_state ;endREG   :beginnext_state = READ ;//用来发送tx_startendREAD  :beginif(addra == 49)//100内的单数是50next_state = IDLE ;elsenext_state = cur_state ;enddefault:;endcase//state3always@(posedge sys_clk )if(!rst_n)beginena  <= 0 ;wea  <= 0 ;addra<= 127 ;dina <= 0 ;tx_start_a <= 0 ;endelsecase(cur_state)IDLE  :beginena  <= 0 ;wea  <= 0 ;addra<= 7'd127 ;dina <= ram_odd_data ;endERITE :beginena <= ~ena ;wea <= ~wea ;if( addra == 49 && wea)addra <= 49 ;else if(wea)addra <= addra +1 ;dina <= ram_odd_data ;endREG   :beginena  <= 0 ;         wea  <= 0 ;         addra<= 0 ;         dina <= 0 ;   tx_start_a <= 1 ;                            endREAD  :beginena <= 1 ;wea <= 0 ;dina<= 0 ;if(tx_done)begintx_start_a <= 1 ;addra <= addra +1 ;endelse begintx_start_a <= 0 ;addra <= addra ;endenddefault:;endcase//----------- Begin Cut here for INSTANTIATION Template ---// INST_TAG
single_ram ram1 (.clka(sys_clk ),    // input wire clka.ena(ena),      // input wire ena.wea(wea),      // input wire [0 : 0] wea.addra(addra),  // input wire [6 : 0] addra.dina(dina),    // input wire [7 : 0] dina.douta(douta)  // output wire [7 : 0] douta
);
// INST_TAG_END ------ End INSTANTIATION Template ---------always@(posedge sys_clk )if(!rst_n)uart_data <= 0;else if ( cur_state == READ )uart_data <= douta ;elseuart_data <= uart_data_b ;always@(posedge sys_clk )if(!rst_n)tx_start <= 0 ;else if ( cur_state == REG || cur_state == READ  )tx_start <= tx_start_a ;elsetx_start <= tx_start_b ; 例化ram2 single_ram_2_FMS  single_ram_2_FMS_u(.  sys_clk       (sys_clk      )    ,.  rst_n         (rst_n        )    ,.  key_flag_2    (key_flag_2   )    ,.  tx_done       (tx_done      )    ,.  ram_even_data (ram_even_data)    ,.  tx_start_b    (tx_start_b   )    ,.  uart_data_b   (uart_data_b  ));   endmodule

(5)uart_tx模块:

`timescale 1ns / 1ps
module uart_tx(input               sys_clk   ,input               rst_n     ,input  wire[7:0]   uart_data ,input               rx_done   ,        output   reg        tx_data   , output   reg        tx_done);parameter         SYSCLK =   50_000_000  ;parameter         Baud   =   115200      ;parameter         COUNT  =   SYSCLK/Baud ;//434   传输1比特所需要的时钟周期parameter         MID    =   COUNT/2     ;wire                 start_flag ;reg                  tx_flag   ;reg                  tx_reg1   ;reg                  tx_reg2   ;reg[4:0]             cnt_bit   ;reg[10:0]            cnt       ;//tx_startalways@(posedge sys_clk)if(!rst_n)begintx_reg1 <= 0 ;tx_reg2 <= 0 ;endelse begintx_reg1 <= rx_done  ;tx_reg2 <= tx_reg1  ;endassign  start_flag = tx_reg1 & ~tx_reg2 ;///tx_flagalways@(posedge sys_clk)if(!rst_n)tx_flag <= 0 ;else if ( start_flag == 1 )tx_flag <= 1 ;else if ( cnt == COUNT -1 && cnt_bit == 10)
//         else if ( cnt == MID -1 && cnt_bit == 10)tx_flag <= 0 ;elsetx_flag <= tx_flag ;///计时器//    cnt 434  always@(posedge sys_clk )if(!rst_n)cnt <= 0;else if ( tx_flag == 1 )beginif ( cnt == COUNT -1) ///一定要减一,如果不减一,实际会计到435次,反算回去波特率就不是115200了cnt <= 0;elsecnt <= cnt +1 ;endelsecnt <= 0 ;//  /计数器always@(posedge sys_clk )if(!rst_n)cnt_bit <= 0 ;else if ( tx_flag )beginif ( cnt == COUNT -1)beginif(cnt_bit == 10)///0123456789 10cnt_bit <= 0 ;elsecnt_bit <= cnt_bit +1 ;endelsecnt_bit <= cnt_bit     ;endelsecnt_bit <= 0 ;parameter             MODE_CHECK = 0 ;always@(posedge sys_clk )if(!rst_n)tx_data <= 1 ;   //表示没有数据else if ( tx_flag )beginif (   cnt_bit > 0 && cnt_bit < 9 )///cnt_bit 0 12345678 9 ///tx_data 0123456789///uart_data 01234567tx_data <= uart_data [cnt_bit-1]; //这里uart_data是不断随着cnt_bit变化的,只有在第九位的时候才有正确的最终值else if(cnt_bit == 0)tx_data <= 0 ;else if(cnt_bit == 9)tx_data <= (MODE_CHECK == 0)? ^uart_data: ~^uart_data;/*MODE_CHECK == 0是偶校验,假如uart_data是1110_0000,其异或的结果是1,将异或的结果作为校验位,让数据位和校验位异或的结果为0,满足偶校验。假如uart_data是1110_1000,其异或的结果是0,将异或的结果作为校验位,让数据位和校验位异或的结果为0,满足偶校验。奇校验则相反。*/else if (cnt_bit == 10)///停止位tx_data <= 1 ;elsetx_data <= tx_data ;endelsetx_data <= 1 ;always@(posedge sys_clk )if(!rst_n)           tx_done <= 0 ;else if (tx_flag)beginif ( cnt_bit == 10 && cnt == COUNT -1)
//               if ( cnt_bit == 10 && cnt == MID/2 -1)tx_done <= 1 ;elsetx_done <= 0 ;       endelsetx_done <= 0 ;  
endmodule

四、仿真模块

(1)仿真true_ram模块

代码:

`timescale 1ns / 1ps
module test_the_true_ram( );reg                 sys_clk       ;reg                 rst_n         ;wire  [7:0]         ram_odd_data  ;wire  [7:0]         ram_even_data ;initialbeginsys_clk = 0 ;rst_n   = 0 ;#10  rst_n = 1 ;endalways #1 sys_clk = ~sys_clk ; the_true_ram the_true_ram_1(.   sys_clk       (sys_clk      )    ,.   rst_n         (rst_n        )    ,.   ram_odd_data  (ram_odd_data )    ,.   ram_even_data (ram_even_data));endmodule

仿真结果:

(2)仿真TOP:

代码:

`timescale 1ns / 1ps
module test_TOP( );reg                sys_clk   ;reg                rst_n     ;reg                key_1     ;reg                key_2     ;wire               tx_data   ;initialbeginsys_clk = 0 ;rst_n   = 0 ;key_1   = 1 ;key_2   = 1 ;#10rst_n   = 1 ;#10000key_1   = 0 ;endalways #1 sys_clk = ~sys_clk ;TOP TOP_1(.    sys_clk  (sys_clk)   ,.    rst_n    (rst_n  )   ,.    key_1    (key_1  )   ,.    key_2    (key_2  )   ,.    tx_data  (tx_data)  );endmodule

 仿真结果:

TOP:

single_ram_1 :

五、需要注意的一些问题

(1)

(2)

(3)控制模块最好这么写

`timescale 1ns / 1ps
module single_ram_2(input               sysclk          ,input               rst_n           ,input               key_flag1       ,input               key_flag2       ,input               tx_done         ,input       [7:0]   ram_odd_data    , //单数input       [7:0]   ram_even_data   , //双数output  reg         tx_start        ,output  reg [7:0]   uart_data            );
//存单数的RAM
reg          wea    ;
reg          ena    ;
reg   [6:0] addra  ;
reg   [7:0] dina   ;
wire  [7:0] douta  ;
///先写再读出
localparam      IDLE  = 3'd0;
localparam      WRITE = 3'd1; 地址加1
localparam      REG   = 3'd2;  ///缓冲状态   地址清零
localparam      READ  = 3'd3;
reg     [2:0]   cur_state,next_state;
reg             tx_start_a  ;
always@(posedge sysclk)if(!rst_n)cur_state <= IDLE;elsecur_state <= next_state;
always@(*)case(cur_state)IDLE  : beginif(key_flag1)next_state = WRITE;elsenext_state = cur_state;end   WRITE :beginif(addra >= 49)next_state = REG;elsenext_state = cur_state; endREG   :beginnext_state = READ;endREAD  :beginif(addra >= 49)next_state = IDLE;elsenext_state = cur_state;    enddefault:;endcase
always@(posedge sysclk)if(!rst_n)beginaddra <= 0;wea <= 0;ena <= 0;dina <= 0;tx_start_a <= 0;endelsecase(cur_state)IDLE  :beginaddra <= 0;wea <= 0;ena <= 0;dina <= ram_odd_data;  维持2个endWRITE :begin   ///99/48ena <= ~ena;     ///wea <= ~wea;     ///if(addra >= 49)addra <= 49;else if(wea)addra <= addra + 1; dina <= ram_odd_data;endREG   :beginaddra <= 0;ena <= 0;wea <= 0;dina <= 0;tx_start_a <= 1;   ///发送第一个数据endREAD  :begin  ena <= 1;wea <= 0;dina <= 0;if(tx_done)begintx_start_a <= 1;addra <= addra + 1;endelse begintx_start_a <= 0;addra <= addra;end     enddefault:; endcaseblk_mem_gen_2 ram_a (.clka(sysclk),    // input wire clka.ena(ena),      // input wire ena.wea(wea),      // input wire [0 : 0] wea.addra(addra),  // input wire [6 : 0] addra.dina(dina),    // input wire [7 : 0] dina.douta(douta)  // output wire [7 : 0] douta
);
/b端口    存双数
reg             web   ;
reg             enb    ;
reg  [6:0]      addrb ;
reg  [7:0]      dinb  ;
wire [7:0]      doutb;
//状态机
///先写再读出
localparam      RD_IDLE  = 3'd4;
localparam      RD_WRITE = 3'd5;
localparam      RD_REG   = 3'd6;  ///缓冲状态
localparam      RD_READ  = 3'd7;
reg     [2:0]   rd_cur_state,rd_next_state;
reg             tx_start_b      ;
always@(posedge sysclk)if(!rst_n)rd_cur_state <= RD_IDLE;elserd_cur_state <= rd_next_state;
always@(*)case(rd_cur_state)RD_IDLE  : beginif(key_flag2)rd_next_state = RD_WRITE;elserd_next_state = rd_cur_state;end   RD_WRITE :beginif(addrb >= 49)rd_next_state = RD_REG;elserd_next_state = rd_cur_state; endRD_REG   :beginrd_next_state = RD_READ;endRD_READ  :beginif(addrb >= 49)rd_next_state = RD_IDLE;elserd_next_state = rd_cur_state;    enddefault:;endcase
always@(posedge sysclk)if(!rst_n)beginaddrb <= 0;web <= 0;enb <= 0;dinb <= 0;tx_start_b <= 0;endelsecase(rd_cur_state)RD_IDLE  :beginaddrb <= 0;web <= 0;enb <= 0;dinb <= ram_even_data;  ///020406endRD_WRITE :beginenb <= ~enb;  web <= ~web;if(addrb >= 49)addrb <= 49;else if(web)addrb <= addrb + 1; dinb <= ram_even_data;endRD_REG   :beginaddrb <= 0;enb <= 0;web <= 0;dinb <= 0;tx_start_b <= 1;endRD_READ  :begin  enb <= 1;web <= 0;dinb <= 0;if(tx_done)begintx_start_b <= 1;addrb <= addrb + 1;endelse begintx_start_b <= 0;addrb <= addrb;end     enddefault:; endcase
blk_mem_gen_2 ram_b (.clka(sysclk),    // input wire clka.ena(enb),      // input wire ena.wea(web),      // input wire [0 : 0] wea.addra(addrb),  // input wire [6 : 0] addra.dina(dinb),    // input wire [7 : 0] dina.douta(doutb)  // output wire [7 : 0] douta
);
always@(posedge sysclk)if(!rst_n)uart_data <= 0;else if(cur_state == READ )uart_data <= douta  ;else if(rd_cur_state == RD_READ )uart_data <= doutb  ;elseuart_data <= uart_data;always@(posedge sysclk)if(!rst_n)tx_start <= 0;else if(cur_state == REG || cur_state == READ)tx_start <= tx_start_a;else if(rd_cur_state == RD_REG || rd_cur_state == RD_READ)tx_start <= tx_start_b;elsetx_start <= tx_start;endmodule

相关文章:

Xilinx FPGA:vivado关于真双端口的串口传输数据的实验

一、实验内容 用一个真双端RAM&#xff0c;端口A和端口B同时向RAM里写入数据0-99&#xff0c;A端口读出单数并存入单端口RAM1中&#xff0c;B端口读出双数并存入但端口RAM2中&#xff0c;当检测到按键1到来时将RAM1中的单数读出显示到PC端&#xff0c;当检测到按键2到来时&…...

RedisTemplate 中序列化方式辨析

在Spring Data Redis中&#xff0c;RedisTemplate 是操作Redis的核心类&#xff0c;它提供了丰富的API来与Redis进行交互。由于Redis是一个键值存储系统&#xff0c;它存储的是字节序列&#xff0c;因此在使用RedisTemplate时&#xff0c;需要指定键&#xff08;Key&#xff09…...

数据结构与算法基础篇--二分查找

必要前提&#xff1a;有序数组 算法简述&#xff1a;通过不断取中间值和目标target值进行比较&#xff08;中间值&#xff1a;mid (left right) / 2&#xff09; 如果目标值等于中间位置的值&#xff0c;则找到目标&#xff0c;返回中间位置如果目标值小于中间位置的值&…...

python xlsx 导出表格超链接

该Python脚本用于从Excel文件中的第一列提取所有超链接并保存到一个文本文件中。首先&#xff0c;脚本导入必要的库并定义输入和输出文件的路径。然后&#xff0c;它确保输出文件的目录存在。接着&#xff0c;脚本加载Excel文件并选择活动工作表。通过遍历第一列的所有单元格&a…...

Data Guard高级玩法:failover备库后,通过闪回恢复DG备库

作者介绍&#xff1a;老苏&#xff0c;10余年DBA工作运维经验&#xff0c;擅长Oracle、MySQL、PG、Mongodb数据库运维&#xff08;如安装迁移&#xff0c;性能优化、故障应急处理等&#xff09; 公众号&#xff1a;老苏畅谈运维 欢迎关注本人公众号&#xff0c;更多精彩与您分享…...

【Unity2D 2022:NPC】制作任务系统

一、接受任务 1. 编辑NPC对话脚本&#xff1a; &#xff08;1&#xff09;创建静态布尔变量用来判断ruby是否接受到任务 public class NPCDialog : MonoBehaviour {// 创建全局变量用来判断ruby是否接到任务public static bool receiveTask false; } &#xff08;2&#xff…...

【C++深度学习】多态(概念虚函数抽象类)

✨ 疏影横斜水清浅&#xff0c;暗香浮动月黄昏 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;C学习 &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞 &…...

Ubuntu 安装CGAL

一、什么是CGAL CGAL&#xff08;Computational Geometry Algorithms Library&#xff09;是一个广泛使用的开源库&#xff0c;主要用于计算几何算法的实现。该库提供了一系列高效、可靠和易于使用的几何算法和数据结构&#xff0c;适用于各种应用领域。以下是 CGAL 的主要功能…...

RK3568平台开发系列讲解(网络篇)netfilter框架

🚀返回专栏总目录 文章目录 一、Netfilter 介绍二、netfilter 简单案例三、防火墙功能一、Netfilter 介绍 Linux内核自2.4版本开始引入了Netfilter框架,这是一项重要的网络功能增强。Netfilter框架由Linux内核防火墙和网络维护者 Rusty Russell 所提出和实现。这个作者还基于…...

检测音视频文件的声压

FFmpeg使用 ebur128 滤镜检测声压&#xff0c;EBU R128 是欧洲广播联盟&#xff08;European Broadcasting Union&#xff0c;简称 EBU&#xff09;推荐的音频响度测量和归一化标准。 ffmpeg -i input_video.mp4 -filter_complex ebur128peaktrue -f null --f null -&#xff…...

计算机网络-HTTP常见面试题

目录 1. HTTP是什么&#xff1f;2. HTTP常见的状态码&#xff1f;3. HTTP 常见的字段有哪些&#xff1f;4. GET和POST有什么区别&#xff1a;5. GET 和POST方法都是安全和幂等的吗&#xff1f;6. HTTP缓存技术7. HTTP/1.1相比HTTP/1.0提高了什么性能&#xff1f;8. HTTP/2做了什…...

LNMP搭建Discuz和Wordpress

1、LNMP L:linux操作系统 N&#xff1a;nginx展示前端页面web服务 M&#xff1a;mysql数据库&#xff0c;保存用户和密码&#xff0c;以及论坛相关的内容 P&#xff1a;php动态请求转发的中间件 数据库的作用&#xff1a; 登录时验证用户名和密码 创建用户和密码 发布和…...

java中的构造器

Java 中的构造器&#xff08;也称为构造方法&#xff09;是一种特殊的方法&#xff0c;用于初始化对象的状态。在创建 Java 类的实例时&#xff0c;构造器会被自动调用。 构造器的定义&#xff1a; 构造器的名称必须与类名完全相同。构造器没有返回值类型&#xff0c;甚至不包括…...

机器学习筑基篇,​Ubuntu 24.04 快速安装 PyCharm IDE 工具,无需激活!

[ 知识是人生的灯塔&#xff0c;只有不断学习&#xff0c;才能照亮前行的道路 ] Ubuntu 24.04 快速安装 PyCharm IDE 工具 描述&#xff1a;虽然在之前我们安装了VScode&#xff0c;但是其对于使用Python来写大型项目以及各类配置还是比较复杂的&#xff0c;所以这里我们还是推…...

从0开始基于transformer进行股价预测(pytorch版本)

目录 数据阶段两个问题开始利用我们的代码进行切分 backbone网络训练效果 感觉还行&#xff0c;没有调参数。源码比较长&#xff0c;如果需要我后续会发&#xff08;因为太长了&#xff01;&#xff01;&#xff09; 数据阶段 &#xff01;&#xff01;&#xff01;注意&#…...

【多GPU训练方法】

一、数据并行 这是最常用的方法。整个模型复制到每个GPU上。训练数据被均匀分割&#xff0c;每个GPU处理一部分数据。所有GPU上的梯度被收集并求平均。通常使用NCCL&#xff08;NVIDIA Collective Communications Library&#xff09;等通信库实现。参数更新 使用同步后的梯度…...

2024年PMP考试备考经验分享

PMP是项目管理领域最重要的认证之一,本身是IT行业比较流行的证书&#xff0c;近几年在临床试验领域也渐渐流行起来&#xff0c;是我周围临床项PM几乎人手一个的证书。 考试时间&#xff1a;PMP认证考试形式为180道选择题&#xff0c;考试时间为3小时50分。 考试计划&#xff…...

MT3046 愤怒的象棚

思路&#xff1a; a[]存愤怒值&#xff1b;b[i]存以i结尾的&#xff0c;窗口里的最大值&#xff1b;c[i]存以i结尾的&#xff0c;窗口里面包含✳的最大值。 &#xff08;✳为新大象的位置&#xff09; 例&#xff1a;1 2 3 4 ✳ 5 6 7 8 9 则ans的计算公式b3b4c4c5c6b7b8b9…...

深入了解代理IP常见协议:区别与选择

代理服务器在网络使用中扮演着重要的角色&#xff0c;是您设备和互联网之间的中间层。它不仅可以增强网络访问的安全性和隐私保护&#xff0c;还可以提供许多灵活的应用。使用代理时&#xff0c;不同的协议类型对数据交换具有不同的规则和特征。常见的代理协议包括HTTP代理、HT…...

【Linux 线程】线程的基本概念、LWP的理解

文章目录 一、ps -L 指令&#x1f34e;二、线程控制 一、ps -L 指令&#x1f34e; &#x1f427; 使用 ps -L 命令查看轻量级进程信息&#xff1b;&#x1f427; pthread_self() 用于获取用户态线程的 tid&#xff0c;而并非轻量级进程ID&#xff1b;&#x1f427; getpid() 用…...

Dify中的工具

Dify中的工具分为内置工具&#xff08;硬编码&#xff09;和第三方工具&#xff08;OpenAPI Swagger/ChatGPT Plugin&#xff09;。工具可被Workflow&#xff08;工作流&#xff09;和Agent使用&#xff0c;当然Workflow也可被发布为工具&#xff0c;这样Workflow&#xff08;工…...

在Visutal Studio 2022中完成D3D12初始化

在Visutal Studio 2022中完成DirectX设备初始化 1 DirectX121.1 DirectX 简介1.2 DirectX SDK安装2 D3D12初始化2.1 创建Windwos桌面项目2.2 修改符合模式2.3 下载d3dx12.h文件2.4 创建一个异常类D3DException,定义抛出异常实例的宏ThrowIfFailed3 D3D12的初始化步骤3.1 初始化…...

MobaXterm工具

MobaXterm 是一个增强型的 Windows 终端。其为 Windows 桌面提供所有重要的远程网络终端工具&#xff08;如 SSH、X11、RDP、VNC、FTP、SFTP、Telnet、Serial、Mosh、WSL 等&#xff09;&#xff0c;和 Unix 命令&#xff08;如 bash、ls、cat、sed、grep、awk、rsync 等&#…...

二分图练习

对于二分图我们可以用染色法 #include<bits/stdc.h> using namespace std;#define int long long const int N 2e65; int e[N],ne[N],h[N],idx 0; int colo[N]; int num 0;void add(int x,int y){e[idx] y;ne[idx] h[x];h[x] idx; } void dfs(int nod,int c){colo…...

创新设计策略:提升大屏幕可视化设计效果的关键方法

随着科技的不断发展和数据量的快速增长&#xff0c;数据可视化大屏在各个行业中的应用越来越广泛&#xff0c;可以帮助人们更好地理解和分析数据&#xff0c;可视化大屏设计也因此成了众多企业的需求。但很多设计师对可视化大屏设计并不了解&#xff0c;也不知道如何制作可视化…...

论文 | Chain-of-Thought Prompting Elicits Reasoningin Large Language Models 思维链

这篇论文研究了如何通过生成一系列中间推理步骤&#xff08;即思维链&#xff09;来显著提高大型语言模型进行复杂推理的能力。论文展示了一种简单的方法&#xff0c;称为思维链提示&#xff0c;通过在提示中提供几个思维链示例来自然地激发这种推理能力。 主要发现&#xff1…...

[机器学习]-人工智能对程序员的深远影响——案例分析

机器学习和人工智能对未来程序员的深远影响 目录 机器学习和人工智能对未来程序员的深远影响1. **自动化编码任务**1.1 代码生成1.2 自动调试1.3 测试自动化 2. **提升开发效率**2.1 智能建议2.2 项目管理 3. **改变编程范式**3.1 数据驱动开发 4. **职业发展的新机遇**4.1 AI工…...

AI学习环境 没有更好的替代 - (Google)Drive + Colab

在开始正题前&#xff0c;请容许我做一番回顾&#xff0c;并夹带一点点私货&#xff08;谷歌扛旗的开源精神还没有死&#xff0c;并且会是未来的举足轻重的力量&#xff09; 卧龙凤雏&#xff0c;一时瑜亮。一切的缘起应该是世纪初的门户网站乱战。 彼时&#xff0c;谷歌是从…...

【观成科技】Websocket协议代理隧道加密流量分析与检测

Websocket协议代理隧道加密流量简介 攻防场景下&#xff0c;Websocket协议常被用于代理隧道的搭建&#xff0c;攻击者企图通过Websocket协议来绕过网络限制&#xff0c;搭建一个低延迟、双向实时数据传输的隧道。当前&#xff0c;主流的支持Websocket通信代理的工具有&#xf…...

DangerWind-RPC-framework---三、服务端下机

当一台机器下线时&#xff0c;面临很多问题&#xff1a;如何将其从注册中心下线&#xff1f;如何清理释放资源&#xff1f;客户端拉取服务列表时也使用了本地缓存&#xff0c;如何及时更新本地缓存&#xff1f; 服务端机器的优雅下线需要使用ShutdownHook&#xff0c;这相当于添…...

成都市最新疫情最新消息/优化软件下载

/**abstruct 抽象类 中可以定义方法体&#xff0c;也可以不定义方法体。未定义方法体的需要用abstruct定义为抽象方法&#xff0c;则子类必须去实现抽象类的抽象方法。不可被实例化&#xff0c;没有构造函数。interface 接口 中不可以定义方法体&#xff0c;子类实现接口时&…...

佛山微网站建设哪家专业/本地建站软件有哪些

在java1996年发布,当年12月即发布了java bean1.00-A,有什么用呢?通过统一的规范可以设置对象的值(get,set方法),这是最初的java bean;在实际企业开发中,需要实现事务,安全,分布式,javabean就不好用了.sun公司就开始往上面堆功能,这里java bean就复杂为EJB;EJB功能强大,但是太重…...

北京上海网站建设公司/百度一下首页网页

原创不易&#xff0c;转载请附上链接&#xff0c;谢谢http://blog.csdn.net/chen495810242/article/details/39207305 1、RTP Header解析 图1 1) V&#xff1a;RTP协议的版本号&#xff0c;占2位&#xff0c;当前协议版本号为2 2) P&#xff1a;填充标志&#…...

漳州做网站建设/网站设计公司北京

目录 环境 BUG/漏洞编码 症状 触发条件 解决方案 环境 系统平台&#xff1a;N/A 版本&#xff1a;4.3.4,4.3.4.2,4.3.4.3,4.3.4.4,4.3.4.5 BUG/漏洞编码 症状 安全版数据库admin工具自生成SQL语句会将NULL值转换为’NULL’ 导致用工具修改表数据报错。 触发条件 在…...

织梦做的网站打包在dw修改/2022最火营销方案

大小尾数 小尾数&#xff1a;低位字节存储在低内存位置或寄存器的低位地址&#xff0c;高位字节存储在高内存位置或寄存器的高位地址。 大尾数&#xff1a;和小尾数的存储顺序是相反的&#xff0c;低位字节存储在高位地址。 intel采用的是小尾数存储格式&#xff1a; 检测&…...

怎样做网站变手机软件/韩国vs加纳分析比分

JSON的定义&#xff1a; 一种轻量级的数据交换格式&#xff0c;具有良好的可读和便于快速编写的特性。业内主流技术为其提供了完整的解决方案&#xff08;有点类似于正则表达式 &#xff0c;获得了当今大部分语言的支持&#xff09;&#xff0c;从而可以在不同平台间进行数据交…...