【FPGA】Verilog 编码实现:与非门 | 或非门 | 异或门 | NAND/NOR/XOR 行为验证

news2024/10/5 11:06:08

写在前面:本章主要内容为了解和确认 NAND/NOR/XOR 门的行为,并使用Verilog实现,生成输入信号后通过模拟,验证每个门的操作,并使用 FPGA 来验证 Verilog 实现的电路的行为。

本章目录:

Ⅰ. 前置知识

0x00 与非门(NAND)

0x01 或非门(NOR)

0x02 异或门(XOR)

Ⅱ. 练习(Assignment)

0x00  4-input NAND gate

0x01  4-input NOR gate

0x02  4-input XOR gate

0x03  4-input AOI(AND OR Inverter) gate


Ⅰ. 前置知识

0x00 与非门(NAND)

如果所有输入均为High (1),则输出为Low (0),在其他情况下,将产生High (1) 输出。

  • NAND 是 AND 运算符的否定结果

布尔表达式中以 "负乘法" 形式表现:

0x01 或非门(NOR)

如果所有输入均为 Low (0),则输出为 High(1),其中一个输入为高 (1) 则产生低功率 (0)。

  • NOR 是 OR 运算符的否定结果

布尔表达式中以 "否定合" 形式表现:

0x02 异或门(XOR)

如果 两个值不相同,则异或结果为1。如果 两个值相同,异或结果为0。

Ⅱ. 练习(Assignment)

0x00  4-input NAND gate

比较 AB 的布尔表达式,完成 A 和 B 的 Verilog 代码,通过 Simulation 结果进行比较。

💬 Design source:

`timescale 1ns / 1ps

module input_4_NAND(
    // Input the var
    input a, b, c, d,
    // Output the var
    output e, f, g
    );
   
// NAND = NOT + AND     
assign e = ~(a & b);    // a and b then inv   
assign f = ~(e & c);    // e and c then inv
assign g = ~(f & d);    // f and d then inv

endmodule

💬 Simulation:

`timescale 1ns / 1ps

module input_4_NAND_tb;
reg aa, bb, cc, dd;
wire e, f, g;

input_4_NAND u_input_4_NAND (
    .a(aa),
    .b(bb),
    .c(cc),
    .d(dd),
    .e(e),
    .f(f),
    .g(g)
    );

initial aa = 1'b0;
initial bb = 1'b0;
initial cc = 1'b0;
initial dd = 1'b0;

always aa = #100 ~aa;
always bb = #200 ~bb;
always cc = #400 ~cc;
always dd = #800 ~dd;

initial begin
    #1600
    $finish;
end

endmodule

🚩 运行结果如下:

💡 解读:assign 语句中,用取反运算符 ~ 和或运算符 | 实现了 4 个输入取反或运算,并将结果分别赋值给输出变量 e, f, g

0x01  4-input NOR gate

比较 AB 的布尔表达式,完成 A 和 B 的 Verilog 代码,通过 Simulation 结果进行比较。

💬 Design source:

`timescale 1ns / 1ps

module input_4_NOR(
    /* Input the var */
    input a, b, c, d,
    /* Output the var */
    output e, f, g
    );
    
/* NOR = NOT + OR */
assign e = ~(a | b);
assign f = ~(e | c);
assign g = ~(f | d);

endmodule

💬 Testbench:

`timescale 1ns / 1ps

// input_4_NOR_tb

module input_4_NOR_tb;
// input
reg aa, bb, cc, dd;
// output
wire e, f, g;

input_4_NOR u_input_4_NOR (
    .a(aa),
    .b(bb),
    .c(cc),
    .d(dd),
    
    .e(e),
    .f(f),
    .g(g)
    );

initial aa = 1'b0;
initial bb = 1'b0;
initial cc = 1'b0;
initial dd = 1'b0;

always aa = #100 ~aa;
always bb = #200 ~bb;
always cc = #400 ~cc;
always dd = #800 ~dd;

initial begin
    #1600
    $finish;
end

endmodule

🚩 运行结果如下:

0x02  4-input XOR gate

比较 AB 的布尔表达式,完成 A 和 B 的 Verilog 代码,通过 Simulation 结果进行比较。

💬 Design source:

`timescale 1ns / 1ps

module input_4_XOR(
    /* Input the var */
    input a, b, c, d,
    /* Output the var */
    output e, f, g
);

/* XOR */
assign e = a ^ b;
assign f = e ^ c;
assign g = f ^ d;

endmodule

💬 Testbench:

`timescale 1ns / 1ps

module input_4_XOR_tb;
// input
reg aa, bb, cc, dd;
// output
wire e, f, g;

