《EDA技术》十六选一数据选择器实验报告

news2024/11/26 5:34:01

 要:

本实验通过Quartus软件完成对十六选一数据选择器的四种VHDL程序,分别为if;case;when else;when select四种方式,实现波形图的生成。同时,加深对VHDL语言的理解和使用多种方式完成任务的能力,提高实验操作能力。

关键词QuartusVHDL

引言

随着数字电路技术的迅猛进步,VHDL已成为硬件描述语言中的关键利器。利用VHDL,工程师能够精准地描绘电路逻辑,并通过仿真工具验证设计的准确性,进而生成对应的波形图。在本文中,我们将依据十六选一数据选择器的原理,采用Quartus软件编写四种VHDL代码,以直观地展示并生成所需的波形图,这样的工作流程使得电路设计、验证与仿真更加高效、精确。

一、电路分析

1、JK触发器
1.1电路结构

1.2 图形符号

1.3 真值表

1.4 逻辑表达式

1.5  边沿JK触发器的特点

        1、CLK的上升沿或下降沿触发。

        2、抗干扰能力极强,工作速度很高,在触发沿瞬间,按 Q*=J`Q+`KQ的规定更新状态。

        3、功能齐全,有保持、置0、置1、翻转功能,使用方便。

2、逻辑门的认识

2.1、逻辑与门(AND):
2.1.1 图形符号:

2.1.2 逻辑符号

2.1.3 真值表:

输入

输出

A

B

Y

0

0

0

0

1

0

1

0

0

1

1

1

2.1.4 逻辑表达式:

Y=AB

2.1.5 两输入与门的功能:

与门是实现逻辑“乘”运算的电路,有两个以上输入端,一个输出端(一般电路都只有一个输出端,ECL电路则有二个输出端)。只有当所有输入端都是高电平(逻辑“1”)时,该电路输出才是高电平(逻辑“1”),否则输出为低电平(逻辑“0”)。

2.2、逻辑或门(OR):
2.2.1 图形符号:

2.2.2 逻辑符号:

2.2.3 真值表:

输入

输出

A

B

Y

0

0

0

0

1

1

1

0

1

1

1

1

2.2.4 逻辑表达式:

Y=A+B

2.2.5  两输入或门功能:

或门是实现逻辑加的电路,又称逻辑和电路,简称或门。此电路有两个以上输入端,一个输出端。只要有一个或几个输入端是 “1”,或门的输出即为 “1”。而只有所有输入端为 “0”时,输出才为 “0”。

2.3  逻辑非门(NOT):
2.3.1 图形符号:

2.3.2 逻辑符号:

2.3.3 真值表:

输入

输出

A

Y

0

0

1

1

2.3.4 逻辑表达式:

       

2.3.5 非门功能:

实现逻辑代数非的功能,即输出始终和输入保持相反。当输入端为高电平(逻辑“1”)时,输出端为低电平(逻辑“0”);反之,当输入端为低电平(逻辑“0”)时,输出端则为高电平(逻辑“1”)

2.4 逻辑与非门(NAND):
2.4.1 图形符号:

2.4.2 逻辑符号:

2.4.3  真值表

输入

输出

A

B

Y

0

0

1

0

1

1

1

0

1

1

1

0

2.4.4 逻辑表达式:

2.4.5  两输入与非门功能:

与非门则是当输入端中有1个或1个以上是低电平时,输出为高电平;只有所有输入是高电平时,输出才是低电平。

2.5 逻辑或非门(NOR):
2.5.1 图形符号:
 
2.5.2 逻辑符号:
2.5.3 真值表:

输入

输出

A

B

Y

0

0

1

0

1

0

1

0

0

1

1

0

2.5.4 逻辑表达式:
       
2.5.5 两输入或非门的功能:

或非门是具有多端输入和单端输出的门电路。当任一输入端(或多端)为高电平(逻辑“1”)时,输出就是低电平(逻辑“0”);只有当所有输入端都是低电平(逻辑“0”)时,输出才是高电平(逻辑“1”)。

2.6 逻辑异或门(XOR)
2.6.1 图形符号:

2.6.2 逻辑符号:

2.6.3 真值表:

输入

输出

A

B

F

0

0

0

0

1

1

1

0

1

1

1

0

2.6.4 逻辑表达式:
      
2.6.5 两输入异或门的功能:

当输入信号中有一个为高电平,另一个为低电平时,输出信号为高电平。如果两个输入信号相同(均为高电平或均为低电平),则输出信号为低电平。

2.7、逻辑同或门(XNOR):
2.7.1 图形符号:

2.7.2 逻辑符号
2.7.3  真值表:

输入

输出

A

B

F

0

0

1

0

1

0

1

0

0

1

1

1

2.7.4 逻辑表达式:
       
