verilog的RTC驱动代码

1.例化


parameter      SLAVE_ADDR =  7'h51        ;  // 器件地址
parameter      BIT_CTRL   =  1'b0         ;  // 字地址位控制参数(16b/8b)
parameter      CLK_FREQ   = 26'd50_000_000;  // i2c_dri模块的驱动时钟频率(CLK_FREQ)
parameter      I2C_FREQ   = 18'd250_000   ;  // I2C的SCL时钟频率
parameter      POINT      = 6'b010100     ;  // 控制点亮数码管小数点的位置
//初始时间设置,从高到低为年到秒,各占8bit
parameter      TIME_INI   = 48'h18_05_23_09_30_00;
//例化i2c_dri,调用IIC协议i2c_dri #(.SLAVE_ADDR  (SLAVE_ADDR),    // slave address从机地址,放此处方便参数传递.CLK_FREQ    (CLK_FREQ  ),    // i2c_dri模块的驱动时钟频率(CLK_FREQ).I2C_FREQ    (I2C_FREQ  )     // I2C的SCL时钟频率
) u_i2c_dri(//global clock.clk         (sys_clk   ),    // i2c_dri模块的驱动时钟(CLK_FREQ).rst_n       (sys_rst_n ),    // 复位信号//i2c interface.i2c_begin    (i2c_exec  ),    // I2C触发执行信号.i2c_rw       (i2c_rh_wl ),    // I2C读写控制信号.i2c_addr    (i2c_addr  ),    // I2C器件内地址.i2c_data_w  (i2c_data_w),    // I2C要写的数据.i2c_data_r  (i2c_data_r),    // I2C读出的数据.i2c_done    (i2c_done  ),    // I 2C一次操作完成.scl         (rtc_scl   ),    // I2C的SCL时钟信号.sda         (rtc_sda   ),    // I2C的SDA信号//user interface.dri_clk     (clk       )     // I2C操作时钟
);//例化PCF8563测量模块
pcf8563 #(.TIME_INI(TIME_INI)
) u_pcf8563(//system clock.clk         (clk       ),    // 时钟信号.rst_n       (sys_rst_n ),    // 复位信号//i2c interface.i2c_rh_wl   (i2c_rh_wl ),    // I2C读写控制信号.i2c_exec    (i2c_exec  ),    // I2C触发执行信号.i2c_addr    (i2c_addr  ),    // I2C器件内地址.i2c_data_w  (i2c_data_w),    // I2C要写的数据.i2c_data_r  (i2c_data_r),    // I2C读出的数据.i2c_done    (i2c_done  ),    // I2C一次操作完成//user interface.key_value   (key_value ),    // 按键切换输入.num         (num       )     // 数码管要显示的数据
); 

2.驱动8563

