从零开始学习vivado——day 1 二选一多路器的设计

2023-12-13 11:23:07

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

研一从零开始学习verilog!!!此时不学何时学!
第一次写博客,以此激励自己努力学习!
我跟的视频教程是b站的一个up主,小梅哥爱漂流。


一、vivado是什么?

vivado是一个编译平台,可运行verilog代码,并且进行模拟仿真。

二、二选一多路器的设计

1.创建一个新的设计文件

在这里插入图片描述

在这里插入图片描述在这里插入图片描述
随便去个述
随便取个名字,默认verilog语言,点击即可。

在这里插入图片描述
在这里插入图片描述默认即可,后面可以纯手打设置端口
之后双击打开你创建好的文件,即可进入编译
在这里插入图片描述
文件里面默认的代码直接全部删除,自己手打一遍


2.模块代码编译

(1)定义端口

module hello_world(
a,b,int,out
);
input a;
input b;
input int;
output out;
endmodule

(2)连续赋值语句

assign out =(int==1)? a:b ;       //如果int等于1,则out输出为a,否则输出为b

该行代码就是二选一多路器的核心代码
(3)整合代码,然后进行分析综合

module hello_world(
a,b,int,out
);
input a;
input b;
input int;
output out;
 //二选一多路器
assign out =(int==1)? a:b ;       //如果int等于1,则out输出为a,否则输出为b
endmodule

在这里插入图片描述
若有弹窗,则先选择查看报告


3.创建激励文件

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
一路默认即可,最后双击创建的激励文件进行编译
![在这里插入图片描04cd.png


4.激励文件代码编译

(1)定义时间尺度

`timescale 1ns/1ns          //前面是步进,后面是精度

基本用不到皮秒,一般设计纳秒就OK了,容易出错的是timescale前面的“`”,就是英文键盘上tab键上面的按键

(2)例化

module helloworld_tb();
    reg s_a;//激励信号定义为reg型
    reg s_b;
    reg int;
    wire out;//输出信号定义为wire型号
    hello_world test_1(   //前面名字要和调用模块的名字一样,后面的名字可随意定义
        .a(s_a),          //变量前面加个点,然后括号内是连接哪个信号线上去
        .b(s_b),
        .int(int),        //例化时,括号里面可以使用原信号,也可以自己定义信号
        .out(out)
    );  //例化过程,将模块调用

(3)变化高低电平

 initial begin
      s_a=0;s_b=0;int=0;
      #200;//延迟200ns,1s=1000000000ns,九个0
      s_a=0;s_b=0;int=1;
      #200;//延迟200ns,1s=1000000000ns,九个0
      s_a=0;s_b=1;int=0;
      #200;//延迟200ns,1s=1000000000ns,九个0
      s_a=0;s_b=1;int=1;
      #200;//延迟200ns,1s=1000000000ns,九个0
      s_a=1;s_b=0;int=0;
      #200;//延迟200ns,1s=1000000000ns,九个0
      s_a=1;s_b=0;int=1;
      #200;//延迟200ns,1s=1000000000ns,九个0
      s_a=1;s_b=1;int=0;
      #200;//延迟200ns,1s=1000000000ns,九个0
      s_a=1;s_b=1;int=1;
      #200;//延迟200ns,1s=1000000000ns,九个0     
      $stop;//停止                                     
    end

(4)代码整合并仿真

`timescale 1ns/1ns          //前面是单位,后面是精度

module helloworld_tb();
    reg s_a;//激励信号定义为reg型
    reg s_b;
    reg int;
    wire out;//输出信号定义为wire型号
    hello_world test_1(   //前面名字要和调用模块的名字一样,后面的名字可随意定义
        .a(s_a),          //变量前面加个点,然后括号内是连接哪个信号线上去
        .b(s_b),
        .int(int),        //例化时,括号里面可以使用原信号,也可以自己定义信号
        .out(out)
    );  //例化过程,将模块调用

    initial begin
      s_a=0;s_b=0;int=0;
      #200;//延迟200ns,1s=1000000000ns,九个0
      s_a=0;s_b=0;int=1;
      #200;//延迟200ns,1s=1000000000ns,九个0
      s_a=0;s_b=1;int=0;
      #200;//延迟200ns,1s=1000000000ns,九个0
      s_a=0;s_b=1;int=1;
      #200;//延迟200ns,1s=1000000000ns,九个0
      s_a=1;s_b=0;int=0;
      #200;//延迟200ns,1s=1000000000ns,九个0
      s_a=1;s_b=0;int=1;
      #200;//延迟200ns,1s=1000000000ns,九个0
      s_a=1;s_b=1;int=0;
      #200;//延迟200ns,1s=1000000000ns,九个0
      s_a=1;s_b=1;int=1;
      #200;//延迟200ns,1s=1000000000ns,九个0     
      $stop;//停止                                     
    end
endmodule

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
此时,程序并没有跑完我们所设计的1600ns,只跑了1000ns,所以我们需要继续运行
在这里插入图片描述
完美!
在这里插入图片描述
可在右上角设置那里把第一个选项点掉,方便观看
在这里插入图片描述

4.布局布线

在这里插入图片描述

在这里插入图片描述
上图两个地方都打钩之后,没有红色报错,代表布局布线完成,可查看报告。

5.时序仿真

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
进行时序仿真时会发现,输出会有延迟以及毛刺的现象发生。


总结

本文简单描述了如何创建工程文件,并设计和仿真了一个简单的二选一多路器。因为没钱买板子,所以后续的连接板子教程我就没看了。
希望能够养成写博客的习惯,努力三年,争取毕业后找到一份称心的工作!!!

文章来源:https://blog.csdn.net/weixin_46087443/article/details/132735570
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。