2.7.5 两输入同或门的功能:

        当输入信号相同时(均为高电平或均为低电平),输出信号为高电平。如果输入信号不同,则输出信号为低电平。

        在数字逻辑的世界里,基础逻辑门作为构建块,通过相互串联、并联以及引入反馈机制,可以编织出更为错综复杂的逻辑网络。这些逻辑门不仅是计算机硬件、电子系统以及各类数字电子设备的基石,更是它们实现数据处理、存储和传输等关键功能的核心所在。

        简而言之,逻辑门是构建复杂逻辑功能的基石,它们通过不同的组合方式,在电子系统中发挥着数据处理、存储和传输的不可或缺的作用。

3、VHDL的认识

VHDL语言是一种用于电路设计的高级语言。它在80年代的后期出现。最初是由美国国防部开发出来供美军用来提高设计的可靠性和缩减开发周期的一种使用范围较小的设计语言 。

VHDL翻译成中文就是超高速集成电路硬件描述语言,主要是应用在数字电路的设计中。它在中国的应用多数是用在FPGA/CPLD/EPLD的设计中。当然在一些实力较为雄厚的单位,它也被用来设计ASIC

VHDL主要用于描述数字系统的结构,行为,功能和接口。除了含有许多具有硬件特征的语句外,VHDL的语言形式、描述风格以及语法是十分类似于一般的计算机高级语言。VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可视部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。

二、十六选一数据选择器原理

1.工作原理

16:1数据选择器有16个输入信号线(通常标记为a0,a1....a15)、4个选择信号线(标记为S0,S1,S2,S3)和1个输出信号线(标记为Y)。选择信号用来确定哪个输入信号会被传输到输出

2.输入与输出关系

出信号Y由选择信号决定。选择信号表示的二进制数确定了输出信号所连接的输入信号。例如:

(1)S3S2S1S0=0000时,Y=a0​

(2)S3S2S1S0=0001时,Y=a1​

(3)S3S2S1S0=0010时,Y=a2​

(4)依此类推,直到S3S2S1S0=1111时,Y=a15​

3.逻辑实现

实现16:1多路复用器的方法之一是使用逻辑门。每个输入信号与一组与选择信号相应的组合逻辑进行“与”运算,然后所有的这些“与”运算的结果通过一个“或”门进行汇总。具体来说:

(1)与门阵列:每个输入Ii都连接到一组与门,与门的另一端连接的是选择信号的某种组合。例如,输入I0需要通过4个选择信号S3,S2,S1,S0的否定来选择(即S3′⋅S2′⋅′S1′⋅S0′)。

(2)或门:所有与门的输出连接到一个或门,或门的输出就是选择器的输出 Y。

4.真值表

S3

S2

S1

S0

Y

0

0

0

0

a0

0

0

0

1

a1

0

0

1

0

a2

0

0

1

1

a3

0

1

0

0

a4

0

1

0

1

a5

0

1

1

0

a6

0

1

1

1

a7

1

0

0

0

a8

1

0

0

1

a9

1

0

1

0

a10

1

0

1

1

a11

1

1

0

0

a12

1

1

0

1

a13

1

1

1

0

a14

1

1

1

1

a15

5.应用

16:1选择器在多种应用中使用,包括数据路由、信号选择、时分复用等。在计算机系统中,它可以用来选择来自不同寄存器或存储单元的数据,在通信系统中,它可以用来选择不同信号源的信号进行传输。

三、Quartus软件仿真

1.创建工程以及VHDL文件
  1.1选中保存的路径,定义该工程的名称,点击Next
1.2选择Cyclone点击Next

1.3点击New选中VHDL File,点击OK,第一步就初步完成。

2.VHDL程序设计流程

VHDL(VHSIC Hardware Description Language)是一种文本化的硬件描述语言,它允许工程师精确地定义数字系统的结构和行为。在Quartus软件中,使用VHDL的数据流描述方法来进行数字系统设计,通常遵循以下步骤:

2.1. 定义实体(Entity):

(1)在VHDL代码中明确指定数字系统的接口。

(2)包括所有输入输出端口的数据类型、位宽和方向。

2.2. 架构化设计(Architecture):

(1)详细描述系统内部的工作机制和逻辑。

(2)定义数据如何在各个组件之间流动和处理。

2.3. 构建层次结构:

(1)将定义的实体和架构组合起来,形成一个完整的系统模型。

(2)通过VHDL的层次化描述,实现复杂系统的模块化设计。

通过这种VHDL描述方式,工程师可以在Quartus软件中高效地创建、模拟和验证数字系统,确保设计的正确性和可靠性。

3.十六选一数据选择器if语句的VHDL程序
 3.1VHDL程序

VHDL程序命令与解释(十六选一数据选择器)

library ieee;//导入IEEE库,这个库包含了标准逻辑类型和子程序

