数码管动态扫描显示

摸鱼记录 Day_16      (゚O゚)

review

        前边已经学习了:

        串口接收:Vivado 串口接收优化-CSDN博客

1.  今日摸鱼任务

串口接收数据

并用数码管显示 (゚O゚)

小梅哥视频:

17A 数码管段码显示与动态扫描原理_哔哩哔哩_bilibili

17B 数码管动态扫描显示数字逻辑建模_哔哩哔哩_bilibili

17C 数码管动态扫描显示的Verilog实现_哔哩哔哩_bilibili

17D 使能时钟和门控时钟的原理与差异_哔哩哔哩_bilibili

//虽然看起来很多,但是不会很难滴 (゚O゚)

2.  数码管显示原理

        ACZ702 EDA 扩展板上板载的是共阳数码管。同时为了显示数字或字符,必须对数字或字符进行编码译码。

        先不考虑小数点也就是简化为 7 段数码管,其编码译码格式如下表所示:

        段式数码管工作方式有两种:静态显示方式动态显示方式

        静态显示:每个数码管的段选必须接一个 8 位数据线来保持显示的字形码。当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止。

        这种方法由于每个数码管均需要独立的数据线,硬件电路比较复杂,成本较高,很少使用。

        动态显示:将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。

         电路结构如下所示,这样 3 个数码管接在一起就比静态的少了 7*2 I/O
        sel拉高选中

3.   时钟分频:门控时钟与使能时钟

门控时钟:

        使用计数器和逻辑门翻转产生

    reg [14:0]div_clk;    
    always@(posedge clk or negedge reset_n)
    if(!reset_n) 
        div_clk <= 1'b0;
    else if(div_clk == 24999) 
        div_clk <= 1'b0;
    else 
        div_clk <= div_clk + 1'b1;
    
    always@(posedge clk or negedge reset_n)
    if(!reset_n) 
        clk_1 <= 1'b0;
    else if(div_clk == 24999) 
        clk_1 <= ~clk_1;

使能时钟:

        用到计数器,但是不会用到反相器,生成的信号也不会直接用于其他电路的触发

    reg [14:0]div_clk;    
    always@(posedge clk or negedge reset_n)
    if(!reset_n) 
        div_clk <= 1'b0;
    else if(div_clk == 24999) 
        div_clk <= 1'b0;
    else 
        div_clk <= div_clk + 1'b1;

always@(posedge clk or negedge reset_n)
    if(!reset_n) 
        disp_en <= 1'b0;
    else if(div_clk == 24999) 
        disp_en <= 1'b1;
    else 
        disp_en <= 1'b0;  

对比:

        门控时钟的时钟延迟不稳定,且延迟比较大

                          使得时钟的波形变差

                          驱动能力差

小结:设计中一般情况下使用使能时钟的时钟分频方式

4.  hex_8

4.1 design sources

hex_8

module hex_8(input clk,
             input reset_n,
             input [31:0]disp_data,
             output reg [7:0]sel,
             output reg [7:0]seg
             );

//[31:0]disp_data  16hex 4*8
//[7:0]sel 位选信号
//[7:0]seg 段选信号

// 1kHz分频时钟 
    reg [14:0]div_clk;
    always@(posedge clk or negedge reset_n)
    if(!reset_n) 
        div_clk <= 1'b0;
    else if(div_clk == 24999) 
        div_clk <= 1'b0;
    else 
        div_clk <= div_clk + 1'b1;
    reg disp_en;
   always@(posedge clk or negedge reset_n)
    if(!reset_n) 
        disp_en <= 1'b0;
    else if(div_clk == 24999) 
        disp_en <= 1'b1;
    else 
        disp_en <= 1'b0;    

//  位选sel
    reg[2:0]sel_num;
    always@(posedge clk or negedge reset_n)
    if(!reset_n) 
        sel_num <= 3'b000;
    else if(disp_en) 
        sel_num <= sel_num + 1'b1;
        //sel_num =3’b111; +1'b1  3'b000;
    always@(posedge clk or negedge reset_n)
    if(!reset_n) 
        sel <= 8'b0000_0000;
    else case(sel_num) 
         0:sel <= 8'b0000_0001;
         1:sel <= 8'b0000_0010;
         2:sel <= 8'b0000_0100;
         3:sel <= 8'b0000_1000;
         4:sel <= 8'b0001_0000;
         5:sel <= 8'b0010_0000;
         6:sel <= 8'b0100_0000;
         7:sel <= 8'b1000_0000;
    endcase   
   