module pcf8563 #(// 初始时间设置,从高到低为年到秒,各占8bitparameter  TIME_INI = 48'h18_01_02_03_04_05)(//system clock 50MHzinput                 clk        ,    // 时钟信号input                 rst_n      ,    // 复位信号//i2c interfaceoutput   reg          i2c_rh_wl  ,    // I2C读写控制信号output   reg          i2c_exec   ,    // I2C触发执行信号output   reg  [15:0]  i2c_addr   ,    // I2C器件内地址output   reg  [ 7:0]  i2c_data_w ,    // I2C要写的数据input         [ 7:0]  i2c_data_r ,    // I2C读出的数据input                 i2c_done   ,    // I2C一次操作完成//user interfaceinput                 key_value  ,    // 按键切换输入output        [23:0]  num             // 数码管要显示的数据
);//reg define
reg            key_dy0   ;                // 延迟打拍
reg            key_dy1   ;                // 延迟打拍
reg            switch    ;                // 按键切换显示日期、时间
reg   [3:0]    flow_cnt  ;                // 状态流控制
reg  [20:0]    wait_cnt  ;                // 计数等待//PCF8563T的秒、分、时、日、月、年数据
reg   [7:0]    sec       ;                // 秒
reg   [7:0]    min       ;                // 分
reg   [7:0]    hour      ;                // 时
reg   [7:0]    day       ;                // 日
reg   [7:0]    mon       ;                // 月
reg   [7:0]    year      ;                // 年
wire  [23:0]   rtc_time  ;                // 时间,从低位到高位依次是秒、分、时,各8bit
wire  [23:0]   rtc_date  ;                // 日期,从低位到高位依次是日、月、年,各8bit//wire define
wire           neg_sap   ;                // 采下降沿得到的信号//*****************************************************
//**                    main code
//*****************************************************assign neg_sap  = (~key_dy0 & key_dy1);   // 按键按下时,得到一个周期的高电平信号
assign rtc_time = {hour,min,sec};
assign rtc_date = {year,mon,day};
//通过switch切换时间/日期显示
assign num      = switch ? rtc_time : rtc_date;//打拍(采按键时的下降沿)
always @(posedge clk or negedge rst_n) beginif(!rst_n) beginkey_dy0  <= 1'b1;key_dy1  <= 1'b1;endelse beginkey_dy0 <= key_value;key_dy1 <= key_dy0  ;end
end//按键切换
always @(posedge clk or negedge rst_n ) beginif(!rst_n)switch<= 1'b0;else if (neg_sap)switch <= ~switch;
end//从PCF8563T读出的时间、日期数据
always @(posedge clk or negedge rst_n) beginif(!rst_n) beginsec        <= 8'h0;min        <= 8'h0;hour       <= 8'h0;day        <= 8'h0;mon        <= 8'h0;year       <= 8'h0;i2c_exec   <= 1'b0;i2c_rh_wl  <= 1'b0;i2c_addr   <= 8'd0;i2c_data_w <= 8'd0;flow_cnt   <= 4'd0;wait_cnt   <= 21'd0;endelse begini2c_exec <= 1'b0;case(flow_cnt)//上电初始化4'd0: beginif(wait_cnt == 21'd1_000_000) beginwait_cnt<= 21'd0;flow_cnt<= flow_cnt + 1'b1;endelsewait_cnt<= wait_cnt + 1'b1;end//写读秒4'd1: begini2c_exec  <= 1'b1;i2c_addr  <= 8'h02;flow_cnt  <= flow_cnt + 1'b1;i2c_data_w<= TIME_INI[7:0];end4'd2: beginif(i2c_done == 1'b1) beginsec     <= i2c_data_r[6:0];flow_cnt<= flow_cnt + 1'b1;endend//写读分4'd3: begini2c_exec  <= 1'b1;i2c_addr  <= 8'h03;flow_cnt  <= flow_cnt + 1'b1;i2c_data_w<= TIME_INI[15:8];end4'd4: beginif(i2c_done == 1'b1) beginmin     <= i2c_data_r[6:0];flow_cnt<= flow_cnt + 1'b1;endend//写读时4'd5: begini2c_exec  <= 1'b1;i2c_addr  <= 8'h04;flow_cnt  <= flow_cnt + 1'b1;i2c_data_w<= TIME_INI[23:16];end4'd6: beginif(i2c_done == 1'b1) beginhour    <= i2c_data_r[5:0];flow_cnt<= flow_cnt + 1'b1;endend//写读天4'd7: begini2c_exec  <= 1'b1;i2c_addr  <= 8'h05;flow_cnt  <= flow_cnt + 1'b1;i2c_data_w<= TIME_INI[31:24];end4'd8: beginif(i2c_done == 1'b1) beginday     <= i2c_data_r[5:0];flow_cnt<= flow_cnt + 1'b1;endend//写读月4'd9: begini2c_exec  <= 1'b1;i2c_addr  <= 8'h07;flow_cnt  <= flow_cnt + 1'b1;i2c_data_w<= TIME_INI[39:32];end4'd10: beginif(i2c_done == 1'b1) beginmon     <= i2c_data_r[4:0];flow_cnt<= flow_cnt + 1'b1;endend//写读年4'd11: begini2c_exec  <= 1'b1;i2c_addr  <= 8'h08;flow_cnt  <= flow_cnt + 1'b1;i2c_data_w<= TIME_INI[47:40];end4'd12: beginif(i2c_done == 1'b1) beginyear     <= i2c_data_r;i2c_rh_wl<= 1'b1;flow_cnt <= 4'd0;endend4'd13: begin;enddefault: flow_cnt <= 4'd0;endcaseend
endendmodule

3.IIC驱动

module i2c_dri(                                                            input                clk        ,    input                rst_n      ,   //i2c interface                      input                i2c_rw         ,  //0是写,1是读input                i2c_begin      ,  //I2C触发执行信号input        [15:0]  i2c_addr       ,  //I2C器件内地址input        [ 7:0]  i2c_data_w     ,  //I2C要写的数据output  reg  [ 7:0]  i2c_data_r     ,  //I2C读出的数据output  reg          i2c_busy       ,  //I2C忙信号output  reg          i2c_done   ,  //I2C一次操作完成output  reg          scl            ,  //I2C的SCL时钟信号inout                sda   ,             //I2C的SDA信号output       reg    led2    ,   //output reg            dri_clk    //I2C数据(SDA)方向控制                                 );
parameter   SLAVE_ADDR = 7'b1010000   ;  //EEPROM从机地址
parameter   CLK_FREQ   = 26'd50_000_000; //模块输入的时钟频率
parameter   I2C_FREQ   = 18'd250_000;     //IIC_SCL的时钟频率//reg define
reg    [ 9:0]  clk_cnt   ; //分频时钟计数
reg    [ 7:0]  data_wr_t ; //I2C需写的数据的临时寄存
reg    [15:0]  addr_t    ; //读写地址临时寄存
reg    [ 7:0]  data_r    ; //数据
reg    [ 7:0]  data_w    ; //数据
reg            r_or_w   ;   //读写
reg            sda_dir   ; //I2C数据(SDA)方向控制
reg            sda_out   ; //reg     [ 3:0]         flow_cnt    ;        // 流转计数
//wire define
wire          sda_in     ; //SDA输入信号
wire   [8:0]  clk_divide ; //模块驱动时钟的分频系数assign  sda     = sda_out ;     //SDA数据输出或高阻
assign  clk_divide = (CLK_FREQ/I2C_FREQ) >> 2'd2;//模块驱动时钟的分频系数//生成I2C的SCL的四倍频率的驱动时钟用于驱动i2c的操作
always @(posedge clk or negedge rst_n) beginif(!rst_n) begindri_clk <=  1'b0;clk_cnt <= 10'd0;   endelse if(clk_cnt == clk_divide[8:1] - 1'd1) beginclk_cnt <= 10'd0;dri_clk <= ~dri_clk;endelseclk_cnt <= clk_cnt + 1'b1;
end
//////////////////////////////////
reg    [ 7:0]  data_temp    ; //数据
reg     flow_cnt_ok ;        // 流转计数
reg    [ 6:0]  cnt       ; //计数
////////////////////////////////////////////////
/*
写
0:空闲
1:加载器件地址
2:写字节
3:加载16为地址高字节
4:写字节
5:加载16为地址低字节
6:写字节
7:加载数据
8:写字节
9:发送停止位读
0:空闲
1:加载器件地址
2:写字节
3:加载16为地址高字节
4:写字节
5:加载16为地址低字节
6:写字节
10:加载器件地址+读
8:写字节
11:读数据
12:发送停止*/
always @(posedge dri_clk or negedge rst_n) beginif(!rst_n) beginscl <=  1'b1;sda_out <=  1'b1;cnt<=  7'b0;flow_cnt<=4'b0;i2c_busy<=1'b0;flow_cnt_ok<= 1'b0;cnt<= 1'b0;end////////////////////////////////////////////else if (flow_cnt_ok&&(r_or_w==0))begin flow_cnt<=((flow_cnt>=4'd9)? (4'd0):(flow_cnt+4'd1));//状态技术+1i2c_done<=1'b0;flow_cnt_ok<= 1'b0;end else if (flow_cnt_ok&&(r_or_w==1))begin if(flow_cnt<=4'd5)flow_cnt<=flow_cnt+1'b1;else if (flow_cnt==4'd6)flow_cnt<=4'd10;else if (flow_cnt==4'd10)flow_cnt<=4'd8;else if (flow_cnt==4'd8)flow_cnt<=4'd11;     else if (flow_cnt==4'd11)flow_cnt<=4'd12;else if (flow_cnt==4'd12)flow_cnt<=4'd0;i2c_done<=1'b0;flow_cnt_ok<= 1'b0;end ///////////////////////////////////////////////else if(flow_cnt == 4'b0) beginif(i2c_begin==1'b1&&i2c_busy==1'b0) beginr_or_w<=i2c_rw;addr_t<=i2c_addr;data_w<=i2c_data_w;i2c_busy<=1'b1;flow_cnt_ok<=1'b1;endelse flow_cnt = 4'b0;endelse if(flow_cnt == 4'd1) begin//加载写字节data_temp<={SLAVE_ADDR,1'b0};flow_cnt_ok<=1'b1;endelse if(flow_cnt == 4'd3) begin//加载eeprom地址//data_temp<=addr_t[15:8];flow_cnt_ok<=1'b1;endelse if(flow_cnt == 4'd4) begin//加载eeprom地址//data_temp<=addr_t[15:8];flow_cnt_ok<=1'b1;endelse if(flow_cnt == 4'd5) begin//加载低8位地址data_temp<=addr_t[7:0];flow_cnt_ok<=1'b1;endelse if(flow_cnt == 4'd7) begin//加载要写入的数据data_temp<=data_w[7:0];flow_cnt_ok<=1'b1;endelse if(flow_cnt == 4'd9) begin//发送STOPcnt     <= cnt +1'b1 ;case(cnt)7'd1 : sda_out <= 1'b0;          //开始I2C7'd2 : scl <= 1'b1;              7'd3 : sda_out <= 1'b1; //传送器件地址7'd4 : begini2c_busy<=1'b0;i2c_done<=1'b1;scl <= 1'b1;sda_out <= 1'b1;flow_cnt_ok<=1'b1;cnt <= 1'b0;enddefault :  ;   endcaseendelse if(flow_cnt == 4'd2||flow_cnt == 4'd6||flow_cnt == 4'd8) begin//发送一个字节cnt     <= cnt +1'b1 ;case(cnt)//7'd0 :begin scl <= 1'b1;sda_out <= 1'b1;end7'd1 : sda_out <= 1'b0;          //开始I2C7'd3 : scl <= 1'b0;              7'd4 : sda_out <= data_temp[7]; //传送器件地址7'd5 : scl <= 1'b1;              7'd7 : scl <= 1'b0;              7'd8 : sda_out <= data_temp[6]; 7'd9 : scl <= 1'b1;              7'd11: scl <= 1'b0;              7'd12: sda_out <= data_temp[5]; 7'd13: scl <= 1'b1;              7'd15: scl <= 1'b0;              7'd16: sda_out <= data_temp[4]; 7'd17: scl <= 1'b1;              7'd19: scl <= 1'b0;              7'd20: sda_out <= data_temp[3]; 7'd21: scl <= 1'b1;              7'd23: scl <= 1'b0;              7'd24: sda_out <= data_temp[2]; 7'd25: scl <= 1'b1;              7'd27: scl <= 1'b0;              7'd28: sda_out <= data_temp[1]; 7'd29: scl <= 1'b1;              7'd31: scl <= 1'b0;              7'd32: sda_out <= data_temp[0];          //0:写7'd33: scl <= 1'b1;              7'd35: scl <= 1'b0;              7'd36: sda_out <= 1'bz;  //            7'd37: scl     <= 1'b1;    7'd38: begin                     //从机应答 if(sda == 1'b1) begin          //高电平表示未应答cnt <= 1'b0;flow_cnt = 4'b0;end    end                                          7'd39: begin                     scl <= 1'b0;                 cnt <= 1'b0;flow_cnt_ok<=1'b1;enddefault :  ;    endcaseendelse if(flow_cnt == 4'd10) begin//加载要读的芯片地址data_temp<={SLAVE_ADDR,1'b1};flow_cnt_ok<=1'b1;scl <= 1'b1;//添加起始位endelse if(flow_cnt == 4'd12) begin//发送STOPcnt     <= cnt +1'b1 ;case(cnt)7'd1 : sda_out <= 1'b0;          //开始I2C7'd2 : scl <= 1'b1;              7'd3 : sda_out <= 1'b1; //传送器件地址7'd4 : begini2c_busy<=1'b0;i2c_done<=1'b1;i2c_data_r<=data_r;scl <= 1'b1;sda_out <= 1'b1;flow_cnt_ok<=1'b1;cnt <= 1'b0;enddefault :  ;   endcaseendelse if(flow_cnt == 4'd11) begin//加载要读的芯片地址cnt     <= cnt +1'b1 ;case(cnt)7'd1 : sda_out <= 1'bz;          //开始I2C7'd3 : scl <= 1'b0;              7'd5 : scl <= 1'b1; 7'd6 : data_r[7]<=sda;7'd7 : scl <= 1'b0;              7'd9 : scl <= 1'b1;  7'd10 : data_r[6]<=sda;7'd11: scl <= 1'b0;              7'd13: scl <= 1'b1;    7'd14 : data_r[5]<=sda;7'd15: scl <= 1'b0;              7'd17: scl <= 1'b1;              7'd18: data_r[4]<=sda;7'd19: scl <= 1'b0;              7'd21: scl <= 1'b1;              7'd22: data_r[3]<=sda;7'd23: scl <= 1'b0;              7'd25: scl <= 1'b1;              7'd26: data_r[2]<=sda;7'd27: scl <= 1'b0;              7'd29: scl <= 1'b1;              7'd30:data_r[1]<=sda;7'd31: scl <= 1'b0;              7'd33: scl <= 1'b1;              7'd34: data_r[0]<=sda;7'd35: scl <= 1'b0;  7'd36: sda_out <= 1'b0;           7'd37: scl <= 1'b1; 7'd39: scl <= 1'b0; 7'd40: sda_out <= 1'b1; 7'd42: begin                                  cnt <= 1'b0;flow_cnt_ok<=1'b1;enddefault :  ;  endcase  endelse ;
end
endmodule

4.波形

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

【k8s、docker】Headless Service(无头服务)

文章目录问题背景1、什么是Headless Service1.2 为什么 Zookeeper 使用 Headless Service&#xff1f;1.2 Headless Service 的 DNS 行为1.3 验证示例1.4 如何创建 Headless Service&#xff1f;2. zk-0.zookeeper.default.svc.cluster.local 域名是如何创建出来的&#xff1f;…

scikit-learn/sklearn学习|套索回归Lasso解读

【1】引言 前序学习进程中&#xff0c;对用scikit-learn表达线性回归进行了初步解读。 线性回归能够将因变量yyy表达成由自变量xxx、线性系数矩阵www和截距bbb组成的线性函数式&#xff1a; y∑i1nwi⋅xibwTxby\sum_{i1}^{n}w_{i}\cdot x_{i}bw^T{x}byi1∑n​wi​⋅xi​bwTxb实…

暴雨服务器:以定制化满足算力需求多样化

在数字经济与实体经济深度融合的浪潮下&#xff0c;互联网行业正经历着前所未有的技术变革。大数据分析、云计算服务、人工智能算法等技术的快速演进&#xff0c;推动着企业对于高性能计算基础设施的需求呈现指数级增长。据IDC数据显示&#xff0c;互联网行业已成为全球服务器采…

JavaScript字符串详解

创建字符串&#xff1a; 1.使用字面量(推荐)&#xff1a; 这是最常用、最直接的方式。你可以用单引号 ()、双引号 (") 或反引号 () 把文本包起来 let singleQuote 单引号; let doubleQuote "双引号"; let templateLiteral 反引号;2.使用String 构造函数&…

Kiro Preview 应用评测

Kiro应用评测 Kiro 是一个由亚马逊推出的 AI 驱动的智能开发环境&#xff0c;从原型到生产全程陪伴您的开发过程。它将"灵感编程"的流畅性与规范的清晰性相结合&#xff0c;帮助您更快地构建更好的软件。 昨天收到了Kiro的试用邮件&#xff0c;收到邮件后第一时间下载…

Flink2.0学习笔记:Flink服务器搭建与flink作业提交

一&#xff0c;下载flink:Downloads | Apache Flink,解压后放入IDE工作目录&#xff1a;我这里以1.17版本为例 可以看到&#xff0c;flink后期的版本中没有提供window启动脚本:start-cluster.bat 所以这里要通过windows自带的wsl 系统启动它 打开终端依次运行下列命令完成w…

MySQL锁的分类

MySQL锁可以按照多个维度进行分类&#xff0c;下面我用最清晰的方式为你梳理所有分类方式&#xff1a;一、按锁的粒度分类&#xff08;最常用分类&#xff09;锁类型作用范围特点适用引擎示例场景表级锁整张表开销小、加锁快&#xff0c;并发度低MyISAM, MEMORY数据迁移、全表统…

电脑上搭建HTTP服务器在局域网内其它客户端无法访问的解决方案

在电脑上开发一套HTTP服务器的程序在调试时&#xff0c;在本机内访问正常&#xff0c;但是在本机外访问就不正常&#xff0c;外部客户端无法访问或无法连接到本机的服务器的问题&#xff0c;这可能涉及网络配置、防火墙、端口转发或服务绑定等问题&#xff0c;在这里提供了解决…

双指针和codetop2(最短路问题BFS)

双指针和codetop21.双指针1.[复写0](https://leetcode.cn/problems/duplicate-zeros/)2.动态规划1.[珠宝的最高价值](https://leetcode.cn/problems/li-wu-de-zui-da-jie-zhi-lcof/description/)2.[解码方法](https://leetcode.cn/problems/decode-ways/)3.[下降路径最小和](ht…

基于K邻近算法(KNN)的数据回归预测模型

一、作品详细简介 1.1附件文件夹程序代码截图 全部完整源代码&#xff0c;请在个人首页置顶文章查看&#xff1a; 学行库小秘_CSDN博客https://blog.csdn.net/weixin_47760707?spm1000.2115.3001.5343 1.2各文件夹说明 1.2.1 main.m主函数文件 该MATLAB代码实现了一个基于…

【123页PPT】化工行业数字化解决方案(附下载方式)

篇幅所限&#xff0c;本文只提供部分资料内容&#xff0c;完整资料请看下面链接 https://download.csdn.net/download/2501_92808859/91654005 资料解读&#xff1a;【123页PPT】化工行业数字化解决方案 详细资料请看本解读文章的最后内容。化工行业作为国民经济的重要支柱之…

c++--文件头注释/doxygen

文件头注释 开源项目&#xff1a; /*** file robot_base.cpp* author Mr.Wu* date 2025-05-28* version 1.0.0* brief Robot basic drive to communicate with controller** copyright Copyright (c) 2025 google.** Licensed under the Apache License, Version 2.…

【教程】笔记本安装FnOS设置合盖息屏不休眠

重装FnOS好几次了&#xff0c;合盖后屏幕关闭但不休眠的问题每次都要网上找参差不齐的教程&#xff0c;麻烦死了&#xff0c;索性记录一下方便以后复制粘贴。 使用root登录 sudo -i修改系统配置文件编辑logind.conf文件&#xff1a; 打开终端&#xff0c;输入以下命令以编辑log…

深入解析 Monkey OCR:本地化、多语言文本识别的利器与实践指南

在信息爆炸的时代&#xff0c;从图片、扫描文档中高效提取结构化文本的需求日益迫切。OCR&#xff08;光学字符识别&#xff09;技术成为解决这一问题的核心工具。尽管市面上有 Abbyy FineReader、Adobe Acrobat 等商业巨头&#xff0c;以及 Tesseract、PaddleOCR 等开源方案&a…

动态规划法 - 53. 最大子数组和

什么是动态规划法&#xff1f; 简单说&#xff0c;动态规划&#xff08;Dynamic Programming&#xff0c;简称 DP&#xff09; 是一种**「把复杂问题拆解成小问题&#xff0c;通过解决小问题来解决大问题」**的方法。 核心思路有两个&#xff1a; 1.拆分问题&#xff1a;把原问…

STM32CUBEMX配置stm32工程

1.新建工程2.选择芯片3.配置各种片上外设和时钟4.创建工程5.根据文件内容进行修改工程注意&#xff1a;最好根据工程规范来做&#xff0c;因为有时我们需要更改配置并重新生成&#xff0c;如果不按规范来会导致部分代码会被系统清除&#xff0c;在工程中中有很多成对的BEGIN和E…

Day07 缓存商品 购物车

缓存菜品问题说明用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大。结果&#xff1a;系统响应慢&#xff0c;用户体验差实现思路通过 Redis 来缓存菜品数据&#xff0c;减少数据库查询操作。缓存逻辑分…

Jenkins(集群与流水线配置)

Jenkins&#xff08;集群与流水线配置&#xff09; Jenkins集群 集群化构建可以提升构建效率&#xff0c;也可以并发在多台机器上执行构建。 安装前提&#xff1a;内存至少512MB、Java 17 以上、Maven环境、Git环境 配置集群步骤 配置节点菜单新建节点查看节点配置状态 新建完节…

深入剖析ROS参数服务器通信机制 ——共享全局数据的“云端仓库”实现原理

​1. 核心概念&#xff1a;分布式数据共享容器​ ​定位​&#xff1a;ROS参数服务器&#xff08;Parameter Server&#xff09;是ROS架构中的全局共享存储系统&#xff0c;相当于机器人的“云端仓库”。 ​作用​&#xff1a; 存储多节点共享的静态配置参数&#xff08;如机器…

21.AlexNet

虽然LeNet在手写数字识别上取得了不错的结果&#xff0c;但是他在对于更大的数据集效果就十分有限。 一方面&#xff0c;对于更大尺寸的图像效果有限 另一方面&#xff0c;对于更多分类的任务效果有限 自LeNet后的十几年&#xff0c;计算机视觉领域步入寒冬&#xff0c;神经网络…