用Verilog HDL的三种建模方式描述——2选1数据选择器

来源:互联网 发布:泛型编程与stl 编辑:程序博客网 时间:2024/05/18 04:50

转自:http://www.cnblogs.com/zxl2431/archive/2010/09/17/1829603.html


1,数据选择器的定义和功能

  数据选择是指经过选择,把多路数据中的某一路传送到公共数据线上,实现数据选择功能的逻辑电路称为数据选择器。它的作用相当于多输入的单刀多掷开关

 

  2,集成电路数据选择器

  常用的集成电路数据选择器有许多种类,并且有COMS和TTL产品。例如,四2选1数据选择器74x157、双4选1数据选择器74x153、8选1数据选择器74x151等。

  还有一些数据选择器具有三态输出功能,例如以上述产品相对应具有三态输出功能的有74x257、74x253、74x251。除了正常的0或1输出外,当低电平使能输入端/E为1时,输出为高阻状态。利用这一特点,可以将多个芯片的输出端线与在一起,共用一根数据传输线,而不会存在负载效应问题。

 

  3,实例练习(2选1数据选择器)

  该数据选择器有两个输入信号(a和b)和一个控制输入(sel),一个输出(out)。当sel为1的时候out选择a,当sel为0的时候out选择b。首先列出真值表。

  简单的表达:                                               

      简单的表达

      图(1)

 

  具体化:

      

      图(2)

 

  根据真值表写出逻辑函数表达式:

       

      图(3)

        

  化简后:

       

      图(4)

  

  根据逻辑表达式画出电路图:

      

      图(5)

 

  3.1  用门级原语描述。

  

代码

  第12~15行采用了门级原语,用到了最基础的与、或、非门。

  编译后,看一下它综合之后的RTL视图:

      

        图(6)

 

  可以跟之前画的比较一下,看是不是一样的。

  

  编写testbench,验证其功能是否正确,或则用其自带的仿真工具也行。

  我用的是QII 9.1,在源代码编写完以后,写testbench和仿真的步骤大概是这样的:

  Processing > Start > Start Test Bench Template Writer,它就会自动生成一个模板并且自动的将顶层的.V文件进行例化

        

         图(7)

 

   点击打开文件的图标,在工程存放的目标文件夹下的modelsim文件夹里打开.VT文件。

        

        图(8)

 

  在.VT下可以看到一些它跟你做好的东西,删除一些你不要的东西,编写你的测试代码。

代码

 

  保存,编译。在仿真之前先要设置一下,Assignment > EDA Tool Settings

         

         图(9)

 

  在弹出的窗口下点击Simulation,在NativeLink setting下,选择Compile test bench标签,单击Test Benches按钮

         

         图(10)

 

  这几个名字分清楚,Test Bench Name 就是测试脚本的名字在这里是:mux2to1_GLTop Level Module in text bench 是在测试脚本中顶层模块的名字在这里是mux2to1_GL_vlg_tstDesign instance name in text bench 就是在测试脚本中例化的名字在本例中是:i1。然后添加文件,再直接点击3个OK,

         

         图(11)

 

  仿真,Tools -> Run EDA Simulation -> EDA RTL Simulatiom

         

         图(12)

 

  可以看到仿真波形和我们设计的是一样的,当sel0时,输出out的波形跟b的波形一致,当sel1时,输出out的波形跟a的一致。

         

         图(13)

 

  下面就可以分配引脚,下载到板子上。

  在仿真之前还有一个ModelSim-Altera路径的设置,选择Tools>Options>General>EDA Tool Options,看你的Modelsim安装在哪里,你就改在哪里。

 

  3.2   用数据流来描述

  

代码

 

 

  我觉得assign后面的两种写法都行,当然仿真的结果是一样的。但是写out = (a&sel) |(b&(~sel));时综合后生成的RTL和前面一样,而用out = sel ? a : b; 时综合后生成的RTL的视图:

         

          图(14)

 

  它直接就是一数据选择器,而没有综合成最基本的门电路,还得想一下这是什么原因。

        

  3.3  用行为级描述

 

代码

 

  综合之后的RTL视图如图(14).

  功能仿真的效果跟前面一样,RTL却出现了两种电路图,内部应该是一样的,但为什么就以两种形式表示出来呢?不是太清楚。

 

0 1