Vivado下组合逻辑模块的仿真

news2024/10/6 18:35:30

文章目录

  • 与门
  • 或门
  • 非门
  • 异或门
  • 同或门
  • 比较器
  • 半加器
  • 全加器
  • 乘法器
  • 数据选择器
  • 3-8 译码器
  • 三态门

组合逻辑电路的特点是任意时刻的输出仅仅取决于输入信号,输入信号变化,输出立即变化,其变化不依赖于时钟。
本文中的例子中模块名都是gate,仿真测试文件中的模块名都是sim_gate。如果你在一个工程下创建了好几个.v文件,要运行其中的一个仿真,可以选中该文件,点击Set as Top,这样仿真的就是置于顶部的那个文件了。


与门

与门的代码如下。

module gate(a,b,c);
input a;
input b;
output c;

assign c = a & b;
endmodule

仿真测试代码如下。

`timescale 1ns / 1ps
module sim_gate();
reg a;
reg b;
wire c;

initial
begin
    a = 0;
    b = 0;
    forever
    begin
	    #({$random}%100)  //生成一个0-99的随机数,以 ns 为单位延迟该随机数的时长
	    a = ~a;
	    #({$random}%100)
	    b = ~b;
    end 
end

gate uut_gate(
    .a(a),
    .b(b),
    .c(c)
);
endmodule

与门的仿真结果如下图所示,仿真运行时间设置为1us。
在这里插入图片描述
通过仿真图可以看出来,两个输入都为1时,输出结果才是1。
与门的RTL图如下。
在这里插入图片描述
如果上述例子中的a和b位宽大于1,比如a和b的位宽均为4,那么a&b就是对应位的相与,仿真结果如下图所示。
在这里插入图片描述
这时RTL图就是下图所示的这样。
在这里插入图片描述


或门

或门的代码只需要将与门代码中的"&“改为”|"即可。
或门的仿真结果如下图所示。
在这里插入图片描述
通过上面的输出图可以看到,两个输入中只要有一个为1,输出结果就是1。
或门的RTL图如下。
在这里插入图片描述


非门

非门的代码比与门的代码更简单,不再需要变量c,b=~a即可,然后把仿真文件中的代码删减一下即可。
非门的仿真结果如下图所示。
在这里插入图片描述
非门的输出就是将输入取反。
非门的RTL图如下。
在这里插入图片描述


异或门

异或门的代码只需要将与门代码中的"&“改为”^"即可。
异或门的仿真结果如下图所示。
在这里插入图片描述
通过上图可以看到,两个输入不同时,输出为1,输入相同时,输出为0。
异或门的RTL图如下。
在这里插入图片描述


同或门

同或门的代码只需要将与门代码中的"&“改为”^~"即可。
同或门的仿真结果如下图所示。
在这里插入图片描述
通过上图可以看到,两个输入相同时,输出为1,输入不同时,输出为0。
同或门的RTL图如下。
在这里插入图片描述


比较器

比较器这里以 c=a>b 为例说明,如果 a>b,那么c的值为1,否则为0。对于二进制来说,只有a=1,b=0时,c=1。
比较器的代码只需要将与门代码中的"&“改为”>"即可。
比较器的仿真结果如下图所示。
在这里插入图片描述
该例子中,输入a大于输入b时,即只有 a=1,b=0 时,输出才为1。
比较器的RTL图如下。
在这里插入图片描述


半加器

半加器和全加器是算术运算电路中的基本单元,由于半加器不考虑从低位来的进位,所以称为半加器。
半加器的真值表如下表所示。

absumcount
0000
0110
1010
1101

半加器的代码如下。

module gate(a,b,sum,count);
input a;
input b;
output sum;
output count;

assign sum = a + b;
assign count = a & b;
endmodule

仿真测试代码如下。

`timescale 1ns / 1ps
module sim_gate();
reg a;
reg b;
wire sum;
wire count;

initial
begin
    a = 0;
    b = 0;
    forever
    begin
    #({$random}%100)
    a = ~a;
    #({$random}%100)
    b = ~b;
    end 
end

gate uut_gate(
    .a(a),
    .b(b),
    .sum(sum),
    .count(count)
);
endmodule