use ieee.std_logic_1164.all;//使用IEEE库中的std_logic_1164包,它定义了std_logic类型及其相关类型  

library ieee;-- 引入IEEE标准库。标准库中包含各种常用的数据类型和函数。

use ieee.std_logic_1164.all;-- 使用IEEE标准库中的 std_logic_1164 包,该包定义了std_logic和std_logic_vector等数据类型。

entity shuju is-- 定义一个名为 shuju 的实体,这是 VHDL 模块的声明部分。

port(a:in std_logic_vector(15 downto 0);-- 定义一个输入端口 a,它是一个16位的标准逻辑向量(std_logic_vector),输入信号。

s:in std_logic_vector(3 downto 0);-- 定义一个输入端口 s,它是一个4位的标准逻辑向量,选择信号。

y:out std_logic-- 定义一个输出端口 y,它是一个标准逻辑信号,输出信号。

    );

end;-- 结束实体声明部分。

architecture a1 of shuju is-- 定义名为 a1 的架构,它描述了实体 shuju 的具体实现

begin-- 开始架构体的定义。

process(a,s)-- 定义一个过程块 process,这个过程块在输入信号 a 或 s 发生变化时触发。

begin -- 过程块的开始。

if s="0000" then-- 如果选择信号 s 的值为 "0000" ,则执行以下语句。

y<=a(0);-- 输出信号 y 赋值为输入向量 a 的第0位。

elsif s="0001" then-- 如果选择信号 s 的值为 "0001" ,则执行以下语句。

y<=a(1);-- 输出信号 y 赋值为输入向量 a 的第1位。

elsif s="0010" then -- 如果选择信号 s 的值为 "0010" ,则执行以下语句。

y<=a(2);-- 输出信号 y 赋值为输入向量 a 的第2位。

elsif s="0011" then-- 如果选择信号 s 的值为 "0011" ,则执行以下语句。

y<=a(3);-- 输出信号 y 赋值为输入向量 a 的第3位。

elsif s="0100" then-- 如果选择信号 s 的值为 "0100" ,则执行以下语句。

y<=a(4);-- 输出信号 y 赋值为输入向量 a 的第4位。

elsif s="0101" then-- 如果选择信号 s 的值为 "0101" ,则执行以下语句。

y<=a(5);-- 输出信号 y 赋值为输入向量 a 的第5位。

elsif s="0110" then -- 如果选择信号 s 的值为 "0110" ,则执行以下语句。

y<=a(6);-- 输出信号 y 赋值为输入向量 a 的第6位。

elsif s="0111" then -- 如果选择信号 s 的值为 "0111" ,则执行以下语句。

y<=a(7); -- 输出信号 y 赋值为输入向量 a 的第7位。

elsif s="1000" then-- 如果选择信号 s 的值为 "1000" ,则执行以下语句。

y<=a(8);-- 输出信号 y 赋值为输入向量 a 的第8位。

elsif s="1001" then-- 如果选择信号 s 的值为 "1001" ,则执行以下语句。

y<=a(9); -- 输出信号 y 赋值为输入向量 a 的第9位。

elsif s="1010" then-- 如果选择信号 s 的值为 "1010" ,则执行以下语句。

y<=a(10);-- 输出信号 y 赋值为输入向量 a 的第10位。

elsif s="1011" then-- 如果选择信号 s 的值为 "1011" ,则执行以下语句。

y<=a(11); -- 输出信号 y 赋值为输入向量 a 的第11位。

elsif s="1100" then -- 如果选择信号 s 的值为 "1100" ,则执行以下语句。

y<=a(12); -- 输出信号 y 赋值为输入向量 a 的第12位。

elsif s="1101" then -- 如果选择信号 s 的值为 "1101" ,则执行以下语句。

y<=a(13); -- 输出信号 y 赋值为输入向量 a 的第13位。

elsif s="1110" then-- 如果选择信号 s 的值为 "1110" ,则执行以下语句。

y<=a(14);-- 输出信号 y 赋值为输入向量 a 的第14位。

elsif s="1111" then-- 如果选择信号 s 的值为 "1111" ,则执行以下语句。

y<=a(15);-- 输出信号 y 赋值为输入向量 a 的第15

else y<='X'; --如果选择信号 s 的值不在上述范围内,则输出信号 y 赋值为未知状态X 

end if; -- 结束 if 语句。

end process; -- 结束过程块。

end a1; -- 结束架构体定义

3.2 VHDL代码图片如下:

该代码运行后,无误则显示以下界面:

3.3波形图显示
3.3.1 创建VWF文件,点击New,点击University Program VWF,点击OK。

3.3.2 节点查找器,在左侧空白处鼠标右击,点击Insert Node or Bus...。

3.3.3 点击Node Finder...。