// 段选seg   [31:0]disp_data  16hex 4*8
    reg [3:0] dis_tmp;
    always@(posedge clk )
    case(sel_num) //高位放前面
         0:dis_tmp <= disp_data[31:28];
         1:dis_tmp <= disp_data[27:24];
         2:dis_tmp <= disp_data[23:20];
         3:dis_tmp <= disp_data[19:16];
         4:dis_tmp <= disp_data[15:12];
         5:dis_tmp <= disp_data[11:8];
         6:dis_tmp <= disp_data[7:4];
         7:dis_tmp <= disp_data[3:0];
    endcase 
    
    always@(posedge clk)
    case(dis_tmp) 
         0:seg <= 8'hc0;
         1:seg <= 8'hf9;
         2:seg <= 8'ha4;
         3:seg <= 8'hb0;
         4:seg <= 8'h99;
         5:seg <= 8'h92;
         6:seg <= 8'h82;
         7:seg <= 8'hf8;
         8:seg <= 8'h80;
         9:seg <= 8'h90;
         4'ha:seg <= 8'h88;
         4'hb:seg <= 8'h83;
         4'hc:seg <= 8'hc6;
         4'hd:seg <= 8'ha1;
         4'he:seg <= 8'h86;
         4'hf:seg <= 8'h8e;
    endcase 

endmodule

4.2 hex_8_tb

