• 你的第一个基于Vivado的FPGA开发流程实践——二选一多路器


    你的第一个基于Vivado的FPGA开发流程实践——二选一多路器

    1 原理图

    image-20221112000238201

    2 开发流程

    • 首先我们先打开安装好的Vivado软件
    image-20221112000439561
    • 创建一个文件
    image-20221112000529464 image-20221112000621872 image-20221112000704982
    • 选择你的开发板
    image-20221112000753236
    • 创建一个源文件

    现在我们就可以根据原理使用Verilog代码实验这个功能了

    module mux2(  //端口列表
      a,
      b,
      sel,
      out
          );
        //交代端口类型
        input a;
        input b;
        input sel;
        output out;
        
        //赋值
        assign out = (sel==1)?a:b;
        
    endmodule
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 运行综合(Run Synthesis)
    image-20221112001418652
    • 然后我们可以观察一下综合运行完生成的report

    image-20221112001515376

    这里可以看出没什么问题,没有报错

    • 仿真的意义

    首先我们需要用一张图说明仿真测试的原理/意义

    image-20221112002355705

    现在开始编写仿真代码,我们首先要知道的是

    a、b、sel 共有8组取值,分别是

    absel
    000
    001
    010
    011
    100
    101
    110
    111
    • 创建仿真文件

    image-20221112002712975

    • 仿真代码
    `timescale 1ns / 1ps
    
    module mux2_tb(
        //仿真中括号里不用写端口
     );  
        //定义仿真文件中的变量
             //输入
             reg a;
             reg b;
             reg sel;
             //输出
             wire out;
        mux2 UUT(   //相当于把源文件的变量映射(例化)到仿真文件,mux2是源文件的名字,必须一致
            .a(a),     //源文件的a 对应到 仿真文件 是 a
            .b(b),
            .sel(sel),
            .out(out)
        );
        
        initial begin 
           a=0;b=0;sel=0;
           #200; //延迟200ns
           
           a=0;b=0;sel=1;
           #200; //延迟200ns
           
           a=0;b=1;sel=0;
           #200; //延迟200ns
           
           a=0;b=1;sel=1;
           #200; //延迟200ns
           
           a=1;b=0;sel=0;
           #200; //延迟200ns
           
           a=1;b=0;sel=1;
           #200; //延迟200ns
           
           a=1;b=1;sel=0;
           #200; //延迟200ns              
           
           a=1;b=1;sel=1;
           #200; //延迟200ns
           
        end
    endmodule
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 功能仿真
    image-20221112004231892

    image-20221112004725902

    我们可以根据左边的这些值 判断功能是否能达成

    • 布局布线/运行实现(Run Implementation)
    image-20221112005144533
    • 时序仿真——要在布局布线之后
    image-20221112005303494

    image-20221112005533656

    通过时序仿真我们可以看到 out的变化滞后于信号的变化,这说明out的变化是有一定延迟的,这是合理的

    image-20221112005731525

    我们还能看到毛刺,原理是(a、b、sel都在变,只要某一次变化中,其中一个的变化优先于另外两个,就会有毛刺)

    • 分配管脚

    首先open设计

    image-20221112010023972

    然后分配

    image-20221112010055532

    选择合适的管脚(要看板子)

    image-20221112010245964

    然后ctrl+s 保存管脚约束文件

    image-20221112010415778

    就生成了这样的约束文件

    • 创建bit流文件

    image-20221112010709824

    • 下载文件到板子

    首先连接板子到电脑

    image-20221112010818725

    然后refresh device 再 program device

    image-20221112010914041

    • 检验

    image-20221112011333916
    图中展示的为 sel = 1 ,a = 1的情况 (out = a = 1 灯亮)

  • 相关阅读:
    2022.1版本idea 安装教程
    Spring-Bean的生命周期
    【string题解 C++】翻转字符串II:区间部分翻转 | 验证回文串
    Linux内存管理(二十三):slub 分配器之kmem_cache_create
    ansible模块示例及说明
    牛客网:NC98 判断t1树中是否有与t2树完全相同的子树
    深入实现 MyBatis 底层机制的任务阶段 6-实现任务阶段 6- 在 WyxConfiguration, 读取 XxxMapper.xml,能够创建 MappperBean 对象
    第四章:Python中的字典(下)
    elementui 表单规则
    Qt状态机框架
  • 原文地址:https://blog.csdn.net/Living_Amethyst/article/details/127815566