3.3.4 点击List,点击<<,点击OK

3.3.5 将s设为10进制显示,右击s,点击Radix,点击Unsigned Decimal。

3.3.6 将s的Count Value的Count every改成10.0ns。

3.3.7 将a的16个输入信号改成不同的状态,部分改时钟,部分置1,部分置0,以分辨y因为s的十进制的每一刻状态的显示。

3.3.8 在Simulation中点击Options,选中Quartus II Simulator。

3.3.9 选中Run Functional Simulation
3.3.10 选择保存路径,并且定义名称为shuju1.

3.3.11 波形图如下,从a的15个分别的状态,根据s的进制状态,以及y的状态,可以看出该图形就是十六选一数据选择器。

4.十六选一数据选择器case语句的VHDL程序
4.1VADL程序

VHDL程序命令与解释(十六选一数据选择器)

library ieee;//导入IEEE库,这个库包含了标准逻辑类型和子程序

use ieee.std_logic_1164.all;//使用IEEE库中的std_logic_1164包,它定义了std_logic类型及其相关类型  

library ieee;-- 引入IEEE标准库。标准库中包含各种常用的数据类型和函数。

use ieee.std_logic_1164.all;-- 使用IEEE标准库中的 std_logic_1164 包,该包定义了std_logic和std_logic_vector等数据类型。

entity shuju is-- 定义一个名为 shuju 的实体,这是 VHDL 模块的声明部分。

port(a:in std_logic_vector(15 downto 0);-- 定义一个输入端口 a,它是一个16位的标准逻辑向量(std_logic_vector),输入信号。

s:in std_logic_vector(3 downto 0);-- 定义一个输入端口 s,它是一个4位的标准逻辑向量,选择信号。

y:out std_logic-- 定义一个输出端口 y,它是一个标准逻辑信号,输出信号。

    );

end;-- 结束实体声明部分。

architecture a1 of shuju is-- 定义名为 a1 的架构,它描述了实体 shuju 的具体实现

begin-- 开始架构体的定义。

process(a,s)-- 定义一个过程块 process,这个过程块在输入信号 a 或 s 发生变化时触发。

begin -- 过程块的开始。

case s is-- 使用 case 语句,根据选择信号 s 的值进行不同的操作。

when "0000"=>y<=a(0);-- 当选择信号 s 的值为 "0000" 时,输出信号 y 赋值为输入向量 a 的第0位。

when "0001"=>y<=a(1);-- 当选择信号 s 的值为 "0001" 时,输出信号 y 赋值为输入向量 a 的第1位。

when "0010"=>y<=a(2);-- 当选择信号 s 的值为 "0010" 时,输出信号 y 赋值为输入向量 a 的第2位。

when "0011"=>y<=a(3);-- 当选择信号 s 的值为 "0011" 时,输出信号 y 赋值为输入向量 a 的第3位。

when "0100"=>y<=a(4);-- 当选择信号 s 的值为 "0100" 时,输出信号 y 赋值为输入向量 a 的第4位。

when "0101"=>y<=a(5);-- 当选择信号 s 的值为 "0101" 时,输出信号 y 赋值为输入向量 a 的第5位。

when "0110"=>y<=a(6);-- 当选择信号 s 的值为 "0110" 时,输出信号 y 赋值为输入向量 a 的第6位。

when "0111"=>y<=a(7);-- 当选择信号 s 的值为 "0111" 时,输出信号 y 赋值为输入向量 a 的第7位。

when "1000"=>y<=a(8);-- 当选择信号 s 的值为 "1000" 时,输出信号 y 赋值为输入向量 a 的第8位。

when "1001"=>y<=a(9);-- 当选择信号 s 的值为 "1001" 时,输出信号 y 赋值为输入向量 a 的第9位。

when "1010"=>y<=a(10);-- 当选择信号 s 的值为 "1010" 时,输出信号 y 赋值为输入向量 a 的第10位。

when "1011"=>y<=a(11);-- 当选择信号 s 的值为 "1011" 时,输出信号 y 赋值为输入向量 a 的第11位。

when "1100"=>y<=a(12);-- 当选择信号 s 的值为 "1100" 时,输出信号 y 赋值为输入向量 a 的第12位。

when "1101"=>y<=a(13);-- 当选择信号 s 的值为 "1101" 时,输出信号 y 赋值为输入向量 a 的第13位。

when "1110"=>y<=a(14);-- 当选择信号 s 的值为 "1110" 时,输出信号 y 赋值为输入向量 a 的第14位。

when "1111"=>y<=a(15);-- 当选择信号 s 的值为 "1111" 时,输出信号 y 赋值为输入向量 a 的第15位。

when others=>y<='X';-- 当选择信号 s 的值不在上述范围内时,输出信号 y 赋值为未知状态 'X'。