半加器的仿真结果如下图所示。
在这里插入图片描述
将上图输出和其真值表对照,输出与预期一致。
半加器的RTL图如下。
在这里插入图片描述


全加器

全加器在半加器的基础上考虑来自低位的进位,因此实现起来更加复杂,参与运算的数也比半加器多一个。
全加器的真值表如下表所示。

abcinsumcount
00000
01010
10010
11001
00110
01101
10101
11111

全加器的代码如下。

module gate(a,b,sum,count,cin);
input a;
input b;
input cin;
output sum;
output count;

assign {count,sum} = a + b + cin;  //通过一个位拼接运算达到计算count和sum的目的
endmodule

仿真测试代码如下。

`timescale 1ns / 1ps
module sim_gate();
reg a;
reg b;
reg cin;
wire sum;
wire count;

initial
begin
    a = 0;
    b = 0;
    cin = 0;
    forever
    begin
    #({$random}%100)
    a = ~a;
    #({$random}%100)
    b = ~b;
    #({$random}%100)
    cin = ~cin;
    end 
end

gate uut_gate(
    .a(a),
    .b(b),
    .cin(cin),
    .sum(sum),
    .count(count)
);
endmodule

全加器的仿真结果如下图所示。
在这里插入图片描述
将上图输出和其真值表对照,输出与预期一致。
全加器的RTL图如下。
在这里插入图片描述


乘法器

乘法器这里在设置时将两个乘数设置为两位的,这样其最大表示十进制的3,相乘后最大表示十进制的9,因此需要4位二进制的输出。
乘法器的代码如下。

module gate(a,b,c);
input[1:0] a;
input[1:0] b;
output[3:0] c;

assign c = a * b;
endmodule

仿真测试代码如下。

module sim_gate();
reg[1:0] a;
reg[1:0] b;
wire[3:0] c;

initial
begin
    a = 0;
    b = 0;
    forever
    begin
    #({$random}%100)
    a = {$random}%4;
    #({$random}%100)
    b = {$random}%4;
    end 
end

gate uut_gate(
    .a(a),
    .b(b),
    .c(c)
);
endmodule

乘法器的仿真结果如下图所示。
在这里插入图片描述
将输入和输出以无符号的十进制数显示,可以清楚地看到两数相乘的结果。
乘法器的RTL图如下。
在这里插入图片描述


数据选择器

下面这个例子是四选一数据选择器,选择信号是两位,输入信号是4个,可以将其设置为1位,也可以设置为多位,输出信号与输入信号的位数一致。
四选一数据选择器的选择情况如下表所示。

selmux
00(0)a
01(1)b
10(2)c
11(3)d

数据选择器的代码如下。

module gate(a,b,c,d,sel,mux);
input[2:0] a;
input[2:0] b;
input[2:0] c;
input[2:0] d;
input[1:0] sel;
output reg[2:0] mux;

always@(a,b,c,d,sel)
begin
    case(sel)
        2'b00 : mux = a;
        2'b01 : mux = b;
        2'b10 : mux = c;
        2'b11 : mux = d;
     endcase   
end
endmodule

仿真测试代码如下。

`timescale 1ns / 1ps
module sim_gate();
reg[2:0] a;
reg[2:0] b;
reg[2:0] c;
reg[2:0] d;
reg[1:0] sel;
wire[2:0] mux;

initial
begin
    a = 0;
    b = 0;
    c = 0;
    d = 0;
    forever
    begin
    #({$random}%100)
    a = {$random}%8;
    #({$random}%100)
    b = {$random}%8;
    #({$random}%100)
    c = {$random}%8;
    #({$random}%100)
    d = {$random}%8;
    end 
end

initial 
begin 
    sel = 2'b00;
    #250 sel = 2'b01;
    #250 sel = 2'b10;
    #250 sel = 2'b11;
end

gate uut_gate(
    .a(a),
    .b(b),
    .c(c),
    .d(d),
    .sel(sel),
    .mux(mux)
);
endmodule

