当前位置: 首页 > news >正文

数字逻辑与FPGA实现基础

数字逻辑与FPGA实现基础

    • 一. 复习组合逻辑电路的设计、化简和多种方式表达。按照课件内容完整推导电热水器水位报警系统。
      • 1.组合逻辑电路的设计、化简和多种方式表达
      • 2.例1.6.1 电热水器水位报警系统
      • 3. 多种方式表达
      • 总结
    • 二. 复习大二上学期的“数字逻辑与组成原理”课程作业“Verilog编程基础练习”
      • 1、对比Logsim设计的3-8译码器电路与Verilog编程实现的3-8译码器 RTL电路的区别。
      • 2、用Verilog设计实现一个4位全加器。
    • 三. 在DE2-115开发板上
      • 1、完成4位全加器系统的设计、下载和功能演示。
      • 2、完成3-8译码器的设计、下载和功能演示(利用板上的8段数码管)

一. 复习组合逻辑电路的设计、化简和多种方式表达。按照课件内容完整推导电热水器水位报警系统。

例1.6.1如图所示:
1.6.1

1.组合逻辑电路的设计、化简和多种方式表达

1.组合逻辑电路的设计步骤

  1. 逻辑抽象

    • 确定输入、输出变量:根据实际问题确定输入和输出变量,并定义其逻辑状态。

    • 定义逻辑状态:确定每个变量的逻辑状态(通常用0和1表示)。

  2. 列出真值表

    • 根据逻辑描述:根据问题的逻辑描述,列出所有可能的输入组合及其对应的输出。
  3. 写出逻辑表达式

    • 从真值表中提取:根据真值表,写出每个输出的逻辑表达式。

    • 简化逻辑表达式:使用代数法或卡诺图法化简逻辑表达式。

  4. 画出逻辑图

    • 根据逻辑表达式:根据化简后的逻辑表达式,画出对应的逻辑电路图。

2.例1.6.1 电热水器水位报警系统

  1. 逻辑抽象
  • 输入变量
    • A:水位检测元件A的输出(逻辑1表示水位低于A,逻辑0表示水位高于A)。
    • B:水位检测元件B的输出(逻辑1表示水位低于B,逻辑0表示水位高于B)。
    • C:水位检测元件C的输出(逻辑1表示水位低于C,逻辑0表示水位高于C)。
  • 输出变量
    • G:绿灯(逻辑1表示灯亮,逻辑0表示灯灭)。
    • Y:黄灯(逻辑1表示灯亮,逻辑0表示灯灭)。
    • R:红灯(逻辑1表示灯亮,逻辑0表示灯灭)。
  1. 列出真值表
    根据题目要求,列出真值表如下:
    真值表
  2. 写出逻辑表达式
    根据真值表,写出每个输出的逻辑表达式:
  • 绿灯 G:
    green

  • 黄灯 Y:
    在这里插入图片描述

  • 红灯 R:
    red

  1. 化简逻辑表达式
    使用卡诺图法化简逻辑表达式:
  • 绿灯 G:
    green

  • 黄灯 Y:
    yellow

  • 红灯 R:
    red

  1. 画出逻辑图
    根据化简后的逻辑表达式,画出逻辑电路图:
  • 绿灯 G:
    • 使用与门和非门实现。
  • 黄灯 Y:
    • 使用与门、或门和非门实现。
  • 红灯 R:
    • 使用与门实现。

3. 多种方式表达

  1. 逻辑代数表达式:
    在这里插入图片描述

  2. 真值表:如上所示。

  3. 逻辑图:如上所示。

  4. 卡诺图:用于化简逻辑表达式。

  5. 硬件描述语言(HDL):使用Verilog HDL描述逻辑电路。

总结

通过逻辑抽象、真值表、逻辑表达式、化简和逻辑图的步骤,我们完成了电热水器水位报警系统的设计。最终的逻辑表达式和逻辑图可以用于实际的电路设计和实现。
(以上内容由AI生成)

