FPGA 实验报告:四位全加器与三八译码器仿真实现
目录
安装Quartus软件
四位全加器
全加器、半加器
半加器:
全加器:
四位全加器电路图
创建项目
半加器
全加器
四位全加器
代码实现
半加器
全加器
四位全加器
三八译码器
创建项目
代码展示
modelsim仿真波形图
四位全加器
三八译码器
总结与展望
安装Quartus软件
本次实验首先进行Quartus软件的安装,版本选择18.1.0.625。安装过程较为常规,依次进行安装选项选择、许可协议接受、安装路径选择(如E盘)等步骤,等待安装进度条完成后,根据驱动程序安装向导提示,选择下一页及完成,即可完成软件的正常安装并投入使用。以下是详细安装流程:
- 打开安装软件
这里以18.1.0.625版本为例
打开安装程序,进行安装选择,选择next,进行下一步;
选择”I accept the agreement”再进行下一步;
选择想要保存的位置,例如我所选的E盘;
默认勾选,点击下一步;
继续点击next;
随后等待进度条走完即可;
在根据驱动程序安装向导,选择下一页,然后选择完成,完成安装;
打开Quartus 正常使用。
四位全加器
全加器、半加器
半加器:
定义:半加器是指只考虑两个一位二进制数相加,而不考虑来自低位的进位的加法器。
输入输出关系:
和(Sum):当两个输入数A和B不同时,和为1;当A和B相同时,和为0。其逻辑表达式为Sum = A ⊕ B(⊕表示异或运算)。
进位(Carry):当A和B都为1时,产生进位,进位输出为1,否则为0。其逻辑表达式为Carry = A & B(&表示与运算)。
电路结构:
真值表:
全加器:
定义:全加器是指不仅考虑两个一位二进制数相加,还考虑来自低位的进位的加法器。
输入输出关系:
和(Sum):当A、B和来自低位的进位Cin中1的个数为奇数时,和为1;否则为0。其逻辑表达式为Sum = A ⊕ B ⊕ Cin。
进位(Carry):当A、B和Cin中任意两个或三个都为1时,产生进位。其逻辑表达式为Carry = (A & B) | (B & Cin) | (A & Cin)(|表示或运算)。
电路结构:
真值表:
半加器和全加器就像是两个不同级别的助手,半加器只能处理简单的两个数相加,而全加器则能处理更复杂的带进位相加的情况。它们共同构成了数字电路中实现加法运算的基础模块,为计算机等数字设备的运算能力提供了支持。
四位全加器电路图
创建项目
在Quartus中,可通过绘制原理图或编写Verilog HDL代码实现四位全加器的设计。原理图绘制需在“Block Diagram/Schematic File”中进行,选择相应的与门、异或门等元件进行连接。代码实现则更为高效,通过定义实体和架构,利用信号连接和实例化语句实现四位全加器的功能。设计过程中,将四个全加器串联,使每个全加器的输出进位连接到下一个全加器的输入进位,从而实现四位二进制数的加法运算。下面为具体实现方法:
点击软件运行,进入主界面;
点击左上角的File,选择目录下的New;
\
然后在弹出来的目录中再选择”New Quartus Prime Project”;
在下图中填写好项目名称,随后点击”Next”;
其中,顶层设计实体名称这是你的设计文件中的顶层模块的名称。这个名称必须与你的设计文件中的实体名称完全匹配,包括大小写。
然后点击”Next”,直到下图所示,然后选择标注的型号,再点击”Next”;
随后在Slmulation,选择ModeSim-Altera;(由于之前在安装的时候已经默认安装了ModeSim,所以直接下一步即可)
最后点击,Finish,创建成功。
半加器
在空白项目中,左上角选择File,点击目录下的New,然后再选择Block Diagram/Schematic File
建立好过后,选择and2、xor(即与门、异或门);
按照下图连接,就是一位半加器的原理图。
画好原理图过后,再将其保存为可调用原件。
首先点开左上角File,在根据指示进行操作;
即可保存成功。
全加器
操作同半加器,绘制原理图,然后保存;
注意:这里的half_adder为刚才我们建立并保存好的,可直接调用。
四位全加器
在元器件中搜索刚才保存的全加器full_adder,绘制四位全加器。
绘制图如下:
编译成功过后可以在TOOL目录下的Netlist Viewers的二级目录中的RTL Viewer查看电路图。
代码实现
虽然图画表达更加直观,但占用的时间较多,当涉及的内容复杂时,画图效率更是大大缩减,这个时候可以用代码实现原理图的绘制。
选择主页面左上角的File,选择目录下的New,然后在新的目录下选择Verilog HDL File;
然后根据需要生成的电路图输入代码。
半加器
library IEEE;use IEEE.STD_LOGIC_1164.ALL;-- 定义半加器实体entity half_adder isport (A : in STD_LOGIC;B : in STD_LOGIC;sum : out STD_LOGIC;cout : out STD_LOGIC);end half_adder;-- 定义半加器架构architecture Behavioral of half_adder isbeginsum <= A XOR B;cout <= A AND B;end Behavioral;
全加器
library IEEE;use IEEE.STD_LOGIC_1164.ALL;-- 定义全加器实体entity full_adder isport (A : in STD_LOGIC;B : in STD_LOGIC;Cin : in STD_LOGIC;sum : out STD_LOGIC;Cout : out STD_LOGIC);end full_adder;-- 定义全加器架构architecture Behavioral of full_adder isbeginsum <= A XOR B XOR Cin;Cout <= (A AND B) OR (Cin AND (A XOR B));end Behavioral;
四位全加器
library IEEE;use IEEE.STD_LOGIC_1164.ALL;-- 定义4位全加器实体entity four_bit_adder isport (A : in STD_LOGIC_VECTOR(3 downto 0);B : in STD_LOGIC_VECTOR(3 downto 0);Cin : in STD_LOGIC;S : out STD_LOGIC_VECTOR(3 downto 0);Cout : out STD_LOGIC);end four_bit_adder;-- 定义4位全加器架构architecture Behavioral of four_bit_adder issignal C : STD_LOGIC_VECTOR(4 downto 0);signal temp_S : STD_LOGIC_VECTOR(3 downto 0);component full_adderport (A : in STD_LOGIC;B : in STD_LOGIC;Cin : in STD_LOGIC;sum : out STD_LOGIC;Cout : out STD_LOGIC);end component;beginC(0) <= Cin;-- 实例化四个全加器G0: full_adder port map (A(0), B(0), C(0), temp_S(0), C(1));G1: full_adder port map (A(1), B(1), C(1), temp_S(1), C(2));G2: full_adder port map (A(2), B(2), C(2), temp_S(2), C(3));G3: full_adder port map (A(3), B(3), C(3), temp_S(3), C(4));S <= temp_S;Cout <= C(4);end Behavioral;
三八译码器
输入端口:
I2、I1、I0:这三个端口是3位二进制输入信号。
这三个输入信号可以表示8种不同的状态(从 000 到 111)。
输出端口:
Y7、Y6、Y5、Y4、Y3、Y2、Y1、Y0:这8个端口是8位一热码输出信号。
每个输出端口对应一个输入状态,只有一个输出端口为高电平(1),其余为低电平(0)。
工作原理:
三-八译码器根据输入的3位二进制数,选择对应的输出线,并将其置为高电平(1),而其他输出线保持低电平(0)。具体的工作原理可以参考以下真值表:
逻辑表达式:
每个输出端口的逻辑表达式可以表示为输入信号的组合。例如:
- Y0 = NOT I2 AND NOT I1 AND NOT I0
- Y1 = NOT I2 AND NOT I1 AND I0
- Y2 = NOT I2 AND I1 AND NOT I0
- Y3 = NOT I2 AND I1 AND I0
- Y4 = I2 AND NOT I1 AND NOT I0
- Y5 = I2 AND NOT I1 AND I0
- Y6 = I2 AND I1 AND NOT I0
- Y7 = I2 AND I1 AND I0
创建项目
在Quartus中创建新项目后,通过编写Verilog HDL代码实现三八译码器。使用case语句根据输入信号组合设置输出信号,代码简洁且逻辑清晰。编写完成后进行编译,确保代码无误。以下是具体实现方法:
首先再刚才新建项目的Feil,选择”New Project Wizard”,与全加器半加器的创建一样的操作;
创建好空项目过后,我们就使用代码实现三八译码器;
选择主页面左上角的File,选择目录下的New,然后在新的目录下选择Verilog HDL File;
代码展示
module three_eight_decoder(a, b, c, out);input a; // 输入端口ainput b; // 输入端口binput c; // 输入端口coutput [7:0] out; // 输出端口out,8位宽reg [7:0] out; // 声明out为寄存器类型// 或者可以直接写成:output reg [7:0] out;// always块:当a、b或c发生变化时触发always @(a, b, c) begin// case语句:根据{a, b, c}的组合值选择输出case ({a, b, c})3'b000: out = 8'b0000_0001; // 当{a, b, c}为000时,out输出0000_00013'b001: out = 8'b0000_0010; // 当{a, b, c}为001时,out输出0000_00103'b010: out = 8'b0000_0100; // 当{a, b, c}为010时,out输出0000_01003'b011: out = 8'b0000_1000; // 当{a, b, c}为011时,out输出0000_10003'b100: out = 8'b0001_0000; // 当{a, b, c}为100时,out输出0001_00003'b101: out = 8'b0010_0000; // 当{a, b, c}为101时,out输出0010_00003'b110: out = 8'b0100_0000; // 当{a, b, c}为110时,out输出0100_00003'b111: out = 8'b1000_0000; // 当{a, b, c}为111时,out输出1000_0000endcaseendendmodule
modelsim仿真波形图
同样采用“University Program VWF”创建仿真文件,配置输入输出信号后运行仿真,查看波形图以验证译码器的正确性。通过观察波形图,可确认译码器是否能准确地根据输入信号生成对应的输出信号,如有问题可及时修改代码。具体操作如下:
四位全加器
选择主页面左上角的File,选择目录下的New,然后在新的目录下选择University Program VWF
创建好过后,会自动弹出窗口,双击左侧空白处,选择提示框中的Node Finder...;
然后会弹出窗口,先点击list,会显示四位全加器的输入输出元素,再点击双又向箭头;
配置好过后点击OK,即可得到波形图:
三八译码器
同理可得到38译码器的波形图:
总结与展望
通过本次实验,掌握了Quartus软件的安装与项目创建流程,深入理解了四位全加器和三八译码器的工作原理,并成功实现了其设计与仿真。在设计过程中,体会到了原理图绘制和代码实现两种方法的特点,以及仿真测试在验证设计正确性方面的重要性。
在未来,将继续深入学习FPGA设计,探索更复杂的数字电路,如多位乘法器、移位寄存器等,并尝试将FPGA应用于实际项目中,以提升自身的实践能力和技术水平。
相关文章:

FPGA 实验报告:四位全加器与三八译码器仿真实现
目录 安装Quartus软件 四位全加器 全加器、半加器 半加器: 全加器: 四位全加器电路图 创建项目 半加器 全加器 四位全加器 代码实现 半加器 全加器 四位全加器 三八译码器 创建项目 代码展示 modelsim仿真波形图 四位全加器 三八译码…...

动态规划详解(二):从暴力递归到动态规划的完整优化之路
目录 一、什么是动态规划?—— 从人类直觉到算法思维 二、暴力递归:最直观的问题分解方式 1. 示例:斐波那契数列 2. 递归树分析(以n5为例) 3. 问题暴露 三、第一次优化:记忆化搜索(Memoiza…...

前端学习——HTML
HTML VSCode常用快捷键HTML标签文本标签列表标签表格Form表单表单元素 块元素与行内元素新增标签 VSCode常用快捷键 代码格式化:ShiftAltF 向上或向下移动一行:AltUp或AltDown 快速复制一行代码:ShiftAltUp或者ShiftAltDown 快速替换&#x…...
12.【线性代数】——图和网络
十二 图和网络(线性代数的应用) 图 g r a p h { n o d e s , e d g e s } graph\{nodes, edges\} graph{nodes,edges}1.关联矩阵2. A A A矩阵的零空间,求解 A x 0 Ax0 Ax0 电势3. A T A^T AT矩阵的零空间,电流总结电流图结论 …...
[环境搭建篇] Windows 环境下如何安装repo工具
Windows 环境下如何安装repo工具 1. 安装前置依赖2. 配置Repo引导脚本方法一:通过Gitee镜像安装(推荐)方法二:通过清华镜像安装 3. 解决依赖问题4. 初始化Repo仓库5. 常见问题解决 前言: 在Windows环境下安装Repo工具需…...
LeetCode 热题 100_字符串解码(71_394_中等_C++)(栈)
LeetCode 热题 100_字符串解码(71_394) 题目描述:输入输出样例:题解:解题思路:思路一(栈): 代码实现代码实现(栈):以思路一为例进行调…...

「DataX」数据迁移-IDEA运行DataX方法总结
背景 业务需求希望把Oracle数据库中的数据,迁移至MySql数据库中,因为需要迁移全量和增量的数据,所以希望想用数据迁移工具进行操作。 经过一些调研查询,最终打算使用DataX进行数据的迁移。 DataX简单介绍 DataX 是阿里云 DataW…...

【 <一> 炼丹初探:JavaWeb 的起源与基础】之 Servlet 过滤器:实现请求的预处理与后处理
<前文回顾> 点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、过滤器&…...
DeepSeek与浏览器自动化AI Agent构建指南
文章使用到的模型可以用硅基流动中的: 注册链接:硅基流动统一登录 邀请码:FytHp9Xa 一、技术选型阶段 1. 基础组件选择 AI模型:DeepSeek-R1开放API(对话/推理)或DeepSeek-Coder(代码生成&#…...
面试中常问的mysql数据库指令【杭州多测师_王sir】
数据库中的修改表结构、增删改查、用户权限操作DDL 》数据库定义语言 create database,create table drop tableDML 》数据库操作语言 insert into,delete from,update set,DQL 》数据库查询语言 select .... from....crea…...
深度学习驱动的智能化革命:从技术突破到行业实践
第一章 深度学习的技术演进与核心架构 1.1 从浅层网络到深度学习的范式转变 深度学习的核心在于通过多层次非线性变换自动提取数据特征,其发展历程可划分为三个阶段:符号主义时代的规则驱动(1950s-1980s)、连接主义时代的浅层网络(1990s-2000s)以及深度学习时代的端到端…...

基于编译器特性浅析C++程序性能优化
最近在恶补计算机基础知识,学到CSAPP第五章的内容,在这里总结并且展开一下C程序性能优化相关的内容。 衡量程序性能的方式 一般而言,程序的性能可以用CPE(Cycles Per Element)来衡量,其指的是处理每个元素…...

服务器上通过ollama部署deepseek
2025年1月下旬,DeepSeek的R1模型发布后的一周内就火了,性能比肩OpenAI的o1模型,且训练成本仅为560万美元,成本远低于openAI,使得英伟达股票大跌。 下面我们来看下如何个人如何部署deepseek-r1模型。 我是用的仙宫云的…...
Android Coil总结
文章目录 Android Coil总结概述添加依赖用法基本用法占位图变形自定义ImageLoader取消加载协程支持缓存清除缓存监听 简单封装 Android Coil总结 概述 Coil 是一个用于 Android 的 Kotlin 图像加载库,旨在简化图像加载和显示的过程。它基于 Kotlin 协程࿰…...

《安富莱嵌入式周报》第351期:DIY半导体制造,工业设备抗干扰提升方法,NASA软件开发规范,小型LCD在线UI编辑器,开源USB PD电源,开源锂电池管理
周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 视频版: https://www.bilibili.com/video/BV16C95YEEZs 《安富莱嵌入式周报》第351期:DIY半导体…...
Redis在人员管理系统中的应用示例
用户会话管理 场景:用户登录后存储会话信息,支持多服务器共享 实现: 用户登录成功后,生成唯一Token(如JWT),作为Redis的Key Value存储用户ID、角色、权限等信息,设置过期时间&…...
The Wedding Juicer POJ - 2227
采取从外层边界,一步一步向内部拓展的策略,具体来说,一开始将最外面一层的点加入队列,并标记这些点的坐标已经被访问 取出队列中高度最低的点,将其弹出,查看其上下左右的点,如果新点没有被访问…...

# 深入理解RNN(一):循环神经网络的核心计算机制
深入理解RNN:循环神经网络的核心计算机制 RNN示意图 引言 在自然语言处理、时间序列预测、语音识别等涉及序列数据的领域,循环神经网络(RNN)一直扮演着核心角色。尽管近年来Transformer等架构逐渐成为主流,RNN的基本原理和思想依然对于理…...

分布式锁—6.Redisson的同步器组件
大纲 1.Redisson的分布式锁简单总结 2.Redisson的Semaphore简介 3.Redisson的Semaphore源码剖析 4.Redisson的CountDownLatch简介 5.Redisson的CountDownLatch源码剖析 1.Redisson的分布式锁简单总结 (1)可重入锁RedissonLock (2)公平锁RedissonFairLock (3)联锁MultiL…...
同步 Fork 仓库的命令
同步 Fork 仓库的命令 要将您 fork 的仓库的 main 分支与原始仓库(fork 源)同步,您可以使用以下命令: 首先,确保您已经添加了原始仓库作为远程仓库(如果尚未添加): git remote add…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...

React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...

通过MicroSip配置自己的freeswitch服务器进行调试记录
之前用docker安装的freeswitch的,启动是正常的, 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...