`timescale 1ns / 1ns
    module hex_8_tb( );
    reg clk , reset_n;
    reg [31:0]disp_data;
    wire[7:0]sel;
    wire[7:0]seg;
     hex_8 hex_8_(. clk(clk),
                 . reset_n(reset_n),
                 . disp_data(disp_data),
                 . sel(sel),
                 . seg(seg) );
                 
         initial clk = 1 ;
         always#10 clk = ~clk;
         
         initial 
             begin
                reset_n = 0 ;
                #201;
                reset_n = 1 ;
                disp_data = 32'h01234567;
             #10000000;
             disp_data = 32'h89abcdef;
             #10000000;
             $stop;
             end            

    endmodule

红色框框内输入数据发生了改变,但是很快就会闪过去

所以没有像串口发送添加一个存储数据让其保持一个运行周期

Vivado 串口通信(UART)------串口发送-CSDN博客

5.  串口接收 + 数码管动态显示

5.1 design sources

module uart_rx(input clk ,
                 input reset_n ,
                 input uart_rx ,
                 output reg [7:0]rx_data,
                 output reg rx_done    );
    //默认使用波特率BAUD 9600  时钟频率 CLK_FREQ  50MHz
//    parameter start_bit = 0 ;
//    parameter stop_bit  = 1 ;
    parameter BAUD = 9600;
    parameter CLK_FREQ = 50_000_000;
    parameter bps_c = CLK_FREQ / BAUD ;    
    reg rx_en ;   
    reg[3:0] rx_flag;
        // bps 
        reg [30:0] counter_bps ;        
      always@(posedge clk or negedge reset_n)
        if(! reset_n) 
            counter_bps <= 0 ;
        else if (rx_en)
            if(counter_bps == bps_c - 1)
                counter_bps <= 0 ;
            else
                counter_bps <= counter_bps + 1'b1 ;
        else
            counter_bps <= 0 ;
        reg dff_rx_0 , dff_rx_1 ;
        reg r_uart_rx; 
        wire neg_rx_go ;
        always@(posedge clk )    
            dff_rx_0 <= uart_rx ;
        always@(posedge clk )    
            dff_rx_1 <= dff_rx_0 ;
        always@(posedge clk )    
            r_uart_rx <= dff_rx_1 ;
            
        assign neg_rx_go = (dff_rx_1 == 0)&&(r_uart_rx == 1);
        
      // rx_en 
        always@(posedge clk or negedge reset_n)
        if(! reset_n) 
            rx_en <= 0 ;
        else if(neg_rx_go) 
            rx_en <= 1 ;
        else if((rx_flag==9)&&(counter_bps == bps_c / 2))
            rx_en <= 0 ;
        else if((rx_flag==0)&&(counter_bps == bps_c/2 )&&(dff_rx_1==1)) 
            rx_en <= 0 ;
               
     // rx_flag
        always@(posedge clk or negedge reset_n)
        if(!reset_n) rx_flag <= 4'b0000 ;
        else if((rx_flag == 9)&&(counter_bps == bps_c /2)) rx_flag <= 4'b0000 ;
        else if(counter_bps == bps_c - 1)  rx_flag <= rx_flag + 1'b1 ;
         
     // [7:0]r_rx_data   
     reg [7:0] r_rx_data;
     always@(posedge clk )
       if(!rx_en) r_rx_data <= r_rx_data;
       else if(counter_bps == bps_c / 2)
        begin 
            case(rx_flag)
            1 : r_rx_data[0] <= dff_rx_1;
            2 : r_rx_data[1] <= dff_rx_1;
            3 : r_rx_data[2] <= dff_rx_1;
            4 : r_rx_data[3] <= dff_rx_1;
            5 : r_rx_data[4] <= dff_rx_1;
            6 : r_rx_data[5] <= dff_rx_1;
            7 : r_rx_data[6] <= dff_rx_1;
            8 : r_rx_data[7] <= dff_rx_1;
            default : r_rx_data <= r_rx_data;
            endcase
            
        end      
    // rx_done
     always@(posedge clk)
            rx_done <= (rx_flag==9)&&(counter_bps == bps_c /2);
    // rx_data ;
       always@(posedge clk)
           if(rx_done) rx_data <= r_rx_data;  
endmodule
 
rx_hex8
module rx_hex8(input clk,
               input reset_n,
               input uart_rx ,
               output  [7:0]sel,
               output  [7:0]seg
                );
                
reg  [1:0] rx_done_flag;
reg [31:0]disp_data;
wire [7:0] rx_data;
wire rx_done;
    uart_rx uart_rx_(. clk(clk) , . reset_n(reset_n) ,.uart_rx(uart_rx) ,
                 . rx_data(rx_data), . rx_done(rx_done)    );
    always@(posedge clk or negedge reset_n)
        if(! reset_n) 
            rx_done_flag <= 2'b11 ;
        else if(rx_done) 
            rx_done_flag <= rx_done_flag + 1'b1 ;
    always@(posedge clk or negedge reset_n)
        if(! reset_n) 
            disp_data <= 8'h0000_0000 ;
        else 
        case(rx_done_flag)
            0:begin disp_data <= disp_data; disp_data[7:0] <= rx_data;end
            1:begin disp_data <= disp_data; disp_data[15:8] <= rx_data;end
            2:begin disp_data <= disp_data; disp_data[23:16] <= rx_data;end
            3:begin disp_data <= disp_data; disp_data[31:24] <= rx_data;end
        endcase
    
    hex_8 hex_8_(. clk(clk),
             . reset_n(reset_n),
             . disp_data(disp_data),
             .sel(sel),
             .seg(seg)
             );
endmodule

5.2  rx_hex8_tb

`timescale 1ns / 1ns
    module hex_8_tb( );
    reg clk , reset_n , uart_rx_;
    wire[7:0]sel;
    wire[7:0]seg;
     rx_hex8 rx_hex8_(. clk(clk),
                 . reset_n(reset_n),
                 . uart_rx(uart_rx_),
                 . sel(sel),
                 . seg(seg)
                 );        
         initial clk = 1 ;
         always#10 clk = ~clk;
         
         initial 
             begin
                reset_n = 0 ;
                #201;
                reset_n = 1 ;
                uart_rx_ = 1 ;#(5208*20);
                //0 f   
        uart_rx_ = 0 ; #(5208*20);
        uart_rx_ = 0 ; #(5208*20);uart_rx_ = 0 ; #(5208*20);

        uart_rx_ = 0 ; #(5208*20);uart_rx_ = 0 ; #(5208*20);
        uart_rx_ = 1 ; #(5208*20);uart_rx_ = 1 ; #(5208*20);

        uart_rx_ = 1 ; #(5208*20);uart_rx_ = 1 ; #(5208*20);
        uart_rx_ = 1 ; #(5208*20);
        
             //9 6    
        uart_rx_ = 0 ; #(5208*20);
        uart_rx_ = 1 ; #(5208*20);uart_rx_ = 0 ; #(5208*20);

        uart_rx_ = 0 ; #(5208*20);uart_rx_ = 1 ; #(5208*20);
        uart_rx_ = 0 ; #(5208*20);uart_rx_ = 1 ; #(5208*20);

        uart_rx_ = 1 ; #(5208*20);uart_rx_ = 0 ; #(5208*20);
        uart_rx_ = 1 ; #(5208*20);
        
                //4 5  
        uart_rx_ = 0 ; #(5208*20);
        uart_rx_ = 0 ; #(5208*20);uart_rx_ = 0 ; #(5208*20);

        uart_rx_ = 1 ; #(5208*20);uart_rx_ = 0 ; #(5208*20);
        uart_rx_ = 1 ; #(5208*20);uart_rx_ = 0 ; #(5208*20);uart_rx_ = 1 ;

         #(5208*20);uart_rx_ = 0 ; #(5208*20);
        uart_rx_ = 1 ; #(5208*20);
         
        // 3 c   
        uart_rx_ = 0 ; #(5208*20);
        uart_rx_ = 0 ; #(5208*20);uart_rx_ = 0 ; #(5208*20);

        uart_rx_ = 1 ; #(5208*20);uart_rx_ = 1 ; #(5208*20);
        uart_rx_ = 1 ; #(5208*20);uart_rx_ = 1 ; #(5208*20);

        uart_rx_ = 0 ; #(5208*20);uart_rx_ = 0 ; #(5208*20);
        uart_rx_ = 1 ; #(5208*20);
        
                //0 f   
        uart_rx_ = 0 ; #(5208*20);
        uart_rx_ = 0 ; #(5208*20);uart_rx_ = 0 ; #(5208*20);

        uart_rx_ = 0 ; #(5208*20);uart_rx_ = 0 ; #(5208*20);
        uart_rx_ = 1 ; #(5208*20);uart_rx_ = 1 ; #(5208*20);

        uart_rx_ = 1 ; #(5208*20);uart_rx_ = 1 ; #(5208*20);
        uart_rx_ = 1 ; #(5208*20);
        
             
        uart_rx_ = 0 ; #(5208*20);
        uart_rx_ = 0 ; #(5208*20);uart_rx_ = 0 ; #(5208*20);

        uart_rx_ = 0 ; #(5208*20);uart_rx_ = 0 ; #(5208*20);
        uart_rx_ = 1 ; #(5208*20);uart_rx_ = 1 ; #(5208*20);

        uart_rx_ = 1 ; #(5208*20);uart_rx_ = 1 ; #(5208*20);
        uart_rx_ = 1 ; #(5208*20);
        
                
        uart_rx_ = 0 ; #(5208*20);
        uart_rx_ = 0 ; #(5208*20);uart_rx_ = 0 ; #(5208*20);

        uart_rx_ = 0 ; #(5208*20);uart_rx_ = 0 ; #(5208*20);
        uart_rx_ = 1 ; #(5208*20);uart_rx_ = 1 ; #(5208*20);

        uart_rx_ = 1 ; #(5208*20);uart_rx_ = 1 ; #(5208*20);
        uart_rx_ = 1 ; #(5208*20);
         
        
       uart_rx_ = 0 ; #(5208*20);
        uart_rx_ = 0 ; #(5208*20);uart_rx_ = 0 ; #(5208*20);

        uart_rx_ = 0 ; #(5208*20);uart_rx_ = 0 ; #(5208*20);
        uart_rx_ = 1 ; #(5208*20);uart_rx_ = 1 ; #(5208*20);

        uart_rx_ = 1 ; #(5208*20);uart_rx_ = 1 ; #(5208*20);
        uart_rx_ = 1 ; #(5208*20);
         
         uart_rx_ = 0 ; #(5208*20);
        uart_rx_ = 0 ; #(5208*20);uart_rx_ = 0 ; #(5208*20);

        uart_rx_ = 0 ; #(5208*20);uart_rx_ = 0 ; #(5208*20);
        uart_rx_ = 1 ; #(5208*20);uart_rx_ = 1 ; #(5208*20);

        uart_rx_ = 1 ; #(5208*20);uart_rx_ = 1 ; #(5208*20);
        uart_rx_ = 1 ; #(5208*20);     
                # 10000;      
             $stop;
             end            

    endmodule

