FPGA驱动SDRAM

文章目录

  • 一.SDRAM简介(手册分析)
    • 1.1存储空间
    • 1.2特征
    • 1.3引脚
    • 1.4内部结构
    • 1.5需要关注的一些时间
    • 1.6模式寄存器
    • 1.7命令真值表
  • 二.时序分析(手册分析)
    • 2.1Avalon时序
    • 2.2行激活时序
    • 2.3列读写时序
    • 2.4读数据
    • 2.5写数据
  • 三.初步设计
    • 3.1状态转移图
    • 3.2模块设计图
  • 四.操作步骤
  • 五.代码
  • 六.仿真&效果
  • 七.参考

一.SDRAM简介(手册分析)

  • SDRAM(同步动态随机存取存储器)。

1.1存储空间

  • 本实验中使用的SDRAM存储空间被分为4个bank(如下图就是一个bank),每个bank选定行地址13位,列地址9位可以确定一个存储单元,每个存储单元16bit。那么它的存储空间就是(4 * (2^13) * (2^9) * 16) = 256M(bit)
    在这里插入图片描述

1.2特征

  • 7.8us刷新一行
    在这里插入图片描述

  • CAS延迟为2或3

  • 突发长度和突发延迟控制
    在这里插入图片描述

(这里先有印象,具体CAS latency,突发长度和突发类型后续会提到)

1.3引脚

在这里插入图片描述

1.4内部结构

在这里插入图片描述

1.5需要关注的一些时间

在这里插入图片描述

1.6模式寄存器

在这里插入图片描述

  • 那么突发长度是什么意思?所谓翻译为突发不如翻译成连续。那所谓的“突发”就是当我们对一个地址寻址并操作完成后,不用再去寻址,直接进行操作,那么就可以节省下来很多时间
  • 突发长度1、2、4、8、全页都是啥意思呢?那经过前面解释突发,就是连续操作多少个数据;至于全页,是每次写入某个bank512个数据(同一个bank,同一个行地址)

1.7命令真值表

在这里插入图片描述

二.时序分析(手册分析)

2.1Avalon时序

在这里插入图片描述

在这里插入图片描述

2.2行激活时序

  • 初始化操作完成后,无论读写都要进行行激活(选bank和行地址)
    在这里插入图片描述

  • CS片选信号:低有效;

  • BA0,BA1:bank寻址;

  • Address中A0-A12:行地址寻址;

  • RAS行选通低,CAS列选通高:进行行选址;

2.3列读写时序

  • 行激活操作后,进行列寻址。因为行列地址是复用的,列寻址的地址线仍然是行地址的A0-A12。上文有提到,通过RAS和CAS高低电平来控制Address是行地址还是列地址。
    在这里插入图片描述

  • CS片选信号:低有效;

  • Adress中A0-A8:列地址寻址;

  • Adress中A10:是否进行预充电;

  • RAS行选通高,CAS列选通低:进行列选址;

  • WE位低:写命令;WE为高读命令;

2.4读数据

在这里插入图片描述

  • CAS发完后,经过一段时间才有数据输出,我们之前提到过CAS潜伏周期,根据模式寄存器配置,这里延时对应的周期数

2.5写数据

在这里插入图片描述

  • 注意:写数据是不需要CAS潜伏周期的

三.初步设计

3.1状态转移图

在这里插入图片描述

  • 手册上的状态图如上,感觉有些乱,个人简化整理了一下
    在这里插入图片描述

3.2模块设计图

在这里插入图片描述

四.操作步骤

  • Tools -> Platform Designer
    在这里插入图片描述

  • 搜索SDRAM并选择
    在这里插入图片描述

  • 配置参数如下
    在这里插入图片描述

  • 相关延时如下
    在这里插入图片描述

  • 时钟设置为100mHz
    在这里插入图片描述

  • 连线和端口命名
    在这里插入图片描述

  • Generate
    在这里插入图片描述

五.代码

  • sdram_control模块