input_4_XOR u_input_4_XOR (
    .a(aa),
    .b(bb),
    .c(cc),
    .d(dd),
    
    .e(e),
    .f(f),
    .g(g)
    );

initial aa = 1'b0;
initial bb = 1'b0;
initial cc = 1'b0;
initial dd = 1'b0;

always aa = #100 ~aa;
always bb = #200 ~bb;
always cc = #400 ~cc;
always dd = #800 ~dd;

initial begin
    #1600
    $finish;
end

endmodule

🚩 运行结果如下:

0x03  4-input AOI(AND OR Inverter) gate

💬 Design source:

`timescale 1ns / 1ps


module inpu_4_AOI (
    /* Input the var */
    input a, b, c, d,
    /* Output the var */
    output e, f, g
);

/* AOI */
assign e = a & b;
assign f = e & c;
assign g = ~(e | f);

endmodule

💬 Testbench:

`timescale 1ns / 1ps

module inpu_4_AOI_tb;
// input
reg aa, bb, cc, dd;
// output
wire e, f, g;

inpu_4_AOI u_inpu_4_AOI (
    .a(aa),
    .b(bb),
    .c(cc),
    .d(dd),
    
    .e(e),
    .f(f),
    .g(g)
    );

initial aa = 1'b0;
initial bb = 1'b0;
initial cc = 1'b0;
initial dd = 1'b0;

always aa = #100 ~aa;
always bb = #200 ~bb;
always cc = #400 ~cc;
always dd = #800 ~dd;

initial begin
    #1600
    $finish;
end

endmodule

🚩 运行结果如下:

📌 [ 笔者 ]   王亦优
📃 [ 更新 ]   2022.9.20
❌ [ 勘误 ]   /* 暂无 */
📜 [ 声明 ]   由于作者水平有限,本文有错误和不准确之处在所难免,
              本人也很想知道这些错误,恳望读者批评指正!

📜 参考资料 

Introduction to Logic and Computer Design, Alan Marcovitz, McGrawHill, 2008

Microsoft. MSDN(Microsoft Developer Network)[EB/OL]. []. .

百度百科[EB/OL]. []. https://baike.baidu.com/.

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

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

相关文章

C++ 排序大合集

目录 一、了解排序 1、内部 2、外部 二、排序的稳定性 三、插入排序 1、算法和操作 2、代码 四、选择排序 1、算法和操作 2、代码 五、冒泡排序 1、算法和操作 2、代码 六、堆排序 1、优先队列 2、排序代码 七、归并排序 1、定义 2、基本算法 (1)、分离 …

宝塔Linux面板安装MySQL数据库,并且开启远程链接

1.宝塔面板【软件商店】->【应用搜索】,搜索MySQL,然后点击安装想要的版本,我这边是安装的5.6版 2. 安装完后重置数据库管理员密码 3.Navicat Premium 15连接数据库 4.外网navicat工具无法连接数据库的处理办法 4.1输入 mysql -u root -p 后回车&a…

零基础入门反序列化漏洞

目录 前提知识 漏洞产生原理 常见的函数 序列化 反序列化 __sleep函数 私有和保护 __wakeup函数 反序列化漏洞举例 构造XSS漏洞 反序列化免杀后门 POP CHAIN(POP链) 前提知识 漏洞产生原理 serialize() 和 unserialize() 在 PHP内部实现上是没有漏洞的&#xf…

Cadence PCB仿真使用Allegro PCB SI配置电路板层叠结构的方法图文教程

⏪《上一篇》   🏡《总目录》   ⏩《下一篇》 目录 1,概述2,配置方法3,总结1,概述 本文详细介绍使用Allegro PCB SI软件配置电路板层叠结构的方法。 2,配置方法 第1步:打开待仿真的PCB文件,并确认软件为Allegro PCB SI 如果,打开软件不是Allegro PCB SI则可这样…

解决No module named tkinter

原因 今天准备使用tutle画个图,导入turtle后运行发现提示没有tkinter这个包,于是尝试pip install tkinter安装,结果当然是失败: 后面一番搜索之后发现tinter是python3自带的包,不能用pip安装,我这里安装的…

JS的六种继承方式

继承 什么是继承? JS里的继承就是子类继承父类的属性和方法 目的可以让子类的实例能够使用父类的属性和方法 抽象的表达就是:一个人有车,有房,那么他的儿子也可以去使用他的车子,住他的房子。 方法一:…

Seata流程源码梳理上篇-TM、RM处理