输入是1位时,数据选择器的仿真结果如下图所示。
在这里插入图片描述
可以看到,数据选择器的输出是根据代码编写的那样进行的。
输入是3位时,数据选择器的仿真结果如下图所示。
在这里插入图片描述
为了直观的看到不同,将输入位数设置为3位的,输出也是按照代码编写的那样进行的。
输入是1位时,数据选择器的RTL图如下。
在这里插入图片描述
输入是3位时,数据选择器的RTL图如下。
在这里插入图片描述


3-8 译码器

3-8 译码器的译码情况如下表所示。

addrdecoder
000(0)11111110
001(1)11111101
010(2)11111011
011(3)11110111
100(4)11101111
101(5)11011111
110(6)10111111
111(7)01111111

3-8 译码器的代码如下。

module gate(addr,decoder);
input[2:0] addr;
output reg[7:0] decoder;

always@(addr)
begin
    case(addr)
        3'b000 : decoder = 8'b1111_1110;
        3'b001 : decoder = 8'b1111_1101;
        3'b010 : decoder = 8'b1111_1011;
        3'b011 : decoder = 8'b1111_0111;
        3'b100 : decoder = 8'b1110_1111;
        3'b101 : decoder = 8'b1101_1111;
        3'b110 : decoder = 8'b1011_1111;
        3'b111 : decoder = 8'b0111_1111;
     endcase   
end
endmodule

仿真测试代码如下。

`timescale 1ns / 1ps
module sim_gate();
reg[2:0] addr;
wire[7:0] decoder;

initial 
begin 
    addr = 3'b000;
    #125 addr = 3'b001;
    #125 addr = 3'b010;
    #125 addr = 3'b011;
    #125 addr = 3'b100;
    #125 addr = 3'b101;
    #125 addr = 3'b110;
    #125 addr = 3'b111;
end

gate uut_gate(
    .addr(addr),
    .decoder(decoder)
);
endmodule

3-8 译码器的仿真结果如下图所示。
在这里插入图片描述
由上述仿真结果可以看到,译码输出和代码中编写的是一致的。
3-8 译码器的RTL图如下。
在这里插入图片描述


三态门

三态门是FPGA中经常用到的器件,使能信号用于打开或关闭三态门。
三态门的代码如下。

module gate(en,in,out);
input en;
input in;
output out;

assign out = en ? in : 1'bz;
endmodule

仿真测试代码如下。

`timescale 1ns / 1ps
module sim_gate();
reg en;
reg in;
wire out;

initial 
begin 
    en = 1;
    #250 en = 0;
    #250 en = 1;
    #250 en = 0;
end

initial 
begin 
    in = 0;
    forever
    begin
        #({$random}%100)
        in = ~in;
    end
end

gate uut_gate(
    .en(en),
    .in(in),
    .out(out)
);
endmodule

三态门的仿真结果如下图所示。
在这里插入图片描述
可以看到,使能信号为1时,输出等于输入信号,使能信号为0时,输出为高阻状态。
三态门的RTL图如下。
在这里插入图片描述
接下来在三态门的基础上增加一个输入输出口,将两个三态门进行关联,从而实现双向的输入和输出。
在这里插入图片描述
如上图,当en0为0,en1为1时,1通道打开,双向IO bio就等于1通道的in1,故1通道向外发送数据,0通道接收数据,out0等于bio;当en0为1,en1为0时,0通道打开,双向IO bio就等于0通道的in0,0通道向外发送数据,1通道接收数据,out1等于bio。
双向的输入和输出的代码如下。

module gate(en,in,out,bio);
input en;
input in;
output out;
inout bio;

assign bio = en ? in : 1'bz;
assign out = bio;
endmodule

仿真测试代码如下。

module sim_gate();
reg en0;
reg in0;
wire out0;
reg en1;
reg in1;
wire out1;
wire bio;

initial 
begin 
    en0 = 0;
    en1 = 1;
    #200
    en0 = 0;
    en1 = 0;
    #50
    en0 = 1;
    en1 = 0;
    #200
    en0 = 0;
    en1 = 0;
    #50
    en0 = 0;
    en1 = 1;
    #250
    en0 = 1;
    en1 = 0;
end