/**************************************功能介绍***********************************
Date	: 
Author	: Alegg xy.
Version	: 
Description: 
*********************************************************************************///---------<模块及端口声名>------------------------------------------------------
module sdram_control( input				clk             ,input				rst_n		    ,//写数据// input               wr_req          ,input       [7:0]   wr_data         ,input               wr_data_vld     ,//读数据input               rd_req          ,   input               rd_ready        ,//串口发送模块就绪output      [7:0]   rd_data         ,output              rd_data_vld     ,//clkinput               wr_clk          ,input               rd_clk          ,//avalon_masteroutput      [23:0]  am_addr         ,output              am_wr_req_n     ,output              am_rd_req_n     ,output      [15:0]  am_wr_data      ,input       [15:0]  am_rd_data      ,input               am_rd_data_vld  ,output      [1:0]   am_be_n         ,output              am_cs           ,input               am_waitrequest  
);								 
//---------<参数定义>--------------------------------------------------------- //状态机参数定义localparam  IDLE    = 4'b0001,//WRITE   = 4'b0010,//READ    = 4'b0100,//DONE    = 4'b1000;//reg 	[3:0]	cstate     ;//现态reg		[3:0]	nstate     ;//次态wire            IDLE_WRITE  ;wire            IDLE_READ   ;wire            WRITE_DONE  ;wire            READ_DONE   ;wire            DONE_IDLE   ;//fifowire            wr_fifo_rd_req  ;wire    [15:0]  wr_fifo_rd_data ;wire            wr_fifo_empty   ;wire            wr_fifo_full    ;wire    [5:0]   wr_fifo_usedw   ;wire            rd_fifo_wr_req  ;wire    [15:0]  rd_fifo_wr_data ;wire            rd_fifo_empty   ;wire            rd_fifo_full    ;wire    [5:0]   rd_fifo_usedw   ;//计数器reg			[8:0]	cnt_burst	   	;wire				add_cnt_burst	;wire				end_cnt_burst	;reg			[23:0]	cnt_wr_addr	   	;wire				add_cnt_wr_addr	;wire				end_cnt_wr_addr	;reg			[23:0]	cnt_rd_addr	   	;wire				add_cnt_rd_addr	;wire				end_cnt_rd_addr	;parameter           ADDR_MAX  = 512,BURST_MAX = 5;
//---------<内部信号定义>-----------------------------------------------------//fifowrfifo	wrfifo_inst (.aclr   ( ~rst_n ),.data   ( wr_data ),.rdclk  ( clk ),.rdreq  ( wr_fifo_rd_req ),.wrclk  ( wr_clk ),.wrreq  ( wr_data_vld && ~wr_fifo_full ),.q      ( wr_fifo_rd_data ),.rdusedw( wr_fifo_usedw ),.rdempty( wr_fifo_empty ),.wrfull ( wr_fifo_full ));assign wr_fifo_rd_req = add_cnt_wr_addr && ~wr_fifo_empty;rdfifo	rdfifo_inst (.aclr   ( ~rst_n ),.data   ( rd_fifo_wr_data ),.rdclk  ( rd_clk ),.rdreq  ( rd_data_vld ),.wrclk  ( clk ),.wrreq  ( rd_fifo_wr_req && ~rd_fifo_full ),.q      ( rd_data ),.rdusedw( rd_fifo_usedw ),.rdempty( rd_fifo_empty ),.wrfull ( rd_fifo_full ));assign rd_data_vld  = rd_ready && ~rd_fifo_empty  ;assign rd_fifo_wr_data = am_rd_data;assign rd_fifo_wr_req = am_rd_data_vld;//第一段:时序逻辑描述状态转移always @(posedge clk or negedge rst_n)begin if(!rst_n)begincstate <= IDLE;end else begin cstate <= nstate;end end//第二段:组合逻辑描述状态转移规律和状态转移条件always @(*) begincase(cstate)IDLE    :beginif (IDLE_WRITE) beginnstate = WRITE;endelse if (IDLE_READ) beginnstate = READ;endelse beginnstate = cstate;endendWRITE   :beginif (WRITE_DONE) beginnstate = DONE;endelse beginnstate = cstate;endendREAD    :beginif (READ_DONE) beginnstate = DONE;endelse beginnstate = cstate;endendDONE    :beginif (DONE_IDLE) beginnstate = IDLE;endelse beginnstate = cstate;endenddefault : nstate = IDLE;endcaseendassign IDLE_WRITE  = (cstate == IDLE)   && wr_fifo_usedw >= BURST_MAX;assign IDLE_READ   = (cstate == IDLE)   && rd_req;assign WRITE_DONE  = (cstate == WRITE)  && end_cnt_burst;assign READ_DONE   = (cstate == READ)   && end_cnt_burst;assign DONE_IDLE   = (cstate == DONE)   && 1'b1;            //突发计数器always @(posedge clk or negedge rst_n)begin if(!rst_n)begincnt_burst <= 'd0;end else if(add_cnt_burst)begin if(end_cnt_burst)begin cnt_burst <= 'd0;endelse begin cnt_burst <= cnt_burst + 1'd1;end endend assign add_cnt_burst = (cstate == WRITE || cstate == READ) && ~am_waitrequest;assign end_cnt_burst = add_cnt_burst && cnt_burst == BURST_MAX - 1;//地址计数器always @(posedge clk or negedge rst_n)begin if(!rst_n)begincnt_wr_addr <= 'd0;end else if(add_cnt_wr_addr)begin if(end_cnt_wr_addr)begin cnt_wr_addr <= 'd0;endelse begin cnt_wr_addr <= cnt_wr_addr + 1'd1;end endend assign add_cnt_wr_addr = (cstate == WRITE) && ~am_waitrequest;assign end_cnt_wr_addr = add_cnt_wr_addr && cnt_wr_addr == ADDR_MAX - 1;always @(posedge clk or negedge rst_n)begin if(!rst_n)begincnt_rd_addr <= 'd0;end else if(add_cnt_rd_addr)begin if(end_cnt_rd_addr)begin cnt_rd_addr <= 'd0;endelse begin cnt_rd_addr <= cnt_rd_addr + 1'd1;end endend assign add_cnt_rd_addr = (cstate == READ) && ~am_waitrequest;assign end_cnt_rd_addr = add_cnt_rd_addr && cnt_rd_addr == ADDR_MAX - 1;//avalon_master时序     assign am_wr_req_n = ~(cstate == WRITE);assign am_rd_req_n = ~(cstate == READ);assign am_addr = (cstate == WRITE) ? cnt_wr_addr : cnt_rd_addr;assign am_wr_data = wr_fifo_rd_data;assign am_be_n = 2'b00;assign am_cs = 1'b1;endmodule
  • 顶层模块(这里有用到PLL,需要100mHz时钟)