二. 复习大二上学期的“数字逻辑与组成原理”课程作业“Verilog编程基础练习”

1、对比Logsim设计的3-8译码器电路与Verilog编程实现的3-8译码器 RTL电路的区别。

设计过程

  • Logsim设计:Logsim 是一款图形化的数字电路仿真工具。在 Logsim 中设计 3-8译码器,需要手动摆放与门、或门、非门等逻辑门元件,并通过连线将它们连接起来以实现译码逻辑。设计者需要对每个逻辑门的输入输出关系有清晰的理解,并且要逐一完成电路的构建,设计过程比较直观,但相对繁琐,尤其是对于大规模电路设计。
  • Verilog设计:Verilog 是一种硬件描述语言(HDL),用户通过编写代码来定义电路的行为和结构。在 Verilog 中设计3-8 译码器,需要使用组合逻辑语句(如 case、assign 等)描述译码器的逻辑功能。设计者可以利用 Verilog的模块化、层次化设计方法,快速搭建电路模型。相比于 Logsim,Verilog 的设计过程更加抽象,但效率更高,尤其适合大规模电路设计。

电路表示

  • Logsim设计:在 Logsim 中,3-8译码器的电路是通过图形化界面展示的,电路中的每个逻辑门和连线都以直观的方式呈现。例如,译码器的输入输出信号、逻辑门之间的连接关系等都能通过图形界面清晰地观察到。这种表示方式便于初学者理解电路的基本结构和工作原理。
  • Verilog设计:Verilog 设计的 3-8 译码器以文本形式描述电路的逻辑关系。例如,使用 case语句可以根据输入选择对应的输出,代码的结构和逻辑关系清晰明了。然而,与图形化表示相比,Verilog 的代码表示可能不够直观,需要用户具备一定的代码阅读和理解能力。

电路实现

  • Logsim设计:Logsim生成的电路是软件仿真环境中的虚拟电路,主要用于电路的可视化设计和功能验证。虽然它可以帮助用户理解电路的工作原理,但无法直接生成实际的硬件电路,也不能用于实际的硬件实现。
  • Verilog设计:Verilog 设计的电路可以通过综合工具(如 Design Compiler等)转换为硬件描述语言的网表文件。这些网表文件可以被进一步用于 FPGA、ASIC等硬件平台的布局布线,最终生成实际的物理电路,完成电路的物理实现。

灵活性和可扩展性

  • Logsim设计:在 Logsim 中,修改电路的逻辑功能需要重新调整逻辑门的连接和配置,灵活性相对较差。例如,如果想要将译码器扩展为4-16 译码器,需要手动添加更多的逻辑门和连线,工作量较大。
  • Verilog设计:Verilog设计具有高度的灵活性和可扩展性。通过参数化设计和模块化设计,可以轻松地对译码器进行功能扩展。例如,通过修改参数或添加模块,可以快速将3-8 译码器扩展为更大的译码器,如 4-16 译码器或更高位数的译码器。

调试和验证

  • Logsim设计:Logsim提供了直观的调试工具,如探针、示波器等,可以方便地观察电路中各个节点的信号状态和波形。此外,还可以通过仿真运行电路,观察译码器的输出是否符合预期,验证其功能的正确性。
  • Verilog设计:Verilog 设计通常需要借助专业的仿真工具(如 ModelSim等)进行调试和验证。验证过程包括编写测试平台(Testbench),输入测试向量,观察输出结果,并通过分析仿真结果来验证电路的功能是否正确。Verilog的调试和验证过程相对复杂,但可以实现更全面、更系统的验证。

2、用Verilog设计实现一个4位全加器。

4位全加器是数字电路中的一个基本模块,用于对两个4位二进制数进行加法运算。以下是用Verilog实现的4位全加器的设计代码:

module FullAdder_4bit(
    input [3:0] a,     // 输入A,4位
    input [3:0] b,     // 输入B,4位
    input cin,         // 输入进位
    output [3:0] sum,  // 输出和,4位
    output cout        // 输出进位
);
    
    // 内部信号
    wire [3:0] c_out;  // 每个位的进位

    // 4位全加器的实现
    assign {cout, sum} = a + b + cin;

endmodule

代码说明

  1. 模块端口定义
    • a 和 b 是两个4位的输入信号。
    • cin 是初始的进位输入(第1位加法的进位输入)。
    • sum 是4位的输出和。
    • cout 是最高位的进位输出。
  2. 内部信号
    • c_out 是一个4位的中间进位信号。
  3. 加法器实现
    • 使用 Verilog 的位拼接操作符 { },将最高位的进位 cout 和4位和 sum 合并为一个5位的输出。
    • 使用加法运算符 +,对 a、b 和 cin 进行加法运算,并自动处理进位逻辑。

使用方法

  1. 将上述代码保存为 FullAdder_4bit.v。
  2. 使用 Verilog 仿真工具(如 ModelSim)或 FPGA 开发工具(如 Quartus Prime)对代码进行编译和仿真。
  3. 通过测试平台(Testbench)输入不同的 a、b 和 cin 值,观察 sum 和 cout 的输出,验证4位全加器的功能。

示例输入输出
假设输入:

  • a = 4’b0011(即十进制3)
  • b = 4’b0010(即十进制2)
  • cin = 1’b0

输出:

  • sum = 4’b0101(即十进制5)
  • cout = 1’b0

该设计的时间复杂度是O(1),因为所有的位运算都是并行处理的。 空间复杂度也是O(1),因为只涉及固定数量的寄存器和逻辑门。(以上内容由AI生成)

三. 在DE2-115开发板上

1、完成4位全加器系统的设计、下载和功能演示。

  1. FPGA上1位全加器的实现
    首先,搭建一个半加器:需要1个and2,1个xor,2个输出,2个输入。(需要将其封装,以便搭建一位全加器)
    在这里插入图片描述
    RTL电路如下:
    RTLhalf

其次,搭建一位全加器:需要2个半加器,1个or2,2个输出,2个输入。
在这里插入图片描述
也可使用verilog生成一位全加器:

module verilog_full_adder(
	//输入信号,ain表示被加数,bin表示加数,cin表示低位向高位的进位
	input ain,bin,cin,
	//输出信号,cout表示向高位的进位,sum表示本位的相加和
	output reg cout,sum

);
reg s1,s2,s3;
always @(ain or bin or cin) begin
	sum=(ain^bin)^cin;//本位和输出表达式
	s1=ain&cin;
	s2=bin&cin;
	s3=ain&bin;
	cout=(s1|s2)|s3;//高位进位输出表达式
end
endmodule

生成一位全加器,RTL电路如下图所示:
在这里插入图片描述
功能仿真如下:
func
时序仿真如下:
time

最后,用4个一位全加器搭建四位全加器:需要4个一位全加器,9个输入,4个输出。
4bitfulladder
RTL电路如下:
four
功能仿真如下:
功能
时序仿真如下:
时序

也可用verilog生成1个四位全加器:

module FullAdder_4bit(
    input [3:0] a,     // 输入A,4位
    input [3:0] b,     // 输入B,4位
    input cin,         // 输入进位
    output [3:0] sum,  // 输出和,4位
    output cout        // 输出进位
);

    // 内部信号:每个位的进位输出
    wire [3:0] c_out;

    // 实例化4个一位全加器模块
    FullAdder fa0 (a[0], b[0], cin, sum[0], c_out[0]);
    FullAdder fa1 (a[1], b[1], c_out[0], sum[1], c_out[1]);
    FullAdder fa2 (a[2], b[2], c_out[1], sum[2], c_out[2]);
    FullAdder fa3 (a[3], b[3], c_out[2], sum[3], c_out[3]);

    // 最终进位输出为第4位的进位输出
    assign cout = c_out[3];