这一篇我们主要来分析下Seata的AT模式的流程处理。一、流程案例 1、案例源码 ​ 我们本地流程梳理用的是基于spring-cloud框架,注册中心是eurak,服务间调用的是feign,源码下载的是官网的(当然你如果对dubbo更熟悉,也…

CSDN博客之星年度评选活动 - 2022

文章目录一、2022年CSDN博客之星评选活动报名二、2022年CSDN博客之星评选活动流程线上评分流程争议(官方最后证实公布后会更新)三、2022年CSDN博客之星评选规则四、2022年CSDN博客之星评分规则五、2022年CSDN博客之星活动奖品「博客之星」奖品「博客新星…

CInternetSession OpenURL没反应,不能捕获异常

本文迁移自本人网易博客,写于2013年10月22日CString sFileName;CInternetSession iSession;BOOL bRet FALSE;CStdioFile* pFileDown NULL;try{pFileDown iSession.OpenURL(szURL, 1, INTERNET_FLAG_TRANSFER_BINARY|INTERNET_FLAG_DONT_CACHE);}catch(...){CStri…

2023/1/8 Vue学习笔记-4-脚手架及相关属性配置

1 创建脚手架 (1)CLI就是 command line interface 的缩写。Vue CLI官网:Vue CLI (2)安装过程: (PS: 提前安装过node.js了,没有安装的可以打开这个:Download …

什么是布隆过滤器?——超详细解析【建议收藏】

目录 1、什么是布隆过滤器? 2、实现原理 2.1、回顾哈希函数 2.1.1、哈希函数概念 2.1.2、散列函数的基本特性: 2.2、布隆过滤器数据结构 3、特点 3.1、支持删除吗? 3.2、优点 3.3、缺点 3.4、误判率 4、如何选择哈希函数个数和布…

3 机器学习之聚类

学习笔记自,慕课网 《Python3 入门人工智能》 https://coding.imooc.com/lesson/418.html#mid32716 分类问题 1. 无监督学习 机器学习的一种方法,没有给定事先标记过的训练示例,自动对输入的数据进行分类或分群 优点: 1&#xf…

今年十八,喜欢CTF-杂项

目录 前言 菜狗杯杂项签到 我吐了你随意 损坏的压缩包 misc4 misc5 前言 🍀作者简介:被吉师散养、喜欢前端、学过后端、练过CTF、玩过DOS、不喜欢java的不知名学生。 🍁个人主页:被吉师散养的职业混子 🫒每日emo&am…

Rad Studio 11.2 安装 QuickBurro 7.21 中间件组件教程

背景 QuickBurro 官方网址:http://www.quickburro.org/ 系统环境:Rad Studio 11.2 安装其他的组件操作和这个一样的,同样可以参考 开始配置 先打开 Rad Studio 11,依次点击 File–Open Project… 然后找到你解压的 qbcn 目录下的…

React 环境搭建以及创建项目工程(二)

创建工程 首先创建一个工程 npx create-react-app weibo cd移动到当前创建的文件下 cd weibo 安装 React 路由 npm install react-router react-router-dom5.2.0 --save 安装 npm install 安依赖包 npm install antd --save npm install axios --save 安装less和less-…

PyCharm安装步骤

以64位的Windows10系统为例: 下载链接:Thank you for downloading PyCharm! 下载并打开安装包 在 Installation Options(安装选项)页面按下图所示勾选相应内容: 等待电脑自动安装完成 在PyCharm里编写程序 第1步&a…

【python】天平最少砝码设计

题目 有一架天平,砝码的种类和个数要你来设计。给定一个整数n,则待称重的物品的重量可能是 [1,n] 之间的整数,砝码可以放在左盘也可以放在右盘,要能称出所有 [1,n] 重量的物品,请问如何设计砝码的种类和个数&#xff…

Unreal UFUNCTION函数宏标记

BlueprintCallable,使C中的函数在蓝图中能被调用,新建C类CustomActor继承AActor,并分别声明public、protected、private方法:拖拽一个CustomActor到Map中,打开关卡蓝图,可以到无法在蓝图中调出C中的方法:我们为这三个方法添加BlueprintCallable标记:然后在蓝图中调用:可以发现,…

驱动程序开发:多点电容触摸屏

驱动程序开发:多点电容触摸屏一、编写驱动前的知识准备1、CST340触摸屏芯片寄存器2、CST340触摸屏的硬件原理图3、电容触摸屏驱动是由几种linux驱动框架组成的4、linux多点电容触摸的(Multi-touch,简称 MT)协议二、驱动程序的编写1、修改设备树2、驱动程…

Spring AOP【AOP的基本实现与动态代理JDK Proxy 和 CGLIB区别】

Spring AOP【AOP的基本实现与动态代理JDK Proxy 和 CGLIB区别】🍎一. Spring AOP🍒1.1 什么是Spring AOP🍒1.2 Spring AOP的作用🍒1.3 AOP的组成🍉1.3.1 切面(Aspect)🍉1.3.2 连接点…