initial 
begin 
    in0 = 0;
    in1 = 0;
    forever
    begin
        #({$random}%100)
        in0 = ~in0;
        #({$random}%100)
        in1 = ~in1;
    end
end

gate uut_gate0(
    .en(en0),
    .in(in0),
    .out(out0),
    .bio(bio) 
);

gate uut_gate1(
    .en(en1),
    .in(in1),
    .out(out1),
    .bio(bio) 
);
endmodule

双向的输入和输出的仿真结果如下图所示。
在这里插入图片描述
这里out0和out1的值是一样的,因为在定义时,它们都等于bio的值。


参考资料:
ZYNQ 开发平台 FPGA 教程 AX7020

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

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

相关文章

HSE健康安全环境管理,已成现代企业必备的一种管理工具

什么是HSE健康安全环境管理 HSE是英文单词Health,Safety,Environment的缩写,中文翻译就是健康、安全、环境管理的意思。HSE管理是一种科学、系统的企业管理方式,目的是为了以人为本,保障员工和环境的健康和安全&#…

express的使用(三) multer处理表单提交

个人博客 欢迎关注公众号:express的使用(三) multer处理表单提交 看前提示 本篇的主要流程是使用在前端提交一个文件,在nodejs编写的后端使用multer以及express进行接收,包括遇到的版本问题,如果是想要学习用body-parser、formidable、mul…

node.js版本与node-sass版本不一致解决

版本比较图 查看版本对比图: https://www.npmjs.com/package/node-sass node.js版本与node-sass版本不一致时npm install是可能会报错的。 安装对应版本 查看nodejs版本 CMD查看nodejs版本 node -v卸载不一致的node-sass npm uninstall node-sass安装指定版…

JAVA并发编程之锁应用

