Verilog 学习第四节(从计数器到可控制线性序列机——LED实验进化六部曲)

news2024/11/16 7:30:44

从计数器到可控制线性序列机——LED实验进化六部曲

    • 一:让LED灯按照亮0.25s,灭0.75s的状态循环亮灭
    • 二:让LED灯按照亮0.25s,灭0.5s,亮0.75s,灭1s的状态循环亮灭
    • 三:让LED灯按照指定的亮灭模式亮灭,亮灭模式未知,由用户随机指定。以0.25s为一个变化周期,8个变化状态为一个循环
    • 四:让LED灯按照指定的亮灭模式亮灭,亮灭模式未知,由用户随机指定。8个变化状态为一个循环,每个变化状态的时间值可以根据不同的应用场景选择
    • 五:让多个LED灯按照设置的模式各自在一个变化循环内独立亮灭变化
    • 六:每隔10ms,让LED灯的一个8状态循环执行一次(每个状态的变化时间值小一点,方便测试,比如设置为10us)

一:让LED灯按照亮0.25s,灭0.75s的状态循环亮灭

源文件


module counter_led_0(
     input clk,
     input reset,
     output reg led
    );
    reg [25:0] cnt;
    parameter MCNT=50000000;
    always@(posedge clk or negedge reset)begin
         if(!reset)
           cnt<=0;
         else if(cnt==MCNT-1)
           cnt<=0;
         else 
           cnt<=cnt+1'b1;
    end
    always@(posedge clk or negedge reset)begin
             if(!reset)
               led<=0;
             else if(cnt==(MCNT/4+MCNT/2)-1)
               led<=1;
             else if(cnt==MCNT-1)
               led<=0;
              else 
               led<=led;
      end
endmodule

测试文件

`timescale 1ns / 1ns

module counter_led_0_tb();
    reg clk;
    reg reset_n;
    wire led;
    counter_led_0 counter_led_0(
        .clk(clk),
        .reset(reset_n),
        .led(led)
        );
    defparam counter_led_0.MCNT=26'd25000;
    
    initial begin
            clk=0;
           end
           always#10 clk=!clk;
           initial begin
            reset_n=0;
            #201;
            reset_n=1;
            #40000000;
            $stop;
            end
endmodule

仿真截图
在这里插入图片描述

收获:
1:用parameter定义变量的时候,对变量除以2还是很容易实现的,因为其对应的是一个常量的值,但是若是一个变量在过程中会实时变化的话直接/2是会有一些问题的~
2:需要这道题需要注意亮0.25s不代表是要在0的基础上计数到0.25s在变为1,而是在1的基础上保留的时间是0.25s,这里也是需要转过弯儿的地方~

二:让LED灯按照亮0.25s,灭0.5s,亮0.75s,灭1s的状态循环亮灭

源代码


module counter_led_1(
     input clk,
     input reset,
     output reg led
    );
    reg [26:0] cnt;
    parameter MCNT=125000000;
    always@(posedge clk or negedge reset)begin
         if(!reset)
           cnt<=0;
         else if(cnt==MCNT-1)
           cnt<=0;
         else 
           cnt<=cnt+1'b1;
    end
    always@(posedge clk or negedge reset)begin
             if(!reset)
               led<=1;
             else if(cnt==MCNT/10-1)
               led<=0;
             else if(cnt==MCNT/10+MCNT/5-1)
               led<=1;
              else if(cnt==(MCNT/10+MCNT/5)*2-1)
              led<=0;
              else if(cnt==MCNT-1)
               led<=1;
               else
               led<=led;
      end
endmodule

仿真截图
在这里插入图片描述
收获
1:这里为了使亮灭计数好想,设置了复位状态时led灯为灭~

三:让LED灯按照指定的亮灭模式亮灭,亮灭模式未知,由用户随机指定。以0.25s为一个变化周期,8个变化状态为一个循环

源代码

//该模块的功能是让LED灯按照指定的亮灭模式亮灭,亮灭模式未知,由用户随机指定。以0.25s为一个变化周期,8个变化状态为一个循环

module counter_led_2(
     input clk,
     input reset,
     input [7:0]ctrl,
     output reg led
    );
    reg [26:0] cnt;
    parameter MCNT=100000000;
    always@(posedge clk or negedge reset)begin
         if(!reset)
           cnt<=0;
         else if(cnt==MCNT-1)
           cnt<=0;
         else 
           cnt<=cnt+1'b1;
    end
    always@(posedge clk or negedge reset)begin
             if(!reset)
               led<=0;
             else if(cnt==MCNT/8-1)
               led<=ctrl[0];
             else if(cnt==MCNT*2/8-1)
               led<=ctrl[1];
              else if(cnt==MCNT*3/8-1)
               led<=ctrl[2];
              else if(cnt==MCNT*4/8-1)
               led<=ctrl[3];
              else if(cnt==MCNT*5/8-1)
               led<=ctrl[4];
              else if(cnt==MCNT*6/8-1)
              led<=ctrl[5];
              else if(cnt==MCNT*7/8-1)
              led<=ctrl[6];
               else if(cnt==MCNT*8/8-1)
               led<=ctrl[7];
              else 
               led<=led;
                              
      end
endmodule

测试文件

`timescale 1ns / 1ns