//好耶~~~~~

//摸鱼结束哩   (゚O゚)

//顺便挖坑SPI协议

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

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

相关文章

使用点链云管家创建瑜伽约课小程序

点链云管家 点链云管家是由上海点链科技开发的门店管理系统&#xff0c;为线下门店商家提供一站式门店运营服务平台解决方案&#xff0c;适用于瑜伽健身、美业、新零售会员制电商、母婴店、宠物店、按摩养生、服装、美容、美甲、汽车服务、商超零售、餐饮、KTV娱乐、干洗等18个…

Python实时追踪关键点组成人体模型

项目背景 最近遇到这样一个需求&#xff1a; 1&#xff1a;实时追踪关键点组成人体模型&#xff08;手臂包括三个点&#xff1a;手腕&#xff0c;肘关节&#xff0c;双肩&#xff1b;腿部包括胯骨&#xff0c;膝盖&#xff0c;脚踝&#xff09; 2&#xff1a;运用追踪到的关键…

数据仓库的设计开发应用(一)

目录 一、数据仓库设计的特点二、数据仓库系统开发过程三、数据仓库系统的规划 一、数据仓库设计的特点 1、“数据驱动” 的设计 数据仓库是从已有数据出发的设计方法&#xff0c;即从数据源抽取数据&#xff0c;经转换形成面向主题&#xff0c;支持决策的数据集合。 以全面了…