Java并发包是Java中提供的一个用于支持多线程编程的工具包。Java并发包提供了多种机制来控制线程的执行,保证线程的安全性和可靠性。下面我们将介绍Java并发包的使用方法,并给出示例。 synchronized public class SynchronizedDemo { ​private int v;…

华为云认证有什么?考试难不难?

最近几年华为云的市场占比越来越大,逐渐占据了我们生活中的方方面面,而且很多政企单位,也选择华为云作为合作伙伴,因此市场上也需要越来越多的华为云人才,早在几年前,华为云就已经推出了自己的人才认证系统…

条件随机场模型

条件随机场模型(Conditional Random Fields, CRF) 条件随机场是给定一组输入随机变量条件下,另一组输出随机变量的条件概率分布模型,其特点是假设输出随机变量构成马尔可夫随机场。线性链条件随机场,是输入序列对输出…

用 JavaScript 对抗 DDOS 攻击

继续趣事分享。 上回聊到了大学里用一根网线发起攻击,今天接着往后讲。 不过这次讲的正好相反 —— 不是攻击,而是防御。一个奇葩防火墙的开发经历。 第二学期大家都带了电脑,于是可以用更高端的方法断网了。但设备先进反而没有了 GEEK 的…

第十七章行为性模式—状态模式

文章目录 状态模式解决的问题反例 结构实例存在的问题使用场景 状态模式与策略模式的区别 行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象无法单独完成的任务,它涉及算法与对象间职责的分配。行为型…

Java中常见转换-数组与list互转、驼峰下划线互转、Map转Map、List转Map、进制转换的多种方式

场景 Java中数组与List互转的几种方式 数组转List 1、最简单的方式,Arrays.asList(array); 创建的是不可变列表&#xff0c;不能删除和新增元素 String[] array new String[]{"a","b"};List<String> stringList Arrays.asList(array);System.ou…

嵌入式和单片机

凡是从事信息技术相关工作的&#xff0c;一定都听说过嵌入式和单片机。 大家都知道&#xff0c;这两个名词&#xff0c;和硬件系统有着非常密切的关系。 但是&#xff0c;如果要问具体什么是嵌入式&#xff0c;什么是单片机&#xff0c;它们之间究竟有什么区别&#xff0c;我…

【NovelAI 小说SD批量生成 文生图】Web版环境配置和使用方法

样片&#xff1a; 【样品】《谜影之夜》文生图全自动版SD一键成片 操作演示&#xff1a; 【txt2video web】携带漫画插件的Web版AI小说生成工具无声演示版 操作口述教程&#xff1a; 【NovelAI】携带漫画插件的Web版AI小说生成视频工具 该文章面向购买脚本的付费用户&#xff0…

钓鱼网站也在使用https加密,如何识别钓鱼网站?

信息安全是一个庞大的领域&#xff0c;其中涉及到很多知识点&#xff0c;但是大多公司都对其没有提及足够的重视&#xff0c;希望随着国内对于安全的越来越重视&#xff0c;更多的公司也能在信息安全领域投入越来越多的注意。 安装SSL证书是为了对数据进行加密传输&#xff0c…

轻松学会食堂管理,就这么简单!

随着科技进步和生活水平的不断提高&#xff0c;人们对于餐饮消费的需求也逐渐变得多样化和个性化。 高校食堂现状分析 01.信息化水平低&#xff0c;学校管理难&#xff0c;无法精准就餐&#xff1b; 02用户满意度低&#xff0c;学生取餐环节效率低&#xff1b; 03.管理效率低…

【Redis】浅谈Redis-集群(Cluster)

文章目录 前言1、集群实现1.1 创建cluster目录&#xff0c;并将redis.conf复制到该文件夹1.2 复制redis.conf&#xff0c;并进行配置1.3 启动redis&#xff0c;查看启动状态1.4 合成集群1.5 查看集群1.6 集群读写操作 2、SpringBoot整合redis集群2.1 引入包2.2 设置配置2.3 使用…

C++服务器框架开发5——日志系统logAppender/IO类“3种stream”/双感叹号

该专栏记录了在学习一个开发项目的过程中遇到的疑惑和问题。 其教学视频见&#xff1a;[C高级教程]从零开始开发服务器框架(sylar) 上一篇&#xff1a;C服务器框架开发4——日志系统logger/.cpp与.cc C服务器框架开发5——日志系统logAppender/IO类“3种stream”/双感叹号 目前…

2022年天府杯全国大学生数学建模竞赛C题环境保护与绿色经济解题全过程文档及程序

2022年天府杯全国大学生数学建模竞赛 C题 环境保护与绿色经济 原题再现&#xff1a; “节能减排”和发展绿色经济是国家一项重大战略规划。“绿水青山就是金山银山”。环境的保护对国民经济的发展有着重要意义。随着工业化进程的加快&#xff0c;环境保护方面的问题已经刻不容…

ClickHouse进阶|如何自研一款企业级高性能网关组件?

使用原生ClickHouse集群进行节点数据查询和写入时&#xff0c;离不开第三方开源网关组件chproxy支持。但由于chproxy缺少TCP协议支持&#xff0c;导致性能、查询能力等受限。这也成为困扰众多ClickHouse开发者的一大难题。那么&#xff0c;究竟应该如何突破&#xff1f;本文将揭…

chatgpt赋能python:Python中撤销的快捷键

Python中撤销的快捷键 在编程中&#xff0c;我们经常需要进行调试&#xff0c;不可避免地会出现一些错误&#xff0c;这时候撤销 (Undo) 功能就显得尤为重要。在 Python 中&#xff0c;我们可以使用一些快捷键来快速撤销&#xff0c;本文将会介绍这些快捷键的使用以及使用它们…

chatgpt赋能python:Python中的字符提取:从基础到高级

Python中的字符提取&#xff1a;从基础到高级 在使用Python进行文本处理和数据挖掘时&#xff0c;我们经常需要从字符串中提取特定的字符或子串。本文将介绍Python中的常用字符串提取方法&#xff0c;包括基础的字符串操作、正则表达式和第三方库等高级方法。 基础字符串操作…

二叉树中堆的实现

完全二叉树 满二叉树&#xff1a;二叉树每个节点的度都达到最大值&#xff08;2&#xff09;&#xff0c;由此可有等比求和计算出节点总数&#xff1a;2^k-1 完全二叉树&#xff1a;除了最后一层。前面节点的度都满了&#xff0c;最后一层可以不满&#xff0c;但是必须从左至右…