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

news2025/1/15 17:29:22

一、实验内容

      用一个真双端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   ; //20ms
    parameter              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 )begin
              if ( cnt1 == delay -1 )
                   cnt1 <= cnt1 ;
              else 
                   cnt1 <= cnt1 +1 ;
         end
         else
         cnt1 <= 0 ;
     
     assign  key_flag_1 = ( cnt1 == delay -2 )?1:0 ;
   
   ///key_flag_2
     always@(posedge sys_clk )
         if(!rst_n)
            cnt2 <= 0 ;
         else if ( key2 == 0 )begin
              if ( cnt2 == delay -1 )
                   cnt2 <= cnt2 ;
              else 
                   cnt2 <= cnt2 +1 ;
         end
         else
         cnt2 <= 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 ;
         else
            wea <= 1 ;
    
    always@(posedge sys_clk )
         if(!rst_n)
            addra <= 0 ;
         else if ( addra >= 99 )
            addra <= 99 ;
         else
            addra <= addra +1 ;
    
    always@(posedge sys_clk )
         if(!rst_n)
            dina <= 0 ;
         else if (dina >= 99)
            dina <= 99 ;
         else
            dina <= 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 ;
          else
             web <= 1 ;
   
   always@(posedge sys_clk )
        if(!rst_n)
           addrb <= 0 ;
        else if ( addrb >= 99 )
           addrb <= 99 ;
        else
           addrb <= addrb +1 ;
    
    always@(posedge sys_clk )
         if(!rst_n)
            dinb <= 0 ;
         else if ( dinb >= 99 )
            dinb <= 99 ;
         else
            dinb <= 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

    );
    存双数的RAM
    reg          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   ;

    
    //state1
    always@(posedge sys_clk )
         if(!rst_n)
            cur_state <= IDLE ;
         else 
            cur_state <= next_state ;
    
    //state2
    always@(*)
          case(cur_state)
              IDLE  :
                     begin
                         next_state = WRITE ;
                     end
              WRITE :
                     begin
                        if ( key_flag_2 )
                            next_state = REG ;
                        else
                            next_state = cur_state ;
                     end
              REG   :
                     begin
                         next_state = READ ;
                     end
              READ  :
                     begin
                         if(addra == 49)
                            next_state = IDLE ;
                         else
                            next_state <= cur_state ;
                     end
          default:;
          endcase
   
   //state3
   always@(posedge sys_clk )
        if(!rst_n)begin
           ena   <= 0 ;
           wea   <= 0 ;
           addra <= 0 ;
           dina  <= 0 ;
           tx_start_b <= 0 ;
        end
        else
            case(cur_state)
                  IDLE   :
                          begin
                               ena   <= 0 ;
                               wea   <= 0 ;
                               addra <= 0 ;
                               dina  <= ram_even_data ;
                          end
                  WRITE  :
                          begin
                              ena <= 1 ;
                              wea <= 1 ;
                              if(addra == 49)
                                 addra <= 49 ;
                              else
                                 addra <= addra +1 ;
                              dina <= ram_even_data ;
                          end
                  REG    :
                          begin
                              addra <= 0 ;
                              ena   <= 0 ;
                              wea   <= 0 ;
                              dina  <= 0 ;
                              tx_start_b <= 1 ;
                          end
                  READ   :
                          begin
                              ena <= 1 ;
                              wea <= 0 ;
                              dina<= 0 ;
                              if(tx_done)begin
                                 tx_start_b <= 1 ;
                                 addra <= addra +1 ;
                              end
                              else begin
                                 tx_start_b <= 0 ;
                                 addra <= addra ;
                                 end
                          end
            default:;
            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 ;
         else
            uart_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 ;
       else
          tx_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        
 
    );
    /读单数的RAM
    reg          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   ;

   
   //state1
   always@(posedge sys_clk )
        if(!rst_n)
           cur_state <= IDLE  ;
        else
           cur_state <= next_state ;
   
   //state2
   always@(*)
        case(cur_state)
            IDLE  :
                   begin
                       next_state = ERITE ;
                   end
            ERITE :
                   begin
                       if(key_flag_1)
                          next_state = REG ;
                       else
                          next_state <= cur_state ;
                   end
            REG   :
                   begin
                       next_state = READ ;//用来发送tx_start
                   end
            READ  :
                   begin
                       if(addra == 49)//100内的单数是50
                         next_state = IDLE ;
                       else
                         next_state = cur_state ;
                   end
        default:;
        endcase
    
    //state3
    always@(posedge sys_clk )
         if(!rst_n)begin
               ena  <= 0 ;
               wea  <= 0 ;
               addra<= 127 ;
               dina <= 0 ;
               tx_start_a <= 0 ;
         end
         else
             case(cur_state)
                     IDLE  :
                            begin
                                 ena  <= 0 ;
                                 wea  <= 0 ;
                                 addra<= 7'd127 ;
                                 dina <= ram_odd_data ;
                            end
                     ERITE :
                            begin
                                ena <= ~ena ;
                                wea <= ~wea ;
                                if( addra == 49 && wea)
                                    addra <= 49 ;
                                else if(wea)
                                    addra <= addra +1 ;
                                    dina <= ram_odd_data ;
                            end
                     REG   :
                            begin
                                ena  <= 0 ;         
                                wea  <= 0 ;         
                                addra<= 0 ;         
                                dina <= 0 ;   
                                tx_start_a <= 1 ;                            
                            end
                     READ  :
                            begin
                                 ena <= 1 ;
                                 wea <= 0 ;
                                 dina<= 0 ;
                                 if(tx_done)begin
                                    tx_start_a <= 1 ;
                                    addra <= addra +1 ;
                                 end
                                 else begin
                                    tx_start_a <= 0 ;
                                    addra <= addra ;
                                    end
                            end
             default:;
             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 ;
       else
          uart_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 ;
       else
          tx_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_start
    always@(posedge sys_clk)
          if(!rst_n)begin
             tx_reg1 <= 0 ;
             tx_reg2 <= 0 ;
           end
           else begin
              tx_reg1 <= rx_done  ;
              tx_reg2 <= tx_reg1  ;
           end
 
   assign  start_flag = tx_reg1 & ~tx_reg2 ;
 
 ///tx_flag
   always@(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 ;
         else
            tx_flag <= tx_flag ;
 ///计时器
  //    cnt 434  
     always@(posedge sys_clk )
           if(!rst_n)
              cnt <= 0;
           else if ( tx_flag == 1 )begin
                if ( cnt == COUNT -1) ///一定要减一,如果不减一,实际会计到435次,反算回去波特率就不是115200了
                    cnt <= 0;
                else
                    cnt <= cnt +1 ;
           end
           else
               cnt <= 0 ;
  
   //  /计数器
      always@(posedge sys_clk )
           if(!rst_n)
              cnt_bit <= 0 ;
           else if ( tx_flag )begin
                if ( cnt == COUNT -1)begin
                    if(cnt_bit == 10)///0123456789 10
                    cnt_bit <= 0 ;
                    else
                    cnt_bit <= cnt_bit +1 ;
                    end
                else
                cnt_bit <= cnt_bit     ;
                end
           else
           cnt_bit <= 0 ;
           
  parameter             MODE_CHECK = 0 ;
 

     always@(posedge sys_clk )
          if(!rst_n)
          tx_data <= 1 ;   //表示没有数据
          else if ( tx_flag )begin
                if (   cnt_bit > 0 && cnt_bit < 9 )
                ///cnt_bit 0 12345678 9 
                ///tx_data 0123456789
                ///uart_data 01234567
                tx_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 ;
                else
                tx_data <= tx_data ;
          end
          else
          tx_data <= 1 ;
          
          
       always@(posedge sys_clk )
          if(!rst_n)           
            tx_done <= 0 ;
          else if (tx_flag)begin
               if ( cnt_bit == 10 && cnt == COUNT -1)
//               if ( cnt_bit == 10 && cnt == MID/2 -1)
                   tx_done <= 1 ;
               else
                   tx_done <= 0 ;       
          end
          else
            tx_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 ;
     
     initial
            begin
                 sys_clk = 0 ;
                 rst_n   = 0 ;
                 #10  
                 rst_n = 1 ;
            end
           
     always #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   ;
  
  initial
        begin
             sys_clk = 0 ;
             rst_n   = 0 ;
             key_1   = 1 ;
             key_2   = 1 ;
             #10
             rst_n   = 1 ;
             #10000
             key_1   = 0 ;

        end
  
  always #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)

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

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

相关文章

从单体服务到微服务:预初始化属性多模式 Web 应用开发记录<四> FreeMarker 视图首次渲染优化

欢迎关注公众号&#xff1a;冬瓜白 相关文章&#xff1a; 多模式 Web 应用开发记录<一>背景&全局变量优化多模式 Web 应用开发记录<二>自己动手写一个 Struts多模式 Web 应用开发记录<三>预初始化属性 经过一段时间的开发和测试&#xff0c;我们成功地…

java的工厂设备管理系统-计算机毕业设计源码16179

摘要 在现代制造业中&#xff0c;高效的设备管理对于确保生产过程的顺利进行至关重要。为了满足工厂对于设备管理的需求&#xff0c;我们设计并实现了一个基于 Java 的工厂设备管理系统。 该系统旨在提供一个全面、可靠且易于使用的解决方案&#xff0c;以帮助工厂有效地管理…

temu a4接口 逆向

声明(lianxi a15018601872) 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 前言(lianxi …

【️讲解下Laravel为什么会成为最优雅的PHP框架?】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

为什么进口主食冻干那么高贵?必入榜主食冻干总结分享

新手养猫人常常会有这样的疑问&#xff1a;为何进口主食冻干价格如此昂贵&#xff0c;但仍有大量养猫达人对其推崇备至&#xff1f;与国产主食冻干相比&#xff0c;进口产品的价格高出3-4倍之多&#xff0c;那么这高昂的价格背后&#xff0c;进口主食冻干是否真的值得推荐&…

偏微分方程笔记(驻定与非驻定问题)

椭圆方程可以看成抛物方程 t → ∞ t\rightarrow\infty t→∞的情况。 抛物&#xff1a; 双曲&#xff1a;

音视频流媒体视频平台LntonAIServer视频监控平台工业排污检测算法

在当今社会&#xff0c;环境保护和可持续发展已成为全球关注的焦点。工业生产作为经济发展的重要支柱&#xff0c;其对环境的影响不容忽视。因此&#xff0c;如何有效地监控和管理工业排污&#xff0c;成为了一个亟待解决的问题。LntonAIServer工业排污检测算法应运而生&#x…

【架构-20】死锁

什么是死锁&#xff1f; 死锁(Deadlock)是指两个或多个线程/进程在执行过程中,由于资源的互相占用和等待,而陷入一种互相等待的僵局,无法继续往下执行的情况。 产生死锁的四个必要条件: &#xff08;1&#xff09;互斥条件(Mutual Exclusion)&#xff1a;至少有一个资源是非共享…

2024 年 亚太赛 APMCM (B题)中文赛道国际大学生数学建模挑战赛 |洪水灾害数据分析 | 数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题&#xff01; 完整内容可以在文章末尾领取&#xff01; 该段文字…

概率论与数理统计_下_科学出版社

contents 前言第5章 大数定律与中心极限定理独立同分布中心极限定理 第6章 数理统计的基本概念6.1 总体与样本6.2 经验分布与频率直方图6.3 统计量6.4 正态总体抽样分布定理6.4.1 卡方分布、t 分布、F 分布6.4.2 正态总体抽样分布基本定理 第7章 参数估计7.1 点估计7.1.1 矩估计…

python库(3):Cerberus库

1 Cerberus简介 Cerberus 是一个Python数据验证库&#xff0c;设计用于验证数据结构的有效性和一致性。它提供了一种简单而强大的方式来定义和应用验证规则&#xff0c;特别适用于处理用户输入的验证、配置文件的检查以及API的参数验证等场景。下面将详细介绍 Cerberus 的特点…

精准畜牧业:多维传感监测及分析动物采食行为

全球畜牧业呈现出一个动态且复杂的挑战。近几十年来&#xff0c;它根据对动物产品需求的演变进行了适应&#xff0c;动物生产系统需要提高其效率和环境可持续性。在不同的畜牧系统中有效行动取决于科学技术的进步&#xff0c;这允许增加照顾动物健康和福祉的数量。精准畜牧业技…

【C++ | 继承】|概念、方式、特性、作用域、6类默认函数

继承 1.继承的概念与定义2.继承的方式2.1继承基本特性2.2继承的作用域2.2.1隐藏赋值兼容 派生类的创建和销毁构造函数拷贝构造赋值重载 1.继承的概念与定义 继承是面向对象编程中的一个重要概念。它的由来可以追溯到软件开发中的模块化设计和代码复用的需求。 在软件开发过程…

山西车间应用LP-LP-SCADA系统的好处有哪些

关键字:LP-SCADA系统, 传感器可视化, 设备可视化, 独立SPC系统, 智能仪表系统,SPC可视化,独立SPC系统 LP-SCADA&#xff08;监控控制与数据采集&#xff09;系统是工业控制系统的一种&#xff0c;主要用于实时监控、控制和管理工业生产过程。 在车间应用LP-SCADA系统&#xf…

【项目日记(四)】搜索引擎-Web模块

❣博主主页: 33的博客❣ ▶️文章专栏分类:项目日记◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你了解更多项目内容 目录 1.前言2.前端模块2.1页面设计2.2后端交互 3.部署到云服务器4.总结 1.前言 在前面的文…

25届最近5年华北电力大学自动化考研院校分析

华北电力大学&#xff08;北京保定&#xff09; 目录 一、学校学院专业简介 二、考试科目指定教材 三、近5年考研分数情况 四、近5年招生录取情况 五、最新一年分数段图表 六、初试大纲复试大纲 七、学费&奖学金&就业方向 一、学校学院专业简介 二、考试科目指…

论文导读 | knowledge-based VQA

背景介绍 传统的视觉问答&#xff08;Visual Question Answering, VQA&#xff09;基准测试主要集中在简单计数、视觉属性和物体检测等问题上&#xff0c;这些问题不需要超出图像内容的推理或知识。然而&#xff0c;在knowledge-based VQA中&#xff0c;仅靠图像无法回答给定的…

DA-LSTM多输入分类|蜻蜓算法-长短期神经网络|Matlab

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、算法介绍&#xff1a; 四、完整程序下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matlab平台编译&am…

大疆2025校招内推

需要内推码的请留言哦 期待你的加入

哪个麦克风唱歌效果好,哪个麦克风好,无线麦克风十大排名分享

​在数字化时代的背景下&#xff0c;声音的传播与记录变得日益重要。无论是会议室、教室还是户外场所&#xff0c;无线领夹麦克风凭借其便携性和稳定的连接性能&#xff0c;成为人们沟通表达的首选工具。面对众多选择&#xff0c;我为你精选了几款性能卓越且性价比高的无线领夹…