FPGA驱动SDRAM

news2024/12/22 22:20:34

文章目录

  • 一.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     ,
    //clk
    input               wr_clk          ,
    input               rd_clk          ,
    //avalon_master
    output      [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   ;

    //fifo
    wire            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;
//---------<内部信号定义>-----------------------------------------------------
    //fifo
    wrfifo	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)begin
            cstate <= IDLE;
        end 
        else begin 
            cstate <= nstate;
        end 
    end
    
    //第二段:组合逻辑描述状态转移规律和状态转移条件
    always @(*) begin
        case(cstate)
            IDLE    :begin
                if (IDLE_WRITE) begin
                    nstate = WRITE;
                end
                else if (IDLE_READ) begin
                    nstate = READ;
                end
                else begin
                    nstate = cstate;
                end
            end
            WRITE   :begin
                if (WRITE_DONE) begin
                    nstate = DONE;
                end
                else begin
                    nstate = cstate;
                end
            end
            READ    :begin
                if (READ_DONE) begin
                    nstate = DONE;
                end
                else begin
                    nstate = cstate;
                end
            end
            DONE    :begin
                if (DONE_IDLE) begin
                    nstate = IDLE;
                end
                else begin
                    nstate = cstate;
                end
            end
            default : nstate = IDLE;
        endcase
    end

    assign 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)begin
            cnt_burst <= 'd0;
        end 
        else if(add_cnt_burst)begin 
            if(end_cnt_burst)begin 
                cnt_burst <= 'd0;
            end
            else begin 
                cnt_burst <= cnt_burst + 1'd1;
            end 
        end
    end 
    
    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)begin
            cnt_wr_addr <= 'd0;
        end 
        else if(add_cnt_wr_addr)begin 
            if(end_cnt_wr_addr)begin 
                cnt_wr_addr <= 'd0;
            end
            else begin 
                cnt_wr_addr <= cnt_wr_addr + 1'd1;
            end 
        end
    end 
    
    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)begin
            cnt_rd_addr <= 'd0;
        end 
        else if(add_cnt_rd_addr)begin 
            if(end_cnt_rd_addr)begin 
                cnt_rd_addr <= 'd0;
            end
            else begin 
                cnt_rd_addr <= cnt_rd_addr + 1'd1;
            end 
        end
    end 
    
    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  
);								 
//---------<参数定义>--------------------------------------------------------- 
    //PLL
    wire            clk_50mhz   ;
    wire            clk_100mhz  ;
    wire            clk_offset  ;
    wire            locked      ;
    //key_debounce
    wire    [3:0]   key_out     ;
    //uart
    wire    [7:0]   wr_data     ;
    wire            wr_data_vld ;
    wire    [7:0]   rd_data     ;
    wire            rd_data_vld ;
    wire            rd_ready    ;
    //control
    wire    [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/1ns
    
module 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)begin
            for (i = 0 ; i < 16 ; i = i + 1) begin
                rx = {$random} % 1;
                #20;
            end
        end

        //读数据
        key_in[0] = 0;
        #(CLOCK_CYCLE * 200);
        key_in[0] = 1;

        #10000;
        $stop;
    end

endmodule 
  • 仿真模型

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

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

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

七.参考

在这里插入图片描述

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

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

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

相关文章

冒泡排序给cpu干懵了 哈哈 还有希尔排序 算法补充(学习笔记)

直接给出代码 #include<iostream> #include<string> #include "Student.h" #include "sorttesthelper.h" #include "BubbleSort.h" using namespace std;template<typename T> void shellSort(T arr[], int n){// 计算 incr…

Nginx+keepalived 高可用双机热备—双主模式

双机高可用方法目前分为两种&#xff1a; 1&#xff09;Nginxkeepalived 双机主从模式&#xff1a;即前端使用两台服务器&#xff0c;一台主服务器和一台热备服务器&#xff0c;正常情况下&#xff0c;主服务器绑定一个公网虚拟IP&#xff0c;提供负载均衡服务&#xff0c;热备…

什么是客户端?一文了解客户端定义、特点与功能、搭建方法

客户端&#xff1a;定义、特点与功能、搭建方法 1. 定义&#xff1a; 客户端是计算机网络中的一个术语&#xff0c;指的是在网络通信中充当主动发起请求并接收服务响应的一方。通常&#xff0c;客户端是指运行在终端设备上的软件或硬件实体&#xff0c;通过与服务器进行通信来…

从实体经济和数字经济融合展开,思考商业模式的变化

对于《关于构建数据基础制度更好发挥数据要素作用的意见》想必大家已经不陌生了&#xff0c;之前的文章中也围绕数据要素说了很多东西&#xff0c;数据、数字化、数字经济之类的已经称得上是绝大部分人对未来发展方向的共识&#xff0c;不过今天想从这个《意见》出发&#xff0…

电脑开不了机用U盘重装系统Win10教程

如果我们遇到了电脑开不起机的问题&#xff0c;这给我们的正常使用带来了很大的影响。这时候我们可以借助U盘重装系统的方法&#xff0c;轻松应对这一问题。下面小编给大家详细介绍关于用U盘给开不机的电脑重装Win10系统的教程步骤&#xff0c;操作后用户就能正常使用电脑了。 …

Mac 远程桌面软件

