【FPGA】Verilog 实践:狄摩根定律 | 布尔方程 | 1bit 比较器

news2024/11/17 10:52:00

 写在前面:为了解狄摩根定理和布尔函数的行为,我们使用 Verilog 实现狄摩根定律和布尔函数的行为。生成输入信号后,验证通过仿真实现的结果。


Ⅰ.  前置知识

0x00 离散结构:否定量词的狄摩根定律

否定量词的狄摩根定律是:

📚 由表中推理可知:

¬\forall {\color{Red} (}xP(x){\color{Red} )} \equiv \exists x ¬P(x) 

¬ \exists{\color{Red} (}xP(x){\color{Red} )}\equiv \forall x ¬P(x) 

可以将 ¬ 想象成一只青蛙,而这就是个青蛙跳,每跳一级任意变存在,存在变任意。

0x01 狄摩根第一第二定律

狄摩根定律将 AND 和 OR  运算互换,取各变量的否定。

狄摩根第一定律:

\overline{A+B}=\overline{A}\cdot \overline{B}  

狄摩根第二定律:

\overline{A\cdot B}=\overline{A}+\overline{B}   

  • 第一定律:A+B 的否定取等于 A 的否定乘以 B 的否定。
  • 第二定律:A\cdot B 的否定取等于 A 的否定和 B 的否定之和。

\overline{A+B}=\overline{A}\cdot \overline{B}

\overline{A\cdot B}=\overline{A}+\overline{B }

\overline{\overline{A}+\overline{B}}=A\cdot B

\overline{\overline{A}\cdot \overline{B}}=A+B

0x01  多级/多输入布尔函数

0x02  数电:布尔方程式

  • 积之合 (Sum of product) ,简写为 SOP,用符号 \sum  表示。
  • 析取范式 (disjunctive normal form) ,简写为 DNF,用符号  \prod 表示。

f = x_1x_2' + x_2 'x_3 + x_1x_3'

  • 和之积 (Product of sum) ,简写为 POS,用符号 \sum 表示。
  • 合取范式 (conjunctive normal form) ,简写为 CNF,用符号  \prod 表示。