module counter_led_2_tb();
    reg clk;
    reg reset_n;
    reg [7:0]ctrl;
    wire led;
    counter_led_2 counter_led_2(
        .clk(clk),
        .reset(reset_n),
        .ctrl(ctrl),
        .led(led)
        );
    defparam counter_led_2.MCNT=100000;
    
    initial begin
            clk=0;
           end
           always#10 clk=!clk;
           initial begin
            reset_n=0;
            ctrl=0;
            #201;
            reset_n=1;
            #200;
            ctrl=8'b1001_0001;
            #40000000;
            $stop;
            end
endmodule

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

四:让LED灯按照指定的亮灭模式亮灭,亮灭模式未知,由用户随机指定。8个变化状态为一个循环,每个变化状态的时间值可以根据不同的应用场景选择

思路:在原有的基础上因为时间是用户自己设定的,所以设置times变量作为输入,因为MCNT变量以往都是固定值,但是times会随时变化,所以这里就又定义了一个cnt2记到1——8,每到一个值灯就会反应出对应的亮度
源代码

//该模块的功能是让LED灯按照指定的亮灭模式亮灭,亮灭模式未知,由用户随机指定。8个变化状态为一个循环,每个变化状态的时间值可以根据不同的应用场景选择

module counter_led_3(
     input clk,
     input reset,
     input [31:0]times,
     input [7:0]ctrl,
     output reg led
    );
    reg [31:0] cnt;
    always@(posedge clk or negedge reset)begin
         if(!reset)
           cnt<=0;
         else if(cnt==times-1)
           cnt<=0;
         else 
           cnt<=cnt+1'b1;
    end
    reg [2:0]cnt2;
    always@(posedge clk or negedge reset)begin
             if(!reset)
               cnt2<=3'b0;
             else if(cnt==times-1)
               cnt2<=cnt2+1;
      end
    always@(posedge clk or negedge reset)begin
          if(!reset)
          led<=0;
          else begin
            case(cnt2)
            0:led<=ctrl[0];
            1:led<=ctrl[1];
            2:led<=ctrl[2];
            3:led<=ctrl[3];
            4:led<=ctrl[4];
            5:led<=ctrl[5];
            6:led<=ctrl[6];  
            7:led<=ctrl[7];    
            default led<=led;
            endcase
          end
          
    end
endmodule

测试文件