end case;-- 结束 case 语句。

end process; -- 结束过程块。

end a1; -- 结束架构体定义

4.2 VHDL代码图片如下:

4.3 波形图结果如下:
5.十六选一数据选择器when else语句的VHDL程序
5.1 VHDL程序

VHDL程序命令与解释(十六选一数据选择器)

library ieee;//导入IEEE库,这个库包含了标准逻辑类型和子程序

use ieee.std_logic_1164.all;//使用IEEE库中的std_logic_1164包,它定义了std_logic类型及其相关类型  

library ieee;-- 引入IEEE标准库。标准库中包含各种常用的数据类型和函数。

use ieee.std_logic_1164.all;-- 使用IEEE标准库中的 std_logic_1164 包,该包定义了std_logic和std_logic_vector等数据类型。

entity shuju is-- 定义一个名为 shuju 的实体,这是 VHDL 模块的声明部分。

port(a:in std_logic_vector(15 downto 0);-- 定义一个输入端口 a,它是一个16位的标准逻辑向量(std_logic_vector),输入信号。

s:in std_logic_vector(3 downto 0);-- 定义一个输入端口 s,它是一个4位的标准逻辑向量,选择信号。

y:out std_logic-- 定义一个输出端口 y,它是一个标准逻辑信号,输出信号。

    );

end;-- 结束实体声明部分。

architecture a1 of shuju is-- 定义名为 a1 的架构,它描述了实体 shuju 的具体实现

begin-- 开始架构体的定义。

y <= a(0) when s = "0000" else -- 当选择信号 s 的值为 "0000" 时,输出信号 y 赋值为输入向量 a 的第0位。

  a(1) when s = "0001" else -- 当选择信号 s 的值为 "0001" 时,输出信号 y 赋值为输入向量 a 的第1位。

a(2) when s = "0010" else -- 当选择信号 s 的值为 "0010" 时,输出信号 y 赋值为输入向量 a 的第2位。

a(3) when s = "0011" else -- 当选择信号 s 的值为 "0011" 时,输出信号 y 赋值为输入向量 a 的第3位。

a(4) when s = "0100" else -- 当选择信号 s 的值为 "0100" 时,输出信号 y 赋值为输入向量 a 的第4位。

a(5) when s = "0101" else -- 当选择信号 s 的值为 "0101" 时,输出信号 y 赋值为输入向量 a 的第5位。

a(6) when s = "0110" else -- 当选择信号 s 的值为 "0110" 时,输出信号 y 赋值为输入向量 a 的第6位。

a(7) when s = "0111" else -- 当选择信号 s 的值为 "0111" 时,输出信号 y 赋值为输入向量 a 的第7位。

a(8) when s = "1000" else -- 当选择信号 s 的值为 "1000" 时,输出信号 y 赋值为输入向量 a 的第8位。

a(9) when s = "1001" else -- 当选择信号 s 的值为 "1001" 时,输出信号 y 赋值为输入向量 a 的第9位。

a(10) when s = "1010" else -- 当选择信号 s 的值为 "1010" 时,输出信号 y 赋值为输入向量 a 的第10位。

a(11) when s = "1011" else -- 当选择信号 s 的值为 "1011" 时,输出信号 y 赋值为输入向量 a 的第11位。

a(12) when s = "1100" else -- 当选择信号 s 的值为 "1100" 时,输出信号 y 赋值为输入向量 a 的第12位。

a(13) when s = "1101" else -- 当选择信号 s 的值为 "1101" 时,输出信号 y 赋值为输入向量 a 的第13位。

a(14) when s = "1110" else -- 当选择信号 s 的值为 "1110" 时,输出信号 y 赋值为输入向量 a 的第14位。

a(15) when s = "1111" else -- 当选择信号 s 的值为 "1111" 时,输出信号 y 赋值为输入向量 a 的第15位。

'X'; -- 如果选择信号 s 的值不在上述范围内,则输出信号 y 赋值为未知状态 'X'

end a1; -- 结束架构体定义

5.2 VHDL程序代码如下
 
5.3 波形图结果如下:
6.十六选一数据选择器when select语句的VHDL程序
6.1 VHDL程序

VHDL程序命令与解释(十六选一数据选择器)

library ieee;//导入IEEE库,这个库包含了标准逻辑类型和子程序

use ieee.std_logic_1164.all;//使用IEEE库中的std_logic_1164包,它定义了std_logic类型及其相关类型  

library ieee;-- 引入IEEE标准库。标准库中包含各种常用的数据类型和函数。

use ieee.std_logic_1164.all;-- 使用IEEE标准库中的 std_logic_1164 包,该包定义了std_logic和std_logic_vector等数据类型。

entity shuju is-- 定义一个名为 shuju 的实体,这是 VHDL 模块的声明部分。