Talk|加州大学洛杉矶分校鲁盼:基于大型语言模型的多模态数学推理

本期为TechBeat人工智能社区第579期线上Talk。 北京时间3月14日(周四)20:00&#xff0c;加州大学洛杉矶分校博士生—鲁盼的Talk已准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “基于大型语言模型的多模态数学推理”&#xff0c;向大家系统地介绍了多模态…

大语言模型智能体简介

大语言模型&#xff08;LLM&#xff09;智能体&#xff0c;是一种利用大语言模型进行复杂任务执行的应用。这种智能体通过结合大语言模型与关键模块&#xff0c;如规划和记忆&#xff0c;来执行任务。构建这类智能体时&#xff0c;LLM充当着控制中心或“大脑”的角色&#xff0…

【数据结构】模拟实现二叉搜索树

文章目录 1. 二叉搜索树的实现2. 二叉搜索树的应用3. 改造二叉搜索树为 KV 结构4. 二叉搜索树的性能分析 1. 二叉搜索树的实现 namespace key {template<class K>struct BSTreeNode{typedef BSTreeNode<K> Node;Node* _left;Node* _right;K _key;BSTreeNode(const…

YOLOv8独家改进:backbone改进 | 最新大卷积核CNN架构UniRepLKNet,ImageNet 88% | CVPR2024

💡💡💡本文独家改进:大核卷积一统多种模态!RepLK正统续作UniRepLKNet,代替YOLOv8 Backbone 改进结构图如下: 收录 YOLOv8原创自研 https://blog.csdn.net/m0_63774211/category_12511737.html?spm=1001.2014.3001.5482 💡💡💡全网独家首发创新(原创),适…

Windows系统搭建Cloudreve结合内网穿透打造可公网访问的私有云盘

目录 ⛳️推荐 1、前言 2、本地网站搭建 2.1 环境使用 2.2 支持组件选择 2.3 网页安装 2.4 测试和使用 2.5 问题解决 3、本地网页发布 3.1 cpolar云端设置 3.2 cpolar本地设置 4、公网访问测试 5、结语 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&#xff…

通讯芯片D3232简介——主要用于工控主板、工业控制器、新能源充电桩等众多涉及RS232通讯的产品。

一、应用领域 D3232芯片主要用于工控主板、工业控制器、程序烧录下载器、仿真器、新能源充电桩等众多涉及RS232通讯的产品。 二、基本特性 D3232芯片由两个线路驱动器、两个线路接收器和双电荷泵电路组成&#xff0c;具有HBM>15kV、CDM>2kV的ESD保护能力&#xff0c;并且…

Seata 2.x 系列【10】回滚日志表 undo_log

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Seata 版本 2.0.0 本系列Spring Boot 版本 3.2.0 本系列Spring Cloud 版本 2023.0.0 源码地址&#xff1a;https://gitee.com/pearl-organization/study-seata-demo 文章目录 1. 概述2. 表语句…

【Java 并发】AbstractQueuedSynchronizer 中的 Condition

1 简介 任何一个 Java 对象都天然继承于 Object 类, 在线程间实现通信的往往会应用到 Object 的几个方法, 比如 wait(), wait(long timeout), wait(long timeout, int nanos) 与 notify(), notifyAll() 几个方法实现等待 / 通知机制。同样的, 在 Java Lock 体系下也有同样的方…

工具篇--分布式定时任务springBoot--elasticjob简单使用(1)

文章目录 前言一、elasticjob 介绍&#xff1a;二、elasticjob 使用&#xff1a;2.1 部署zookeeper&#xff1a;2.2 引入库2.2 定义任务&#xff1a;2.3 任务执行&#xff1a;2.4 任务执行控制台输出&#xff1a; 三、elasticjob 启动错误&#xff1a;3.1 KeeperErrorCode Ope…

【Node.js从基础到高级运用】十二、身份验证与授权:JWT

身份验证与授权是现代Web应用中不可或缺的部分。了解如何在Node.js应用中实施这些机制&#xff0c;将使你能够构建更安全、更可靠的应用程序。本文将引导你通过使用JWT实现用户注册、登录和权限控制的过程。 JWT&#xff08;Json Web Token&#xff09; JWT是一种用于双方之间…

蓝桥杯深度优先搜索|剪枝|N皇后问题|路径之谜(C++)

搜索&#xff1a;暴力法算法思想的具体实现 搜索&#xff1a;通用的方法&#xff0c;一个问题如果比较难&#xff0c;那么先尝试一下搜索&#xff0c;或许能启发出更好的算法 技巧&#xff1a;竞赛时遇到不会的难题&#xff0c;用搜索提交一下&#xff0c;说不定部分判题数据很…

R语言tidycmprsk包分析竞争风险模型

竞争风险模型就是指在临床事件中出现和它竞争的结局事件&#xff0c;这是事件会导致原有结局的改变&#xff0c;因此叫做竞争风险模型。比如我们想观察患者肿瘤的复发情况&#xff0c;但是患者在观察期突然车祸死亡&#xff0c;或者因其他疾病死亡&#xff0c;这样我们就观察不…

基于单片机的太阳能热水器控制系统设计与仿真

目录 摘要 3 Controling system design and simulation of the solar water heater based on single chip microcomputer 4 第一章 前言 5 1.1设计背景和意义 5 1.2国内外的发展趋势 5 第二章 系统设计总览 7 2.1控制中心 7 2.2外围设备 7 第三章 系统硬件设计 8 3.1 总硬件的…

小程序路由跳转---事件通信通道EventChannel(二)

事件通信通道EventChannel实现两个页面之间的数据传输已在上篇小程序路由跳转—事件通信通道EventChannel&#xff08;一&#xff09;展开叙述&#xff0c;接下来讨论下多个页面&#xff08;三个及以上&#xff09;数据的通道如何构建。 本文重点&#xff1a;三个以上页面需将…

jenkin部署spring boot项目【从0到1】

写在前面&#xff0c;遇到的很多错误 本来想用docker启动Jenkins的&#xff0c;也这样做了&#xff0c;但是遇到了一个非常严重的问题&#xff0c;就是mvn命令在docker里面不生效&#xff0c;然后就修改文件&#xff0c;但是发现vi不存在&#xff0c;好的。接着用yum安装vi工具…

Vue2 引入自己下载的SVG图像的方式

Vue2 引入下载的SVG图像的方式 Step 1&#xff1a;安装依赖 npm i svg-sprite-loader --saveStep 2&#xff1a;创建文件路径 // index.js import Vue from vue import SvgIcon from /components/SvgIcon// svg component// register globally Vue.component(svg-icon, Svg…

《JAVA与模式》之抽象工厂模式

系列文章目录 文章目录 系列文章目录前言一、使用简单工厂模式的解决方案二、引进抽象工厂模式三、抽象工厂模式结构四、抽象工厂模式的优缺点前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看…