`timescale 1ns / 1ns

module counter_led_3_tb();
    reg clk;
    reg reset_n;
    reg [7:0]ctrl;
    reg [31:0]times;
    wire led;
    
    counter_led_3 counter_led_3(
        .clk(clk),
        .reset(reset_n),
        .ctrl(ctrl),
        .times(times),
        .led(led)
        );
    initial begin
            clk=0;
           end
           always#10 clk=!clk;
           initial begin
            reset_n=0;
            ctrl=0;
            times=0;
            #201;
            reset_n=1;
            #200;
            ctrl=8'b1001_0001;
            #201;
            times=2500;
            #2000001;
            times=25000;
            #400000000;
            $stop;
            end
endmodule


仿真截图
在这里插入图片描述

五:让多个LED灯按照设置的模式各自在一个变化循环内独立亮灭变化

答:在四的基础上增加led的位宽,以及设置多个控制信号进行赋值

module counter_led_5(
    Clk,
    Reset_n,
    CtrlA,
    CtrlB,
    Time,
    Led
);
    input Clk;
    input Reset_n;
    input [7:0]CtrlA;
    input [7:0]CtrlB;
    input [31:0]Time;
    output reg [1:0]Led;

    reg [31:0]counter;
    
    always@(posedge Clk or negedge Reset_n)
    if(!Reset_n)
        counter <= 0;
    else if(counter == Time - 1)
        counter <= 0;
    else
        counter <= counter + 1'b1;
    
    reg [2:0]counter2;
    always@(posedge Clk or negedge Reset_n)
    if(!Reset_n) 
        counter2 <= 0; 
    else if(counter == Time - 1)
        counter2 <= counter2 + 1'b1;

    always@(posedge Clk or negedge Reset_n)
    if(!Reset_n)
        Led <= 2'd0;
    else case(counter2)
        0:begin Led[0] <= CtrlA[0]; Led[1] <= CtrlB[0]; end
        1:begin Led[0] <= CtrlA[1]; Led[1] <= CtrlB[1]; end
        2:begin Led[0] <= CtrlA[2]; Led[1] <= CtrlB[2]; end
        3:begin Led[0] <= CtrlA[3]; Led[1] <= CtrlB[3]; end
        4:begin Led[0] <= CtrlA[4]; Led[1] <= CtrlB[4]; end
        5:begin Led[0] <= CtrlA[5]; Led[1] <= CtrlB[5]; end
        6:begin Led[0] <= CtrlA[6]; Led[1] <= CtrlB[6]; end
        7:begin Led[0] <= CtrlA[7]; Led[1] <= CtrlB[7]; end
        default:begin Led[0] <= Led; Led[1] <= Led[1]; end
    endcase
            
endmodule

测试文件

`timescale 1ns/1ns

module counter_led_5_tb;

    reg Clk;
    reg Reset_n;
    reg [7:0]CtrlA,CtrlB;
    reg [31:0]Time;
    wire [1:0]Led;

    counter_led_5 counter_led_5(
        .Clk(Clk),
        .Reset_n(Reset_n),
        .CtrlA(CtrlA),
        .CtrlB(CtrlB),
        .Time(Time),
        .Led(Led)
    );
    
    initial Clk = 1;
    always #10 Clk = !Clk;
    
    initial begin
        Reset_n = 0;
        CtrlA = 0;
        CtrlB = 0;
        Time = 0;
        #201;
        Reset_n = 1;
        #2000;
        Time = 2500;
        CtrlA = 8'b1000_0110;
        CtrlB = 8'b1101_0010;
        #20000000;  
        Time = 25000;
        CtrlA = 8'b1010_0110;
        CtrlB = 8'b1100_1010;
        #20000000;    
        $stop;
    end
    
endmodule

六:每隔10ms,让LED灯的一个8状态循环执行一次(每个状态的变化时间值小一点,方便测试,比如设置为10us)

在这里插入图片描述
最开始自己的理解是在8个循环之后间隔10ms,所以才有了以下代码的理解,但是后来才懂原来周期是10msemmm有些许思想出路

注:以下代码的逻辑思想正确,即在原有计数的基础上又加了一个整体的计数周期=8*times+10ms,但是这里的8需要对输入变量做乘法,在运算时很有可能一个周期运算不出来,就会出现一些错误,所以这里还是要谨慎的使用;(小梅哥采用的是设置en进行控制,自己没有写出来,这里看完他的代码后自行默写了一下~)

//该模块的功能是每隔10ms,让LED灯的一个8状态循环执行一次(每个状态的变化时间值小一点,方便测试,比如设置为10us)