/**************************************功能介绍***********************************
Date	: 
Author	: Alegg xy.
Version	: 
Description: 
*********************************************************************************///---------<模块及端口声名>------------------------------------------------------
module top( input				clk			,input				rst_n		,input               rx          ,output              tx          ,input       [3:0]   key_in      ,output              sdram_clk   ,output      [12:0]  sdram_addr  ,output      [1:0]   sdram_ba    ,output              sdram_cas_n ,output              sdram_cke   ,output              sdram_cs_n  ,inout       [15:0]  sdram_dq    ,output      [1:0]   sdram_dqm   ,output              sdram_ras_n ,output              sdram_we_n  
);								 
//---------<参数定义>--------------------------------------------------------- //PLLwire            clk_50mhz   ;wire            clk_100mhz  ;wire            clk_offset  ;wire            locked      ;//key_debouncewire    [3:0]   key_out     ;//uartwire    [7:0]   wr_data     ;wire            wr_data_vld ;wire    [7:0]   rd_data     ;wire            rd_data_vld ;wire            rd_ready    ;//controlwire    [23:0]  am_addr     ;wire            am_wr_req_n ;wire            am_rd_req_n ;wire    [15:0]  am_wr_data  ;wire    [15:0]  am_rd_data  ;wire            am_rd_data_vld;wire    [1:0]   am_be_n     ;wire            an_cs       ;wire            am_waitrequest;
//---------<内部信号定义>-----------------------------------------------------pll	pll_inst (.areset ( ~rst_n ),.inclk0 ( clk ),.c0     ( clk_50mhz ),.c1     ( clk_100mhz ),.c2     ( sdram_clk ),.locked ( locked ));key_debounce u_key_debounce(.clk		(clk_50mhz),.rst_n	    (rst_n),.key_in	    (key_in),.key_out    (key_out)  );uart_rx u_uart_rx(.clk		(clk_50mhz),.rst_n	    (rst_n),.rx         (rx),.rx_data_vld(wr_data_vld),.rx_data    (wr_data)        );uart_tx u_uart_tx(.clk		(clk_50mhz),.rst_n	    (rst_n),.tx_data    (rd_data),.tx_data_vld(rd_data_vld),.ready      (rd_ready),.tx         (tx)            );sdram_control u_sdram_control(.clk             (clk_100mhz),.rst_n		     (rst_n),   .wr_data         (wr_data),.wr_data_vld     (wr_data_vld),.rd_req          (key_out[0]),.rd_ready        (rd_ready),.rd_data         (rd_data),.rd_data_vld     (rd_data_vld),.wr_clk          (clk_50mhz),.rd_clk          (clk_50mhz),.am_addr         (am_addr),.am_wr_req_n     (am_wr_req_n),.am_rd_req_n     (am_rd_req_n),.am_wr_data      (am_wr_data),.am_rd_data      (am_rd_data),.am_rd_data_vld  (am_rd_data_vld),.am_be_n         (am_be_n),.am_cs           (am_cs),.am_waitrequest  (am_waitrequest)       );sdram u0 (.avalon_slave_address       (am_addr),       // avalon_slave.address.avalon_slave_byteenable_n  (am_be_n),  //             .byteenable_n.avalon_slave_chipselect    (am_cs),    //             .chipselect.avalon_slave_writedata     (am_wr_data),     //             .writedata.avalon_slave_read_n        (am_rd_req_n),        //             .read_n.avalon_slave_write_n       (am_wr_req_n),       //             .write_n.avalon_slave_readdata      (am_rd_data),      //             .readdata.avalon_slave_readdatavalid (am_rd_data_vld), //             .readdatavalid.avalon_slave_waitrequest   (am_waitrequest),   //             .waitrequest.clk_clk                    (clk_100mhz),                    //          clk.clk.reset_reset_n              (rst_n),              //        reset.reset_n.sdram_addr                 (sdram_addr),                 //        sdram.addr.sdram_ba                   (sdram_ba),                   //             .ba.sdram_cas_n                (sdram_cas_n),                //             .cas_n.sdram_cke                  (sdram_cke),                  //             .cke.sdram_cs_n                 (sdram_cs_n),                 //             .cs_n.sdram_dq                   (sdram_dq),                   //             .dq.sdram_dqm                  (sdram_dqm),                  //             .dqm.sdram_ras_n                (sdram_ras_n),                //             .ras_n.sdram_we_n                 (sdram_we_n)                  //             .we_n);
endmodule