endmodule

// 一位全加器模块
module FullAdder(
    input a,        // 输入A,1位
    input b,        // 输入B,1位
    input cin,      // 输入进位
    output sum,     // 输出和,1位
    output cout     // 输出进位
);

    // 逻辑表达式
    assign sum = a ^ b ^ cin;         // 和
    assign cout = (a & b) | (b & cin) | (cin & a); // 进位

endmodule

生成四位全加器,如下图所示:
在这里插入图片描述
功能仿真如下:
功能2
时序仿真如下:
时序2

2、完成3-8译码器的设计、下载和功能演示(利用板上的8段数码管)

首先,可以用搭建电路图的方式来完成3-8译码器的设计步骤:
在这里插入图片描述

RTL电路如下:
在这里插入图片描述

功能仿真如下:
在这里插入图片描述
时序仿真如下:
在这里插入图片描述

也可用verilog语言生成3-8译码器

module Decoder3To8(
    input [2:0] address,   // 3位输入地址
    input enable,          // 使能信号
    output reg [7:0] data  // 8位输出数据
);

    // 使用组合逻辑语句实现译码
    always @(*) begin
        // 初始化输出为低电平
        data = 8'b00000000;
        
        // 如果译码器被使能
        if (enable) begin
            case (address)
                3'b000: data[0] = 1'b1;  // 地址0选择data[0]
                3'b001: data[1] = 1'b1;  // 地址1选择data[1]
                3'b010: data[2] = 1'b1;  // 地址2选择data[2]
                3'b011: data[3] = 1'b1;  // 地址3选择data[3]
                3'b100: data[4] = 1'b1;  // 地址4选择data[4]
                3'b101: data[5] = 1'b1;  // 地址5选择data[5]
                3'b110: data[6] = 1'b1;  // 地址6选择data[6]
                3'b111: data[7] = 1'b1;  // 地址7选择data[7]
                default: data = 8'b00000000;  // 默认情况下输出全低
            endcase
        end
    end

endmodule

生成3-8译码器,如下图所示:
在这里插入图片描述
功能仿真如下:
在这里插入图片描述
时序仿真如下:
在这里插入图片描述

相关文章:

  • k-Shape:高效准确的聚类方法
  • VPC2-多域攻击-tomcat渗透-通达oa-域控提权-密码喷射-委派攻击-数据库提权
  • 人工智能 模型中D*算法的逻辑
  • 云存储的安全性之代理IP如何确保文件不被未授权访问
  • 杨校老师课堂之零基础入门C++备战信息学奥赛-基础篇
  • C++入门——命名空间
  • django中视图作用和视图功能 以及用法
  • mysql新手常见问题解决方法总结
  • 【OMCI实践】wireshark解析脚本omci.lua文件(独家分享)
  • Unity Shader 学习15:可交互式雪地流程
  • vulnhub靶场之【digitalworld.local系列】的torment靶机
  • HarmonyOS:如何将图片转为PixelMap并进行图片缓存策略
  • linux0.11内核源码修仙传第四章——操作系统的框架代码
  • 删除已加入 .gitignore却仍被git追踪的文件
  • 突破极限:高性能ROCK 220A-M 工业级无人机电调深度测评 —— 无人机动力系统的核心守护者
  • 审批流AntV框架蚂蚁数据可视化X6饼图(附注释)
  • Java 8 Stream API 详解
  • MySQL的安装和配置
  • 【Vue3 Element UI - Plus + Tyscript 实现Tags标签输入及回显】
  • 阿里云QwQ-32B模型发布:AI领域的新突破
  • 品牌创意网站建设/保健品的营销及推广方案
  • 如何建设一个普通网页网站/网络营销和推广做什么
  • 网络代理什么平台赚钱啊/seo技术交流论坛
  • 爱做的小说网站/新冠疫情最新情况
  • 建设厅施工员证查询网站/优化防控措施
  • 公司网站 设计/打开官方网站