出处https://blog.csdn.net/m0_66307842/article/details/128908924?spm=1001.2014.3001.5501
作者:流继承


前言:本章内容主要是演示Vivado下利用Verilog语言进行电路设计、仿真、综合和下载的示例:表决器(三人表决器)。



  • _功能特性: 采用 Xilinx Artix-7 XC7A35T芯片 _
  • _配置方式:USB-JTAG/SPI Flash _
  • _高达100MHz 的内部时钟速度 _
  • _存储器:2Mbit SRAM   N25Q064A SPI Flash(样图旧款为N25Q032A)_
  • _通用IO:Switch :x8LED:x16Button:x5DIP:x8   通用扩展IO:32pin _
  • _音视频/显示: 7段数码管:x8 VGA视频输出接口 Audio音频接口 _
  • _通信接口:UART:USB转UART   Bluetooth:蓝牙模块 _
  • _模拟接口: DAC:8-bit分辨率   XADC:2路12bit 1Msps ADC _


目录


 Ⅰ. 前置知识


0x00 表决器


0x01 真值表表示


0x02 卡诺图表示


0x03 逻辑表达式:


Ⅱ. Verilog实现


0x00 新建工程并添加的IP包


0x01 利用IP器件创建电路


0x02 Test Bench——添加仿真激励文件


0x03 仿真记录与分析 


 Ⅲ. 解释说明





 Ⅰ. 前置知识


0x00 表决器


以三人表决器为例说明多人表决电路的原理。


设三人表决器中输入为A、B、C,同意用1表示,不同意用0表示。输出为F,A、B、C三者中多数同意,提案通过,否则提案不被通过;通过用1表示,不通过用0表示。


0x01 真值表表示


输入

输出

A

B

C

F

0

0

0

0

0

0

1

0

0

1

0

0

0

1

1

1

1

0

0

0

1

0

1

1

1

1

0

1

1

1

1

1


0x02 卡诺图表示




0x03 逻辑表达式


 过程:写输出表达式即把输出结果为一的输入相加。如上F的一的有四个,把结果为一对应的输入写出即可,再化简,可通过卡诺图以及逻辑表达式化简。


可用狄摩根律转化为与非形式


若此步有不清楚的可留言



Ⅱ. Verilog实现


在本次Verilog实现表决器的功能中,我们学习如何利用他人封装好的组件型IP器件进行设计,故选择为工程添加所需IP包的方法。


0x00 新建工程并添加的IP包


在工程settings中IP的Repository中选择所需IP包的存放目录




点击Select,在图所示对话框中点击ok




Repositories自动更新如图:



点击OK完成IP包的添加


0x01 利用IP器件创建电路


点击Flow Navigator中的IP INTEGRATOR下Create Block Design,为电路设计命名:





 点击OK后工程自动更新至如图:



 在Diagram窗中点击按钮,添加IP器件。


根据原理中的F=AB+BC+CA,本实验添加两种基本器件:AND和OR,


如图:





完成后Design窗自动更新至下图效果:




 在Diagram窗,完成器件添加


之后添加基本引脚:



 增加输入引脚3个,命名自拟


可以为A、B、C,输出1个,可以命名为F。


完成连线,如图:



 点击检查布线的正确性


另外,可点击可以自动优化布线,但这一步并不是必须的


可得出下图:




 点击【保存】按钮,保存电路设计文件:




在Sources栏可以看到新增的文件如图:




 点击该新增文件,如图:



点击Create HDL Wrapper菜单。利用默认项,可让Vivado自动生成代码,如图:



Source栏会自动更新至如图效果:



0x02 Test Bench——添加仿真激励文件

`timescale 1ns / 1ps
module sim4Second( );
reg inA;reg inB;reg inC;
wire outF;
IPdesign_Second_wrapper test(.A(inA),.B(inB),.C(inC),.F(outF));
always begin
            inA = 0;inB = 0;inC=0;   #100;
            inA = 0;inB = 0;inC=1;   #100;
            inA = 0;inB = 1;inC=0;   #100;
            inA = 0;inB = 1;inC=1;   #100;
            inA = 1;inB = 0;inC=0;   #100;           
            inA = 1;inB = 0;inC=1;   #100;
            inA = 1;inB = 1;inC=0;   #100;
            inA = 1;inB = 1;inC=1;   #100;
        end
endmodule

0x03 仿真记录与分析 




输入

输出

周期

时间

A

B

C

F

1

0-100ns

0

0

0

0

2

100ns-200ns

0

0

1

0

3

200ns-300ns

0

1

0

0

4

300ns-400ns

0

1

1

1

5

400ns-500ns

1

0

0

0

6

500ns-600ns

1

0

1

1

7

600ns-700ns

1

1

0

1

8

700ns-800ns

1

1

1

1

Ⅲ. 解释说明
本篇博客旨在学习如何利用他人封装好的组件型IP器件进行设计,从而理解在vivado中,Block Design仅仅是用以设计的直观,最终还是需要生成Verilog等硬件描述语言后才能进一步完成后续设计。

同时,本实验中,生成的IPdesign_Second_wrapper这个module其实是调用了IPdesign_Second,这种调用属于模块化设计方法,因此仿真激励文件中语句IPdesign_Second_wrapper test(参数); 其实信号会继续传递给IPdesign_Second 子模块; 请在仿真界面中调出不同模块的引脚波形进行观察理解。

若不使用导入IP包的方法,设计文件可书写如下:

`timescale 1 ps / 1 ps
 
module design_1_wrapper(A,B,C,F);
  input A;
  input B;
  input C;
  output F;
 
  wire A;
  wire B;
  wire C;
  wire F;
 
  design_1 design_1_i (.A(A),.B(B), .C(C),.F(F));
endmodule