六.仿真&效果

  • 仿真代码(这里用到了仿真模型)
`timescale 1ns/1nsmodule tb_top();//激励信号定义 reg				clk  	;reg				rst_n	;reg             rx      ;reg     [3:0]   key_in  ;//输出信号定义	 wire            tx          ;wire            sdram_clk   ;wire    [12:0]  sdram_addr  ; wire    [1:0]   sdram_ba    ; wire            sdram_cas_n ; wire            sdram_cke   ; wire            sdram_cs_n  ; wire    [15:0]  sdram_dq    ; wire    [1:0]   sdram_dqm   ; wire            sdram_ras_n ; wire            sdram_we_n  ;wire            clk_50mhz   ;wire            clk_100mhz  ;wire            clk_offset  ;wire            locked      ;
//时钟周期参数定义	parameter		CLOCK_CYCLE = 20;   //模块例化top u_top(	.clk	     (clk),.rst_n		 (rst_n),.rx          (rx),.tx          (tx),.key_in      (key_in),.sdram_addr  (sdram_addr ),.sdram_ba    (sdram_ba   ),.sdram_cas_n (sdram_cas_n),.sdram_cke   (sdram_cke  ),.sdram_cs_n  (sdram_cs_n ),.sdram_dq    (sdram_dq   ),.sdram_dqm   (sdram_dqm  ),.sdram_ras_n (sdram_ras_n),.sdram_we_n  (sdram_we_n ));assign sdram_clk = clk_offset;sdr u_sdr(   .Dq      (sdram_dq), .Addr    (sdram_addr), .Ba      (sdram_ba), .Clk     (sdram_clk), .Cke     (sdram_cke), .Cs_n    (sdram_cs_n), .Ras_n   (sdram_ras_n), .Cas_n   (sdram_cas_n), .We_n    (sdram_we_n), .Dqm     (sdram_dqm));pll	pll_inst (.areset ( ~rst_n ),.inclk0 ( clk ),.c0 ( clk_50mhz ),.c1 ( clk_100mhz ),.c2 ( clk_offset ),.locked ( locked ));   
//产生时钟initial 		clk = 1'b0;always #(CLOCK_CYCLE/2) clk = ~clk;integer i;
//产生激励initial  begin rst_n = 1'b1;rx = 0;key_in[0] = 1;#(CLOCK_CYCLE*2);rst_n = 1'b0;#(CLOCK_CYCLE*20);rst_n = 1'b1;#2000;//写数据repeat(5)beginfor (i = 0 ; i < 16 ; i = i + 1) beginrx = {$random} % 1;#20;endend//读数据key_in[0] = 0;#(CLOCK_CYCLE * 200);key_in[0] = 1;#10000;$stop;endendmodule 
  • 仿真模型

    https://download.csdn.net/download/weixin_67803687/88445512

  • 仿真效果
    在这里插入图片描述

  • 上板效果
    在这里插入图片描述

七.参考

在这里插入图片描述

https://blog.csdn.net/qq_52215423/article/details/132897181

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

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

相关文章

vue3插件开发,上传npm

创建插件 在vue3工程下&#xff0c;创建组件vue页: toolset.vue。并设置组件名称。注册全局组件。新建index.js文件。内容如下&#xff0c;可在main.js中引入index.js&#xff0c;注册该组件进行测试。![在这里插入图片描述](https://img-blog.csdnimg.cn/a3409d2cbeec41c797d5…

零基础学习HTML5

1. 使用软件 vscode 谷歌浏览器 vscode下载地址&#xff1a;https://code.visualstudio.com/ 谷歌可以使用360软件管家安装 2. 安装插件 在vscode中安装插件&#xff1a;open in browser&#xff0c;点击Extensions后搜索对应插件名然后点击安装Install 安装完成后可在htm…

linux 下的java gate服务断掉的原因及解决思路

一.查询断掉的原因 1.查看gate日志&#xff0c;发现没有报错信息&#xff0c;突然就断了 2.查看是不是OOM导致 dmesg | grep java 发现确实Out of Memory了 3.发生问题的原因&#xff1a; 默认情况下, Linux kernels(内核)允许进程申请的量超过系统可用内存. 这是因为,在大多数…

计算机操作系统-第十一天

目录 1、进程的状态 创建态与就绪态 运行态 终止态 新建态 结束态 进程状态的转换 进程的组织方式 链接方式&#xff08;常见&#xff09; 索引方式&#xff08;少见&#xff09; 本节思维导图 1、进程的状态 创建态与就绪态 1、进程正在被创建时&#xff0c;处于…

零基础搭建个人网站详细流程

最近两天&#xff0c;为了给自己的工具类APP备案&#xff0c;买了阿里云ECS和域名。虽然很想说离线工具APP不用联网&#xff0c;但是现实就很无语。言归正传&#xff0c;既然买了总不能将它们闲置着&#xff0c;就诞生了建站的想法&#xff0c;至少还能放个用户协议和隐私协议。…

01-初识HTML和CSS

1.HTML与CSS 1.1.什么是HTML&#xff1f;什么是CSS&#xff1f; HTML是HyperText Markup Language(超文本标记语言) ​ 它不是一种编程语言&#xff0c;而是一种标记语言&#xff0c;用于告诉浏览器如何构造你的页面。它可以由一系列HTML元素组合成web开发人员想要的简单或者…

nodejs+vue云旅青城系统-旅游网站

用户可以实现首页、个人中心、订票信息管理、路线制定管理等。不仅使服务管理难度变低了&#xff0c;还提升了管理的灵活性。目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 …

互联网Java工程师面试题·Java 总结篇·第九弹

目录 75、阐述 JDBC 操作数据库的步骤。 76、Statement 和 PreparedStatement 有什么区别&#xff1f;哪个性 能更好&#xff1f; 77、使用 JDBC 操作数据库时&#xff0c;如何提升读取数据的性能&#xff1f;如何提升更新数据的性能&#xff1f; 78、在进行数据库编程时&a…

定制效果在线定制印刷系统源码 DIY在线定制系统源码 云印刷定制系统源码手机、PC端实时互通

支持各类产品的在线定制&#xff0c;无论是水杯雨伞U盘还是T恤衬衫四件套&#xff0c;均可轻松进行定制 独创制作间概念&#xff0c;同一套模板可以重复对应不同制作间 手机、PC端实时互通&#xff0c;客户可通过任意途径进行图片上传、编辑&#xff0c;一方修改另一方即时可见…

开源游戏引擎和模拟器的项目合集 | 开源专题 No.38

yuzu-emu/yuzu Stars: 26.2k License: GPL-3.0 yuzu是一款全球最受欢迎的开源Nintendo Switch模拟器&#xff0c;由Citra创建者编写。它采用C语言编写&#xff0c;并具有可移植性&#xff0c;在Windows和Linux上进行积极维护。该模拟器能够全速运行大多数商业游戏&#xff0c…

Go 存储系列:LSM存储引擎 LevelDB

概念介绍 LSM-Tree 被是一种面向写多读少应用场景的数据结构 &#xff0c;被 Hbase、RocksDB 等强力 NoSQL 数据库采用作为底层文件组织方式。 简单的LSM-Tree 包含 2 层树状数据结构&#xff1a; Memtable 并完全驻留在内存中&#xff08;假设 T0&#xff09; SStables 存储…

leetcode - 319. Bulb Switcher

Description There are n bulbs that are initially off. You first turn on all the bulbs, then you turn off every second bulb. On the third round, you toggle every third bulb (turning on if it’s off or turning off if it’s on). For the ith round, you toggl…

数字图像处理实验记录四(图像的空间域增强-平滑处理)

前言&#xff1a;要是是实验报告赶工的话&#xff0c;建议总结上网抄&#xff0c;或者重构我的总结&#xff0c;仅供学习参考&#xff0c;不要照抄 文章目录 一、基础知识1&#xff0c;噪声2&#xff0c;椒盐噪声3&#xff0c;高斯噪声4&#xff0c;滤波器5&#xff0c;均值滤…

如何保护IP在线隐私,提高网络安全?

前言 随着互联网的发展&#xff0c;越来越多的个人和企业开始关注网络安全和IP隐私保护。特别是在一些敏感领域&#xff0c;如金融、医疗等&#xff0c;安全和隐私问题更是不容忽视。本文将介绍如何通过运用代理IP来保护IP在线隐私&#xff0c;提高网络安全&#xff0c;并且会…

智能矩阵系统解决的问题?

智能矩阵系统可以解决的问题多种多样&#xff0c;它主要通过人工智能技术应用于矩阵系统&#xff0c;解决一些传统方法难以处理的问题。 以下是一些常见的应用场景&#xff1a; 1. 数据管理&#xff1a;智能矩阵系统可以有效地管理大量的数据&#xff0c;包括数据的存储、检索…

负载均衡、代理和动静分离的战略

一、Nginx简介 1.1 概述 Nginx (“engine x”) 是一个高性能的 HTTP 和 反向代理服务器,特点是占有内存少,并发能力强,能经受高负载的考验,有报告表明能支持高达 50,000 个并发连接数 。 1.2正向代理与反向代理 1.2.1正向代理 正向代理:如果把局域网外的 Internet 想象…

flutter 创建插件

资料&#xff1a; flutter与原生通信的方式简介 - 简书 完整流程 Flutter 集成 Golang 多语言跨端开发基础案例 - 知乎 https://www.cnblogs.com/webabcd/p/flutter_lib_plugin_plugin_ios.html 步骤1、创建插件 我创建的插件名字是konnect_im_sdk 选择的语言是 java和swi…

centos 内核对应列表 内核升级 linux

近期服务器频繁出现问题&#xff0c;找运维同事排查&#xff0c;说是系统版本和内核版本和官方不一致&#xff0c;如下&#xff1a; Release 用的是7.8, kernal 用的是 5.9 我一查确实如此&#xff1a; 内核&#xff1a; Linux a1messrv1 5.9.8-1.el7.elrepo.x86_64 发行版 Cen…

Day4力扣打卡

打卡记录 同积元组&#xff08;哈希表 排列组合&#xff09; 链接 思路&#xff1a;用哈希表将数组中出现的两不同数乘积依次记录&#xff0c;将出现两次以上的乘积组通过排列组合计算总情况个数。 class Solution { public:int tupleSameProduct(vector<int>& num…

彩虹云商城自助发卡商城-卡卡云主题

彩虹云商城自助发卡商城-卡卡云主题 全新SUP模板/知识付费模板/卡卡云模板&#xff0c;首页美化&#xff0c;登陆页美化修复了pc端显示不正常的问题。 将这俩个数据库文件导入数据库。 其他的直接导入网站根目录覆盖就好。 PS&#xff1a;若首页显示不正常&#xff1a;请去…