port(a:in std_logic_vector(15 downto 0);-- 定义一个输入端口 a,它是一个16位的标准逻辑向量(std_logic_vector),输入信号。

s:in std_logic_vector(3 downto 0);-- 定义一个输入端口 s,它是一个4位的标准逻辑向量,选择信号。

y:out std_logic-- 定义一个输出端口 y,它是一个标准逻辑信号,输出信号。

    );

end;-- 结束实体声明部分。

architecture a1 of shuju is -- 定义名为 a1 的架构,描述了实体 shuju 的具体实现。

begin -- 开始架构体的定义。

with s select -- 使用 with select 语句,根据选择信号 s 的值进行选择。

 y <= a(0) when "0000", -- 当选择信号 s 的值为 "0000" 时,输出信号 y 赋值为输入向量 a 的第0位。

a(1) when "0001", -- 当选择信号 s 的值为 "0001" 时,输出信号 y 赋值为输入向量 a 的第1位。

a(2) when "0010", -- 当选择信号 s 的值为 "0010" 时,输出信号 y 赋值为输入向量 a 的第2位。

a(3) when "0011", -- 当选择信号 s 的值为 "0011" 时,输出信号 y 赋值为输入向量 a 的第3位。

a(4) when "0100", -- 当选择信号 s 的值为 "0100" 时,输出信号 y 赋值为输入向量 a 的第4位。

a(5) when "0101", -- 当选择信号 s 的值为 "0101" 时,输出信号 y 赋值为输入向量 a 的第5位。

 a(6) when "0110", -- 当选择信号 s 的值为 "0110" 时,输出信号 y 赋值为输入向量 a 的第6位。

a(7) when "0111", -- 当选择信号 s 的值为 "0111" 时,输出信号 y 赋值为输入向量 a 的第7位。

a(8) when "1000", -- 当选择信号 s 的值为 "1000" 时,输出信号 y 赋值为输入向量 a 的第8位。

a(9) when "1001", -- 当选择信号 s 的值为 "1001" 时,输出信号 y 赋值为输入向量 a 的第9位。

a(10) when "1010", -- 当选择信号 s 的值为 "1010" 时,输出信号 y 赋值为输入向量 a 的第10位。

a(11) when "1011", -- 当选择信号 s 的值为 "1011" 时,输出信号 y 赋值为输入向量 a 的第11位。

a(12) when "1100", -- 当选择信号 s 的值为 "1100" 时,输出信号 y 赋值为输入向量 a 的第12位。

a(13) when "1101", -- 当选择信号 s 的值为 "1101" 时,输出信号 y 赋值为输入向量 a 的第13位。

a(14) when "1110", -- 当选择信号 s 的值为 "1110" 时,输出信号 y 赋值为输入向量 a 的第14位。

a(15) when "1111", -- 当选择信号 s 的值为 "1111" 时,输出信号 y 赋值为输入向量 a 的第15位。

'X' when others; -- 当选择信号 s 的值不在上述范围内时,输出信号 y 赋值为未知状态 'X'。

end a1; -- 结束架构体定义。

6.2 VHDL程序代码如下
6.3 波形图结果如下:

总结

1.实验目的

本次实验旨在通过使用Quartus软件,编写四个十六选一数据选择器的VHDL代码,分别使用if-elsif、case、when else和with select四种语句来实现,并进行波形仿真验证以比较其正确性和性能。

2.实验方法

(1)使用 if-elsif 语句:

逐一检查选择信号s的值,并根据其值选择对应的输入数据位。

(2)使用 case 语句:

采用结构化的case语句,根据选择信号s的不同值进行分支选择。

(3)使用 when else 语句:

通过嵌套的条件选择语句,依次判断选择信号s的值,并选择相应的数据位。

(4)使用 with select 语句:

使用选择语句,根据选择信号s的值直接选择相应的数据位,实现方式最为简洁

3. 波形仿真结果

通过Quartus软件对每种实现方法进行波形仿真,观察输入选择信号s和输入数据a,以及输出信号y的波形变化。仿真结果总结如下:

(1)if-elsif 语句的仿真结果:

仿真波形显示输出信号y随着选择信号s的变化正确地反映了输入数据a中对应位的值。

当s为无效值时,输出y显示为未知状态'X'.

(2)case 语句的仿真结果:

case语句的仿真波形与if-elsif语句一致,输出信号y在选择信号s的不同取值下正确地反映了相应的输入数据位。

(3)when else 语句的仿真结果:

仿真波形显示y随s的变化正确反映了输入数据a中的相应位。

在所有可能的选择信号取值下,输出信号均正确。

(4)with select 语句的仿真结果:

仿真波形显示y在s的每个取值下都正确地选择了输入数据a的对应位。

with select语句提供了最为简洁明了的实现方式,仿真结果完全正确。