对于使用 Mac 计算机和笔记本电脑的企业来说&#xff0c;适用于 Mac 的远程桌面软件变得越来越重要&#xff0c;随着远程工作变得越来越普遍&#xff0c;IT 管理员和组织需要一种安全的方式来访问和修复问题、处理紧急任务以及监控远程工作站的状态&#xff0c;为了促进远距离协…

结构体和联合体详解

结构体和联合体详解 1.结构体struct1.1 结构体struct的设计1.2 结构体struct变量的定义和初始化举例&#xff1a;使用结构体Student定义并初始化stu1变量。举例&#xff1a;结构体嵌套的初始化方法。 1.3 结构体struct成员变量的访问&#xff08;获取与赋值&#xff09;1.3.1 使…

科研宝典·工具篇 | CiteSpace: 科学文献分析

​文献计量学是指用数学和统计学的方法&#xff0c;定量地分析一切知识载体的交叉科学。它是集数学、统计学、文献学为一体&#xff0c;注重量化的综合性知识体系。特别是&#xff0c;信息可视化技术手段和方法的运用&#xff0c;可直观的展示主题的研究发展历程、研究现状、研…

小度打头阵,百度大模型能否“赋能万物”?

文 | 智能相对论 作者 | 楷楷 近日&#xff0c;百度集团副总裁、小度科技原CEO景鲲因个人原因辞任&#xff0c;百度集团副总裁、首席信息官&#xff08;CIO&#xff09;李莹轮岗出任小度科技CEO&#xff0c;并向李彦宏直接汇报。 随着“景鲲时代”落幕&#xff0c;新任CEO李…

软件测试(二)用例

软件测试 测试用例&#xff08;Test Case&#xff09;是为了实施测试而向被测试的系统提供的一组集合&#xff0c;这组集合包含&#xff1a;测试环境、操作步骤、测试数据、预期结果等要素 及测试用例的四要素&#xff1a; 测试环境操作步骤测试数据预期结果 评价测试用例的…

QML(11)——qml界面之间通信方式详解

目录 一、属性绑定1、直接绑定 property01: property02实例代码 2、条件绑定 Qt.binding实例代码 二、信号传递1、on<Property>Changed实例代码 2、on<Signal>实例代码 3、条件信号传递 connect实例代码 4、Connections 一、属性绑定 属性绑定具有持续性 1、直接…

轻舟500天搞定征程5,L2+方案明年交付

作者 | Amy 编辑 | 德新 2022年L2商业化赛道发展得如火如荼&#xff0c;各家主机厂和智驾供应商的高速NOA相继迸发。 华为、小鹏率先在上海、广州多地开放城市NOA&#xff0c;蔚来、理想紧随其后。宝骏云朵联合大疆车载&#xff0c;吉利博越L联合地平线&#xff0c;将搭载高…

MySQL服务安装与登录

&#xff08;1&#xff09;以管理员身份启动命令提示符&#xff1a; &#xff08;2&#xff09;定位到安装目录的bin目录下&#xff08;根据自己的安装路径进行调整即可&#xff09;。先输入“d:”&#xff0c;定位到d盘&#xff0c;输入cd空格文件路径&#xff08;直接复制粘贴…

Windows系统安装ESP32 ESP-IDF开发环境

陈拓 2023/10/07-2023/10/10 1. 概述 在《用乐鑫国内Gitee镜像搭建ESP32开发环境》 https://blog.csdn.net/chentuo2000/article/details/113424934?spm1001.2014.3001.5502 一文中我们讲述了Linux环境下ESP32开发工具ESP-IDF的安装。 本文讲述Windows环境下ESP32开发工具…

C#使用PPT组件的CreateVideo方法生成视频

目录 需求 实现 CreateVideo方法 关键代码 CreateVideoStatus 其它 需求 我们在使用PowerPoint文档时&#xff0c;经常会使用其导出功能以创建视频&#xff0c;如下图&#xff1a; 手工操作下&#xff0c;在制作好PPT文件后&#xff0c;点击文件 -> 导出 -> 创建视…

new、delete与构造、析构函数的关系

一、指针对象的动态建立与释放 动态建立&#xff1a;new 实现&#xff0c;为指针对象分配空间 动态释放&#xff1a;delete 实现&#xff0c;为指针对象释放空间 #include<iostream> using namespace std; class A{private:int a;public:A(int a10):a(a1){cout<<&…

pyflink 环境测试以及测试案例

1. py 的 环境以来采用Anaconda环境包 安装版本&#xff1a;https://www.anaconda.com/distribution/#download-section Python3.8.8版本&#xff1a;Anaconda3-2021.05-Linux-x86_64.sh 下载地址 https://repo.anaconda.com/archive/ 2. 安装 bash Anaconda3-2021.05-Linux-x…

基于SSM+Vue的汽车服务商城系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

SpringFrameWork之注解类管理Bean

1 Bean 注解方式的扫描 1.1 .1注解理解 和 XML 配置文件一样&#xff0c;注解本身并不能执行&#xff0c;注解本身仅仅只是做一个标记&#xff0c;具体的功能是框架检测到注解标记的位置&#xff0c;然后针对这个位置按照注解标记的功能来执行具体操作。 1.1.2 扫描理解 Sp…

怎么使用LightPicture开源搭建图片管理系统并远程访问?【搭建私人图床】

文章目录 1.前言2. Lightpicture网站搭建2.1. Lightpicture下载和安装2.2. Lightpicture网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 现在的手机越来越先进&#xff0c;功能也越来越多&#xff0c;而手机…