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

FPGA 实验报告:四位全加器与三八译码器仿真实现

目录

安装Quartus软件

四位全加器

全加器、半加器

半加器:

全加器:

四位全加器电路图

创建项目

半加器

全加器

四位全加器

代码实现

半加器

全加器

四位全加器

三八译码器

创建项目

代码展示

modelsim仿真波形图

四位全加器

三八译码器

总结与展望


安装Quartus软件

本次实验首先进行Quartus软件的安装,版本选择18.1.0.625。安装过程较为常规,依次进行安装选项选择、许可协议接受、安装路径选择(如E盘)等步骤,等待安装进度条完成后,根据驱动程序安装向导提示,选择下一页及完成,即可完成软件的正常安装并投入使用。以下是详细安装流程:

  1. 打开安装软件

这里以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)。具体的工作原理可以参考以下真值表:

逻辑表达式

每个输出端口的逻辑表达式可以表示为输入信号的组合。例如:

  1. Y0 = NOT I2 AND NOT I1 AND NOT I0
  2. Y1 = NOT I2 AND NOT I1 AND I0
  3. Y2 = NOT I2 AND I1 AND NOT I0
  4. Y3 = NOT I2 AND I1 AND I0
  5. Y4 = I2 AND NOT I1 AND NOT I0
  6. Y5 = I2 AND NOT I1 AND I0
  7. Y6 = I2 AND I1 AND NOT I0
  8. 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软件 四位全加器 全加器、半加器 半加器&#xff1a; 全加器&#xff1a; 四位全加器电路图 创建项目 半加器 全加器 四位全加器 代码实现 半加器 全加器 四位全加器 三八译码器 创建项目 代码展示 modelsim仿真波形图 四位全加器 三八译码…...

动态规划详解(二):从暴力递归到动态规划的完整优化之路

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

前端学习——HTML

HTML VSCode常用快捷键HTML标签文本标签列表标签表格Form表单表单元素 块元素与行内元素新增标签 VSCode常用快捷键 代码格式化&#xff1a;ShiftAltF 向上或向下移动一行&#xff1a;AltUp或AltDown 快速复制一行代码&#xff1a;ShiftAltUp或者ShiftAltDown 快速替换&#x…...

12.【线性代数】——图和网络

十二 图和网络&#xff08;线性代数的应用&#xff09; 图 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矩阵的零空间&#xff0c;求解 A x 0 Ax0 Ax0 电势3. A T A^T AT矩阵的零空间&#xff0c;电流总结电流图结论 …...

[环境搭建篇] Windows 环境下如何安装repo工具

Windows 环境下如何安装repo工具 1. 安装前置依赖2. 配置Repo引导脚本方法一&#xff1a;通过Gitee镜像安装&#xff08;推荐&#xff09;方法二&#xff1a;通过清华镜像安装 3. 解决依赖问题4. 初始化Repo仓库5. 常见问题解决 前言&#xff1a; 在Windows环境下安装Repo工具需…...

LeetCode 热题 100_字符串解码(71_394_中等_C++)(栈)

LeetCode 热题 100_字符串解码&#xff08;71_394&#xff09; 题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;栈&#xff09;&#xff1a; 代码实现代码实现&#xff08;栈&#xff09;&#xff1a;以思路一为例进行调…...

「DataX」数据迁移-IDEA运行DataX方法总结

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

【 <一> 炼丹初探:JavaWeb 的起源与基础】之 Servlet 过滤器:实现请求的预处理与后处理

<前文回顾> 点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、过滤器&…...

DeepSeek与浏览器自动化AI Agent构建指南

文章使用到的模型可以用硅基流动中的&#xff1a; 注册链接&#xff1a;硅基流动统一登录 邀请码&#xff1a;FytHp9Xa 一、技术选型阶段 1. 基础组件选择 AI模型&#xff1a;DeepSeek-R1开放API&#xff08;对话/推理&#xff09;或DeepSeek-Coder&#xff08;代码生成&#…...