module counter_led_4(
     input clk,
     input reset,
     input [31:0]times,
     input [7:0]ctrl,
     output reg led
    );
    reg [31:0] cnt;
    reg en;//设置使能,只有在en为1的时候
    parameter count=5000;
    always@(posedge clk or negedge reset)begin
         if(!reset)
           cnt<=0;
         else if(cnt==times-1)
           cnt<=0;
         else 
           cnt<=cnt+1'b1;
    end
    reg [2:0]cnt2;
    always@(posedge clk or negedge reset)begin
             if(!reset)
               cnt2<=3'b0;
             else if(cnt==times-1)
               cnt2<=cnt2+1;
      end
      reg [35:0] cnt3;
      always@(posedge clk or negedge reset)begin
               if(!reset)
                 cnt3<=0;
               else if(cnt3==times*8-1+count)
                 cnt3<=0;
               else 
                 cnt3<=cnt3+1'b1;
          end
    always@(posedge clk or negedge reset)begin
          if(!reset)
          led<=0;
          else if(cnt3<=8*times-1)
          begin
            case(cnt2)
            0:led<=ctrl[0];
            1:led<=ctrl[1];
            2:led<=ctrl[2];
            3:led<=ctrl[3];
            4:led<=ctrl[4];
            5:led<=ctrl[5];
            6:led<=ctrl[6];  
            7:led<=ctrl[7];    
            default led<=led;
            endcase
          end
          else if(cnt3<=8*times-1+count)
          begin
          led<=0;
          end
          
    end
endmodule

`timescale 1ns / 1ns

module counter_led_4_tb();
    reg clk;
    reg reset_n;
    reg [7:0]ctrl;
    reg [31:0]times;
    wire led;
    
    counter_led_4 counter_led_4(
        .clk(clk),
        .reset(reset_n),
        .ctrl(ctrl),
        .times(times),
        .led(led)
        );
    initial begin
            clk=0;
           end
           always#10 clk=!clk;
           initial begin
            reset_n=0;
            ctrl=0;
            times=0;
            #201;
            reset_n=1;
            #200;
            ctrl=8'b1001_0001;
            #201;
            times=2500;
            #2000001;
            times=25000;
            #40000000;
            $stop;
            end
endmodule

在这里插入图片描述

小梅哥的官方源码

module counter_led_4(
    Clk,
    Reset_n,
    Ctrl,
    Time,
    Led
);
    input Clk;
    input Reset_n;
    input [7:0]Ctrl;
    input [31:0]Time;
    output reg Led;

    reg [31:0]counter;
    reg EN;
    
    reg [18:0]counter0;
    //10ms���ڶ�ʱ��
    always@(posedge Clk or negedge Reset_n)
    if(!Reset_n)
        counter0 <= 0;
    else if(counter0 == 500000 - 1)
        counter0 <= 0;
    else
        counter0 <= counter0 + 1'b1;
        
    always@(posedge Clk or negedge Reset_n)
    if(!Reset_n)
        EN <= 0;
    else if(counter0 == 0)
        EN <= 1;
    else if((counter2 == 7) && (counter == Time - 1))
        EN <= 0;
      
    always@(posedge Clk or negedge Reset_n)
    if(!Reset_n)
        counter <= 0;
    else if(EN)begin
        if(counter == Time - 1)
            counter <= 0;
        else
            counter <= counter + 1'b1;
    end
    else
        counter <= 0;
    
    reg [3:0]counter2;
    always@(posedge Clk or negedge Reset_n)
    if(!Reset_n) 
        counter2 <= 0; 
    else if(EN)begin
        if(counter == Time - 1)
            counter2 <= counter2 + 1'b1;
    end
    else
        counter2 <= 4'd8;     

    always@(posedge Clk or negedge Reset_n)
    if(!Reset_n)
        Led <= 0;
    else case(counter2)
        0:Led <= Ctrl[0];
        1:Led <= Ctrl[1];
        2:Led <= Ctrl[2];
        3:Led <= Ctrl[3];
        4:Led <= Ctrl[4];
        5:Led <= Ctrl[5];
        6:Led <= Ctrl[6];
        7:Led <= Ctrl[7];
        8:Led <= 0;
        default:Led <= Led;
    endcase
            
endmodule

测试文件

`timescale 1ns / 1ns

module counter_led_4_tb();
    reg clk;
    reg reset_n;
    reg [7:0]ctrl;
    reg [31:0]times;
    wire led;
    
    counter_led_4 counter_led_4(
        .Clk(clk),
        .Reset_n(reset_n),
        .Ctrl(ctrl),
        .Time(times),
        .Led(led)
        );
    initial begin
            clk=0;
           end
           always#10 clk=!clk;
     initial begin
            reset_n=0;
            ctrl=0;
            times=0;
            #201;
            reset_n=1;
            #2000;
            ctrl=8'b1000_0111;
            times=2500;
            #20000001;
            times=25000;
            ctrl=8'b1010_0110;
            #20000000;
            $stop;
            end