4.实验结论

通过对四种不同VHDL实现方式的波形仿真验证,可以得出以下结论:

功能正确性:

四种实现方式均能够正确地实现16选1数据选择器的功能,输出信号y能够正确反映输入选择信号s对应的数据位。

代码简洁性:

使用with select语句的实现最为简洁和直观,代码可读性和维护性最好。case语句的实现结构化程度高,代码也较为简洁明了。

仿真效率:

四种实现方式的仿真效率基本相当,但在代码编写和调试过程中,with select和case语句的实现方式更易于理解和调试。

5. 实验总结

本次实验成功地使用四种不同的VHDL语句实现了16选1数据选择器,并通过Quartus软件进行了波形仿真验证。实验结果表明,每种实现方式都能够正确地实现数据选择器的功能。通过比较,可以看出with select和case语句的实现方式在代码简洁性和可维护性方面具有优势。实验过程中发现,仿真工具能够直观地展示数字电路的行为,有助于设计和验证复杂的数字电路。

致谢

此,我要向我的导师``老师表示最诚挚的感谢。在整个实验报告撰写的过程中,`老师始终给予我悉心的指导和耐心的解答。他渊博的学识、对专业的热情与执着,以及严谨认真的工作态度,都对我产生了深远的影响。他的亲历亲为、追求完美的精神,不仅教会了我专业知识,更传授了我做人的道理。同时,我也要感谢所有在实验过程中给予我们指导和帮助的老师们。是您们的专业知识和丰富经验,为我们指明了方向,提供了宝贵的建议。您们的严谨治学态度和无私奉献的精神,是我们学习的楷模,让我们在实验过程中收获满满,受益匪浅。

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

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

相关文章

[WTL/Win32]_[中级]_[MVP架构在实际项目中应用的地方]

场景 在开发Windows和macOS的界面软件时&#xff0c;Windows用的是WTL/Win32技术&#xff0c;而macOS用的是Cocoa技术。而两种技术的本地语言一个主打是C,另一个却是Object-c。界面软件的源码随着项目功能增多而增多&#xff0c;这就会给同步Windows和macOS的功能造成很大负担…

vue:对三种获取更新后的dom的方式进行分析

一、问题分析 由于vue的异步更新机制&#xff0c;我们在同步代码中是无法获取到更新后的dom的信息的 针对这个问题&#xff0c;我们有三种解决方案获取更新后的dom: 1.nextTick() 2.setTimeout() 3.在微任务中获取 因为更新是在同步任务结束后&#xff0c;执行微任务之前…

Java项目常用包的分层和作用

一个好的Java项目要有好的分层&#xff0c;不仅简洁明了&#xff0c;而且降低代码的耦合度&#xff0c;方便维护和升级。 web层 在Java Web应用程序中&#xff0c;Web层通常指的是处理HTTP请求和响应的层次&#xff0c;它直接与客户端&#xff08;通常是Web浏览器&#xff09…

【idea】gradle多模块构建项目内存溢出终止问题解决

背景 idea构建多模块项目&#xff0c;构建报错 Daemon is stopping immediately JVM garbage collector thrashing and after running out of JVM memory 解决 进到下图目录下 在文件管理中进入上面目录添加gradle.properties文件&#xff0c;内容如下 org.gradle.jvmargs-…

学校校园考场电子钟,同步授时,助力考场公平公正-讯鹏科技

随着教育技术的不断发展&#xff0c;学校对于考场管理的需求也日益提高。传统的考场时钟往往存在时间误差、维护不便等问题&#xff0c;这在一定程度上影响了考试的公平性和公正性。为了解决这些问题&#xff0c;越来越多的学校开始引入考场电子钟&#xff0c;通过同步授时技术…

【深度学习】GPT-2,Language Models are Unsupervised Multitask Learners,【语言建模】

论文&#xff1a;https://d4mucfpksywv.cloudfront.net/better-language-models/language_models_are_unsupervised_multitask_learners.pdf 文章目录 摘要引言方法2.1 训练数据集2.2 输入表示2.3 模型3. 实验3.1 语言建模3.2 Children’s Book Test3.3 LAMBADA3.4 Winograd Sc…

兼容MacOS和FreeBSD软件包的开源ravynOS操作系统

ravynOS 是一个新型的操作系统项目&#xff0c;致力于在 x86-64&#xff08;终极目标是同时实现 ARM&#xff09;平台上提供与 macOS 类似的体验和兼容性。它基于坚若磐石的 FreeBSD、现有的开源代码和锦上添花的新代码构建。 主要设计目标&#xff1a; 与 macOS 应用程序的源…

python基础语法 002 - 4 字符串

1 字符串 字符串&#xff1a;引号括起来的数据类型 # 双引号 a "yuze wang"# 单引号 a ’yuze wang‘# 三引号 a ’‘’yuze‘‘’ a """yuze"""注意&#xff1a;所有格式表示都是半角&#xff0c;全角会报错 1.1 引号表示 …

C++及cmake语法介绍

c/cmake学习 文章目录 c/cmake学习1. c1.1 基本模型1.1.1 for循环1.1.2 main函数1.1.2 带参数函数编译函数 2. CMAKE2.1 相关命令2.1.1 编译基本命令2.1.2 动态库静态库编译2.1.3 消息输出2.1.4 cmake变量常见参数1. 设置构建类型2. 设置编译器标志3. 指定编译器4. 设置安装路径…

【PB案例学习笔记】-22制作一个语音朗读金额小应用

写在前面 这是PB案例学习笔记系列文章的第22篇&#xff0c;该系列文章适合具有一定PB基础的读者。 通过一个个由浅入深的编程实战案例学习&#xff0c;提高编程技巧&#xff0c;以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码&#xff0c;小凡都上传到了gite…

计算机网络:3数据链路层

数据链路层 概述封装成帧和透明传输帧透明传输&#xff08;填充字节或比特&#xff09;差错检测奇偶校验循环冗余校验CRC Cyclic Redundancy Check 可靠传输停止-等待协议回退n帧协议&#xff08;滑动窗口协议&#xff09;选择重传协议 点对点协议PPP共享式以太网网络适配器&am…

Spring系统学习 -Spring IOC 的XML管理Bean之P命名空间、实现引入MySQL外部链接属性文件

P命名空间 在Spring框架中&#xff0c;P命名空间是一种用于简化XML配置文件中属性注入的方式。通过引入P命名空间&#xff0c;可以使用更简洁的语法来设置bean的属性值&#xff0c;而无需显式地使用<property>子元素。这使得XML配置文件更加简洁和易于阅读。 要在Sprin…

【vue3|第9期】Vue3中watch监视的深度解读

日期&#xff1a;2024年6月10日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对的地方&#xf…

期末复习GGG-----查找子串

郭的 char *search( char *s, char *t ){int i0;while(s[i]){int j0;if(s[i]t[0]){while(s[ij]t[j]&&t[j]){j;}if(t[j]\0)return si;}i;}return NULL; } AI的 #include <stdio.h> #include <string.h> #define MAXS 30char *search(char *s, char *t);in…

Matlab使用Simulink仿真实现AM和BPSK信号的解调

前言 本篇实现了基于AM和BPSK调制的通信系统&#xff0c;采用Bernoulli Binary Generator生成随机二元序列&#xff0c;码元速率为0.5秒/个。AM调制使用Sine Wave模块生成载波&#xff0c;频率40Hz&#xff0c;相位π/2。BPSK调制通过Switch模块切换相位0和π的载波。信号传输…

红利之外的A股底仓选择:A50

内容提要 华泰证券指出&#xff0c;当前指数层面下行风险不大&#xff0c;市场再入震荡期下&#xff0c;可关注三条配置线索&#xff1a;1&#xff09;A50为代表的产业巨头&#xff1b;2&#xff09;以家电/食饮/物流/出版为代表的稳健消费龙头&#xff0c;3&#xff09;消费电…

使用 Iceberg、Tabular 和 MinIO 构建现代数据架构

现代数据环境需要一种新型的基础架构&#xff0c;即无缝集成结构化和非结构化数据、轻松扩展并支持高效的 AI/ML 工作负载的基础架构。这就是现代数据湖的用武之地&#xff0c;它为您的所有数据需求提供了一个中心枢纽。然而&#xff0c;构建和管理有效的数据湖可能很复杂。 这…

【离散化 二维差分】850. 矩形面积 II

本文涉及知识点 离散化 二维差分 LeetCode850. 矩形面积 II 给你一个轴对齐的二维数组 rectangles 。 对于 rectangle[i] [x1, y1, x2, y2]&#xff0c;其中&#xff08;x1&#xff0c;y1&#xff09;是矩形 i 左下角的坐标&#xff0c; (xi1, yi1) 是该矩形 左下角 的坐标…

物联网协议基础知识

协议允许节点以结构化的方式在它们之间进行交互。由于物联网设备的需求和用例在过去几年中迅速发展&#xff0c;协议也随之发展。总而言之&#xff0c;主要有两类协议&#xff1a;网络协议和数据协议。此分类来自广泛应用于 IT 通信网络的 OSI&#xff08;开放系统互连&#xf…

深入探讨JavaScript的执行机制

预编译 首先下面这段代码的执行是一个怎样的结果呢&#xff1f; showName(); console.log(MyName);var MyName 小陈同学function showName() {console.log(函数showName被执行); }在这段代码中我们声明了一个变量MyName和一个函数showName&#xff0c;调用函数&#xff0c;打…