面试中常问的mysql数据库指令【杭州多测师_王sir】

数据库中的修改表结构、增删改查、用户权限操作DDL 》数据库定义语言 create database&#xff0c;create table drop tableDML 》数据库操作语言 insert into&#xff0c;delete from&#xff0c;update set&#xff0c;DQL 》数据库查询语言 select .... from....crea…...

深度学习驱动的智能化革命:从技术突破到行业实践

第一章 深度学习的技术演进与核心架构 1.1 从浅层网络到深度学习的范式转变 深度学习的核心在于通过多层次非线性变换自动提取数据特征,其发展历程可划分为三个阶段:符号主义时代的规则驱动(1950s-1980s)、连接主义时代的浅层网络(1990s-2000s)以及深度学习时代的端到端…...

基于编译器特性浅析C++程序性能优化

最近在恶补计算机基础知识&#xff0c;学到CSAPP第五章的内容&#xff0c;在这里总结并且展开一下C程序性能优化相关的内容。 衡量程序性能的方式 一般而言&#xff0c;程序的性能可以用CPE&#xff08;Cycles Per Element&#xff09;来衡量&#xff0c;其指的是处理每个元素…...

服务器上通过ollama部署deepseek

2025年1月下旬&#xff0c;DeepSeek的R1模型发布后的一周内就火了&#xff0c;性能比肩OpenAI的o1模型&#xff0c;且训练成本仅为560万美元&#xff0c;成本远低于openAI&#xff0c;使得英伟达股票大跌。 下面我们来看下如何个人如何部署deepseek-r1模型。 我是用的仙宫云的…...

Android Coil总结

文章目录 Android Coil总结概述添加依赖用法基本用法占位图变形自定义ImageLoader取消加载协程支持缓存清除缓存监听 简单封装 Android Coil总结 概述 Coil 是一个用于 Android 的 Kotlin 图像加载库&#xff0c;旨在简化图像加载和显示的过程。它基于 Kotlin 协程&#xff0…...

《安富莱嵌入式周报》第351期:DIY半导体制造,工业设备抗干扰提升方法,NASA软件开发规范,小型LCD在线UI编辑器,开源USB PD电源,开源锂电池管理

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 视频版&#xff1a; https://www.bilibili.com/video/BV16C95YEEZs 《安富莱嵌入式周报》第351期&#xff1a;DIY半导体…...

Redis在人员管理系统中的应用示例

用户会话管理 场景&#xff1a;用户登录后存储会话信息&#xff0c;支持多服务器共享 实现&#xff1a; 用户登录成功后&#xff0c;生成唯一Token&#xff08;如JWT&#xff09;&#xff0c;作为Redis的Key Value存储用户ID、角色、权限等信息&#xff0c;设置过期时间&…...

The Wedding Juicer POJ - 2227

采取从外层边界&#xff0c;一步一步向内部拓展的策略&#xff0c;具体来说&#xff0c;一开始将最外面一层的点加入队列&#xff0c;并标记这些点的坐标已经被访问 取出队列中高度最低的点&#xff0c;将其弹出&#xff0c;查看其上下左右的点&#xff0c;如果新点没有被访问…...

# 深入理解RNN(一):循环神经网络的核心计算机制

深入理解RNN&#xff1a;循环神经网络的核心计算机制 RNN示意图 引言 在自然语言处理、时间序列预测、语音识别等涉及序列数据的领域&#xff0c;循环神经网络(RNN)一直扮演着核心角色。尽管近年来Transformer等架构逐渐成为主流&#xff0c;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 分支与原始仓库&#xff08;fork 源&#xff09;同步&#xff0c;您可以使用以下命令&#xff1a; 首先&#xff0c;确保您已经添加了原始仓库作为远程仓库&#xff08;如果尚未添加&#xff09;&#xff1a; git remote add…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...