endmodule

仿真截图

在这里插入图片描述
收获:
1:锻炼了自己分析波形的能力,自己调试,最初小梅哥的代码在间隔10ms的时间里会一直保持ctrl[0]的状态,让波形看的很乱,找不到是什么时候开始算起的,于是我对counter2进行计数更改,当当前处于不计数的状态时,不为0.因为为0 的话需要在后面case循环中进行判断等于ctrl[0],于是我把不计数的状态设为不在判断范围内的8,使其为0,这样使得波形比较规律易懂
2:学会了添加模块中其他参数的方法,好开心~,这样查错就更容易了
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

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

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

相关文章

Java程序员线上排查问题神器-Arthas

文章目录前言一、Arthas是什么&#xff1f;二、快速入门1.下载2.如何运行三、常用命令1.dashboard2.trace总结前言 最近公司项目版本迭代升级&#xff0c;在开发新需求导致没什么时间写博客。 在开发需求的过程中&#xff0c;我写了一个接口&#xff0c;去批量调内部已经写好…

浏览器工作原理详解

浏览器工作原理 以打开百度官网为例 在浏览器地址栏输入网址www.baidu.com &#xff0c;回车 这一过程发生了什么&#xff1f; 首先我们要知道www.baidu.com 这是个域名&#xff0c;需要通过DNS去解析为IP地址&#xff08;也就是服务器地址&#xff09;&#xff0c;然后返回…

yum/vim工具的使用

yum 我们生活在互联网发达的时代&#xff0c;手机电脑也成为了我们生活的必须品&#xff0c;在你的脑海中是否有着这样的记忆碎片&#xff0c;在一个明媚的早上你下定决心准备发奋学习&#xff0c;“卸载”了你手机上的所有娱乐软件&#xff0c;一心向学&#xff01;可是到了下…

前端面试题整理之HMTL篇(一)

HTML面试题&#xff08;一&#xff09; 前言&#xff1a; 面试题及答案解析&#xff0c;大部分来自网络整理&#xff0c;我自己做了一些简化&#xff0c;如果想了解的更多&#xff0c;可以搜索一下&#xff0c;前端面试题宝典微信公众号或者查百度&#xff0c;另外如果出现错误…

Windows环境下安装和配置Gradle

1. 概述 Gradle是Google公司基于JVM开发的一款项目构建工具&#xff0c;支持Maven&#xff0c;JCenter多种第三方仓库&#xff0c;支持传递性依赖管理&#xff0c;使用更加简洁和支持多种语言的build脚步文件&#xff0c;更多详情可以参阅Gradle官网 2. 下载 由于Gradle与S…

【opencv 系列】第2章 图片视频的读取和保存

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言1. 图片2.视频(读取摄像头、视频文件)2.1 从摄像头读视频2.2 从视频读取文件2.3 保存摄像头读取的视频2.4 图片的打开,读取和保存代码2.5 摄像头的打开,读取和保…

[LeetCode]1237. 找出给定方程的正整数解

题目链接&#xff1a;https://leetcode.cn/problems/find-positive-integer-solution-for-a-given-equation/description/ 题目描述&#xff1a; 样例1&#xff1a; 输入&#xff1a;function_id 1, z 5 输出&#xff1a;[[1,4],[2,3],[3,2],[4,1]] 解释&#xff1a;functi…

Linux 根目录与路径

目录 Linux的根目录 /usr目录&#xff08;存放用户数据&#xff09; /bin目录&#xff08;存放所有用户都可使用的应用程序&#xff09; /sbin目录&#xff08;存放管理员才可以使用的应用程序&#xff09; /opt目录&#xff08;存放第三方软件&#xff09; /boot目录&am…

[Android Studio] Android Studio Virtual Device(AVD)虚拟机的功能试用

&#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea; Android Debug&#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea; Topic 发布安卓学习过程中遇到问题解决过程&#xff0c;希望我的解决方案可以对小伙伴们有帮助。 &#x1f680;write…

Mindspore安装