f = (x_1+ x_2 ')(x_2 + x_3 )(x_3 + x_1)

  • 积之合的典范:极小项之和 (Canonical sum of product : sum of minterms) :

               

  • 合之积的典范:极大项之和 (Canonical product of sum : product of maxterms)

Ⅱ.  练习(Assignment)

0x00  布尔方程(1)

比较 AB 的 Schematic ,完成 Verilog 编码,通过仿真比较输出结果。

💬 Design source(A):

`timescale 1ns / 1ps

module Boolean_Function_1_a (
    input a, b, c,
    output d
    );
    
    assign d = (~a | ~b) & ~c;
    
endmodule

💬 Testbench(A):

`timescale 1ns / 1ps

module Boolean_Function_1_a_tb;
reg aa, bb, cc;  
wire d;
Boolean_Function_1_a u_Boolean_Function_1_a (
    .a(aa),
    .b(bb),
    .c(cc),
    .d(d)
    );

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

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

initial begin
    #1000
    $finish;
end

endmodule

🚩 运行结果如下:

💬 Design source(B):

`timescale 1ns / 1ps

module Boolean_Function_1_b(
    input a, b, c,
    output d
    );

    assign d = ~((a & b) | c);
    
endmodule

💬 Testbench(B):

`timescale 1ns / 1ps

module Boolean_Function_1_b_tb;
reg aa, bb, cc;
wire d;

Boolean_Function_1_b u_Boolean_Function_1_b(
    .a(aa),
    .b(bb),
    .c(cc),
    .d(d)
    );
    
initial aa = 1'b0;
initial bb = 1'b0;
initial cc = 1'b0;

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

initial begin
    #1000
    $finish;
end

endmodule

🚩 运行结果如下:

0x02 布尔方程(2)

比较 AB 的 Schematic ,完成 Verilog 编码,通过仿真比较输出结果。

💬 Design source(A):

`timescale 1ns / 1ps

module Boolean_Function_2_a (
    input a, b, c,
    output d
    );
    assign d = (~a & ~b) | ~c;
    
endmodule

💬 Testbench(A):

`timescale 1ns / 1ps

module One_Bit_tb;
reg aa, bb;
wire c, d, e, f;

One_Bit u_One_Bit (
    .a(aa),
    .b(bb),
    .c(c),
    .d(d),
    .e(e),
    .f(f)
    );

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

always aa = #100 ~aa;
always bb = #200 ~bb;

initial begin
    #2000
    $finish;
end

endmodule

🚩 运行结果如下:

💬 Design source(B):

`timescale 1ns / 1ps

module Boolean_Function_2_b (
    input a, b, c,
    output d
    );
    assign d = ~( (a | b) & c );

endmodule

💬 Testbench(B):

`timescale 1ns / 1ps

module Boolean_Function_2_b_tb;
reg aa, bb, cc;
wire d;

Boolean_Function_2_b u_Boolean_Function_2_b(
    .a(aa),
    .b(bb),
    .c(cc),
    .d(d)
    );
    
initial aa = 1'b0;
initial bb = 1'b0;
initial cc = 1'b0;
    
always aa = #100 ~aa;
always bb = #200 ~bb;
always cc = #400 ~cc;
    
initial begin
    #1000
    $finish;
end

endmodule

🚩 运行结果如下:

0x02 1bit 比较器

1bit 比较器的 Schematic ,完成 Verilog 编码,通过仿真比较输出结果。

💬 Design source:

`timescale 1ns / 1ps

module One_Bit (
    input a, b,
    output c, d, e, f
    );
    
    assign c = ( a == b );
    assign d = ( a != b );
    assign e = ( a > b );
    assign f = ( a < b );
    
endmodule

💬 Testbench:

`timescale 1ns / 1ps

module One_Bit_tb;
reg aa, bb;
wire c, d, e, f;

One_Bit u_One_Bit (
    .a(aa),
    .b(bb),
    .c(c),
    .d(d),
    .e(e),
    .f(f)
    );

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

always aa = #100 ~aa;
always bb = #200 ~bb;

initial begin
    #2000
    $finish;
end

endmodule

🚩 运行结果如下:

 

📌 [ 笔者 ]   王亦优
📃 [ 更新 ]   2023.1.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/174569.html

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

相关文章

基于自适应降噪的深度神经网络对抗图像检测【论文阅读】

近年来&#xff0c;许多研究表明&#xff0c;深度神经网络(DNN)分类器可能会被对抗性示例所欺骗&#xff0c;这种对抗性示例是通过对原始样本引入一些扰动来设计的。据此&#xff0c;提出了一些强大的防御技术。然而&#xff0c;现有的防御技术往往需要修改目标模型或依赖于攻击…

针对容器场景的多功能渗透工具

介绍 CDK是一款为容器环境定制的渗透测试工具&#xff0c;在已攻陷的容器内部提供零依赖的常用命令及PoC/EXP。集成Docker/K8s场景特有的 逃逸、横向移动、持久化利用方式&#xff0c;插件化管理。 下载/植入 将可执行文件投递到已攻入的容器内部开始使用 https://github.c…

浏览器打不开某些网站是什么原因导致,试试用这些方法来解决

不少小伙伴使用一些浏览器浏览网页的时候&#xff0c;发现打不开某些网站&#xff0c;这是什么原因导致的呢?本文讲汇总几个常见的原因&#xff0c;我们可以通过以下几个原因排查&#xff0c;并且使用下文的解决方法可以试试能否打开网站。打不开网站的原因1、浏览器限制如果用…

SpringMVC工作流程

SpringMVC工作流程 1. SpingMVC的常用组件 1&#xff09;DispatcherServlet 是一种前端控制器&#xff0c;由框架提供。作用&#xff1a;统一处理请求和响应。除此之外还是整个流程控制的中心&#xff0c;由 DispatcherServlet 来调用其他组件&#xff0c;处理用户的请求 2&am…

在甲骨文云容器实例(Container Instances)上部署Oracle Linux 8 Desktop

甲骨文云推出了容器实例&#xff0c;这是一项无服务器计算服务&#xff0c;可以即时运行容器&#xff0c;而无需管理任何服务器。 今天我们尝试一下通过容器实例部署Oracle Linux 8 Desktop。 创建容器实例 在甲骨文容器实例页面&#xff0c;单击"创建容器实例"&am…

【甄选靶场】Vulnhub百个项目渗透——项目五十六:sp-jerome(squid代理,计划任务)

Vulnhub百个项目渗透 Vulnhub百个项目渗透——项目五十六&#xff1a;sp-jerome&#xff08;文件上传&#xff0c;缓冲区溢出&#xff09; &#x1f525;系列专栏&#xff1a;Vulnhub百个项目渗透 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4…

微信公众号主体已注销 如何办理账号迁移和公证书?

公众号主体公司已经注销&#xff0c;公众号也可以办理迁移的。而且需要尽快迁移&#xff0c;如果被微信系统检测到主体注销&#xff0c;而公众号还在经营就会要求限期迁移&#xff0c;否则公众号将被冻结。 下面我们就来说一下&#xff0c;主体已注销如何办理公众号迁移。 注&a…

Ubuntu20.04+GLFW搭建OpenGL开发环境

环境 系统&#xff1a;Ubuntu 20.04 桌面环境&#xff1a;X11 OpenGL版本: 3.0 桌面环境怎么看呢&#xff1f;可以在终端输入echo $XDG_SESSION_TYPE 即可&#xff0c;或者查看桌面右上角的Settings->About&#xff0c;查看Windowing System 查看OpenGL版本 使用glxinfo命…

【数据结构】深度剖析栈的各接口功能实现

目录 &#x1f34a;前言&#x1f34a;&#xff1a; &#x1f95d;一.栈的概述&#x1f95d;&#xff1a; 1.栈的概念&#xff1a; 2.栈的结构&#xff1a; &#x1f349; 二、栈的各接口功能实现&#x1f349;&#xff1a; 1.栈的初始化&#xff1a; 2.压栈&#xff1a;…

十六进制转八进制(蓝桥杯基础练习C/C++)

我首先想到的就是十六进制转十进制&#xff0c;十进制转八进制&#xff0c;毕竟这样的方法是最常见的&#xff0c;但始终出现报错。 我想可能是int能储存的数范围太小了&#xff0c;就尝试用long long存储&#xff0c;结果还是报错。 #include <bits/stdc.h> using nam…

C++语法复习笔记-1. c++指针

文章目录1. 计算机内存1. 储存层次2. 内存单元与地址3. 指针定义2. 左值与右值1. 数组与指针1. 概念3. C中的原始指针1. 数组指针与指针数组2. const pointer 与 pointer to const3. 指向指针的指针4.关于野指针4.1 指向指针的指针4.2 NULL指针4.3 野指针5. 指针的基本运算5.1 …

Linux基础 IO

目录 一、文件操作 1.1 C语言文件操作 1.2 文件 系统调用接口 1.2.1 open/close函数 1.2.2 write/read函数 二、进程与文件 2.1 0&1&2 文件描述符 2.2 C语言FILE 2.3 (OS管理&进程找到) 被打开文件方法 2.3.1 struct file 描述文件属性(OS管理文件) 2.3…

线性时变系统的PID控制-2

在线性时变系统的PID控制-1的基础上采用S函数进行Simulink仿真。被控对象的描述方式可变换为&#xff1a;在S函数中&#xff0c;采用初始化、微分函数和输出函数&#xff0c;即mdllnitializeSizes函数、mdIDerivatives函数和mdlOutputs函数。在初始化中采用sizes结构&#xff0…

力扣sql简单篇练习(三)

力扣sql简单篇练习(三) 1 查找重复的电子邮箱 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 SELECT Email FROM Person GROUP BY Email HAVING count(id)>21.3 运行截图 2 每个产品在不同商店的价格 2.1 题目内容 2.1.1 基本题目信息 2.1.2 示…

[经典的图像warping方法] Thin Plate Spline: TPS理论和代码详解

0. 前言 2022年没有新写什么博客, 主要精力都在搞论文. 今年开始恢复! 本文的目标是详细分析一个经典的基于landmark(文章后面有时也称之为控制点control point)的图像warping(扭曲/变形)算法: Thin Plate Spine (TPS). TPS被广泛的应用于各类的任务中, 尤其是生物形态中应用…

动态内存管理(C语言)

目录 为什么要存在动态内存分配 动态内存函数的介绍 malloc函数 free函数 calloc函数 realloc函数 常见的动态内存错误 对NULL指针解引用错误 对动态开辟的空间越界访问 对非动态开辟内存使用free释放 使用free释放一块动态开辟内存的一部分 对同一块动态内存多次释放 动态开辟…

客快物流大数据项目(一百零五):启动ElasticSearch

文章目录 启动ElasticSearch 一、启动ES服务端 二、​​​​​​​启动Kibana 启动ElasticSearch

【NI Multisim 14.0虚拟仪器设计——放置虚拟仪器仪表(频率计数器)】

目录 序言 &#x1f3ee;放置虚拟仪器仪表&#x1f3ee; &#x1f9e7;频率计数器&#x1f9e7; &#x1f973;&#x1f973;&#xff08;1&#xff09;“测量”选项组:参数测量区。 &#x1f973;&#x1f973;&#xff08;2&#xff09;“耦合”选项组:用于选择电流耦合方…

CSDN 的故障处理流程,实例分享

CSDN 的研发团队每隔一段时间会和大家分享团队的进展&#xff0c;请看&#xff1a; 2021 年年底的汇报 2022 年上半年的汇报 2022 年下半年的汇报 从上面的报告中大家可以看到&#xff0c;我们在取得进展的同时&#xff0c; 也碰到了很多问题&#xff0c;也有一些困惑。 我写了…

「链表」简析

前言 前言&#xff1a;研究一个数据结构的时候&#xff0c;首先讲的是增删改查。 文章目录前言一、链表简介1. 含义2. 节点组成3. 存储方式1&#xff09;数据在内存中的存储方式2&#xff09;单链表在内存中的存储方式3&#xff09;双链表在内存中的存储方式4&#xff09;循环链…