本文用于记录搭建昇思MindSpore开发及使用环境的过程&#xff0c;并通过MindSpore的API快速实现了一个简单的深度学习模型。 什么是MindSpore? 昇思MindSpore是一个全场景深度学习框架&#xff0c;旨在实现易开发、高效执行、全场景覆盖三大目标。 安装步骤 鉴于笔者手头硬…

QM9数据集示例项目学习图神经网络

目录QM9数据集&#xff1a;QM9数据提取的特征&#xff1a;网络结构的设计官网示例代码注释&#xff1a;QM9数据集&#xff1a; QM9为小有机分子的相关的、一致的和详尽的化学空间提供量子化学特征&#xff0c;该数据库可用于现有方法的基准测试&#xff0c;新方法的开发&#…

【算法】两道算法题根据提供字母解决解码方法和城市的天际线天际线问题

算法目录解码方法Java解答参考&#xff1a;天际线问题Java解答参考&#xff1a;大家好&#xff0c;我是小冷。 上一篇了解了项目相关的知识点 接下来看下两道算法题吧&#xff0c;用Java解答&#xff0c;可能更能激发一下大脑思考。 解码方法 题目要求&#xff1a; 一条包含…

将 Supabase 作为下一个后端服务

对于想快速实现一个产品而言&#xff0c;如果使用传统开发&#xff0c;又要兼顾前端开发&#xff0c;同时又要花费时间构建后端服务。然而有这么一个平台&#xff08;Baas Backend as a service&#xff09;后端即服务&#xff0c;能够让开发人员可以专注于前端开发&#xff0c…

Java反序列化漏洞——CommonsCollections4.0版本—CC2、CC4

一、概述4.0版本的CommonsCollections对之前的版本做了一定的更改&#xff0c;那么之前的CC链反序列化再4版本中是否可用呢。实际上是可用的&#xff0c;比如CC6的链&#xff0c;引入的时候因为⽼的Gadget中依赖的包名都是org.apache.commons.collections &#xff0c;⽽新的包…

【构建工具】Gradle中文教程

文章目录Gradle 简介Gradle 概述基于声明的构建和基于约定的构建为以依赖为基础的编程方式提供语言支持构建结构化深度 APIGradle 的扩展多项目构建多种方式管理依赖Gradle 是第一个构建集成工具易于移植GroovyThe Gradle wrapper自由和开源为什么使用 Groovy?Gradle 安装先决…

Pycharm搭建一个Django项目

File->new project 点击create&#xff0c; 等待一下即可 查看安装 Django 版本&#xff1a; 在 Pycharm 底部选择 Terminal 然后在里面输入&#xff1a;python -m django --version 启动项目&#xff1a; 在 Terminal 里面输入: python manage.py runserver 查看文件目…

一文精通MVCC机制

MVCC(Multi-Version Concurrency Control)多版本并发控制机制使用串行化隔离级别时&#xff0c;mysql会将所有的操作加锁互斥&#xff0c;来保证并发安全。这种方式必然降低并发性能。mysql在读已提交和可重复读隔离级别下&#xff0c;对一行数据的读和写两个操作默认是不会通过…

【Unity3d】Unity与iOS之间通信

在unity开发或者sdk开发经常遇到unity与移动端原生层之间进行通信&#xff0c;这里把它们之间通信做一个整理。 关于Unity与Android之间通信&#xff0c;参考【Unity3d】Unity与Android之间通信 Unity调用Objective-C 主要分三个步骤&#xff1a; (一)、在xcode中定义要被u…

php学习笔记

之前看过php的基础教学视频&#xff0c;了解了一下&#xff0c;自己没有上手实践&#xff0c;现在为了项目需要&#xff0c;需要扎实学习一下&#xff0c;所以做一下笔记吧。 php学习笔记1.基础2.动态网站的开发学习2.1会员管理系统1.基础 之前看过一个4小时的基础视频&#x…

Go 数组和切片反思

切片的底层数据结构是数组&#xff0c;所以&#xff0c;切片是基于数组的上层封装&#xff0c;使用数组的场景&#xff0c;也完全可以使用切片。 类型比较 我看到 go 1.17 有对切片和数组转换的优化&#xff0c;禁不住纳闷&#xff0c;有什么场景是必须数组来完成的呢&#x…