vhdl中的4位加法器

2023-11-30

我对 vhdl 语言还很陌生,所以请耐心等待。我刚刚为 1 位加法器编写了 vhdl 代码,但在为 4 位加法器编写时遇到了麻烦。这就是我到目前为止所得到的,如果有人能指出我要查找的内容的正确方向,那就太棒了!

VHDL代码:

LIBRARY IEEE; 
USE IEEE.STD_LOGIC_1164.ALL; 

ENTITY Adder4 IS
  GENERIC(CONSTANT N: INTEGER := 4);
  PORT(
    a, b: IN STD_LOGIC_VECTOR(N-1 DOWNTO 0);  -- Input SW[7..4]: a[3..0] inputs,
                                              -- SW[3..0]: b[3..0]
    sum: OUT STD_LOGIC_VECTOR(N-1 DOWNTO 0); -- Output LEDR[3..0]
    cOut: OUT STD_LOGIC -- Output LEDR[4]
  );
END Adder4;

ARCHITECTURE imp OF Adder4 IS
  COMPONENT Adder1 
  PORT(
    a, b, cIn : in STD_LOGIC;
    sum, cOut : out STD_LOGIC);
  END COMPONENT;
  SIGNAL carry_sig: std_logic_vector(N DOWNTO 0);
BEGIN
  -- What to write here?
END imp;

尊重 shath 的关于您确实打算在 Adder4 中实例化 N 个 Adder1 的机会的好答案:

ARCHITECTURE imp OF Adder4 IS
COMPONENT Adder1 
PORT(
a, b, cIn : in STD_LOGIC;
sum, cOut : out STD_LOGIC);
END COMPONENT;
SIGNAL carry_sig: std_logic_vector(N-1 DOWNTO 0);
signal carry_in:  std_logic_vector(N-1 DOWNTO 0);
BEGIN
-- What to write here?

    carry_in <= ((carry_sig(N-2 downto 0)) &'0');
Adders:
for i in 0 to N-1 generate
    begin
    ADD1:
        Adder1 port map (
            a => a(i), 
            b => b(i),
            cIn => carry_in(i),
            sum => sum(i),
            cOut => carry_sig(i)            
        );
    end generate;

Carry_Out:
    cOut <= carry_sig(N-1);

END imp;

ARCHITECTURE gen OF Adder4 IS
    COMPONENT Adder1 
    PORT(
        a, b, cIn : in STD_LOGIC;
        sum, cOut : out STD_LOGIC);
        END COMPONENT;

SIGNAL carry_sig: std_logic_vector(N-1 DOWNTO 0);

BEGIN
-- What to write here?

Adders:
    for i in 0 to N-1 generate
    ADD0:    
        if i = 0 generate
        Add1:
            Adder1 port map (
                a => a(i), 
                b => b(i),
                cIn => '0',
                sum => sum(i),
                cOut => carry_sig(i)            
            );
        end generate;
    ADDN:
        if i /= 0 generate
            Add1:
            Adder1 port map (
                a => a(i), 
                b => b(i),
                cIn => carry_sig(i-1),
                sum => sum(i),
                cOut => carry_sig(i)  
            );          
        end generate;

    end generate;

Carry_Out:
    cOut <= carry_sig(N-1);

END architecture;

我自己更喜欢第一个架构 (imp),需要第二个 std_logic_vector 来进行进位输入,但大大简化了任何生成构造。两者之间的层次结构有所不同,第一个更容易阅读。


第一个架构 (imp) 还展示了如何手动实例化 Adder1 四次,消除生成构造并用所有 (i) 范围表达式替换其各自的 Adder1 实例范围表达式 ((0),(1),(2),(3 ), 分别)。

手动实例化的 adder1s 看起来像:

-- Note in this case you'd likely declare all the std_logic_vector with 
-- ranges (3 downto 0)


    SIGNAL carry_sig: std_logic_vector(3 DOWNTO 0);
    signal carry_in:  std_logic_vector(3 downto 0);
BEGIN
-- What to write here?

    carry_in <= ((carry_sig(2 downto 0)) &'0'); 

    ADD0:
        Adder1 port map (
            a => a(0), 
            b => b(0),
            cIn => carry_in(0),
            sum => sum(0),
            cOut => carry_sig(0)            
        );

 ...

    ADD3:
        Adder1 port map (
            a => a(3), 
            b => b(3),
            cIn => carry_in(3),
            sum => sum(3),
            cOut => carry_sig(3)            
        );

cOut <= carry_sig(3); -- or connect directly to cOut in ADD3 above

使用arry_sig向上调整的附加carry_in向量具有最低有效位carry_in“0”,使得编写变得简单。如果进位输入和进位输出信号被单独命名,那么实现进位前瞻方法也可以更容易阅读。


测试台还可以容纳宽度 N Adder4:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity adder4_tb is
       constant N:  natural := 4; 
end entity;

architecture tb of adder4_tb is
   signal a,b,sum:  std_logic_vector (N-1 downto 0);
   signal carryout:    std_logic;

begin

DUT: entity work.Adder4
    generic map (N => N)  -- associates formal N with actual N (a constant)
    port map (
        a => a,
        b => b,
        sum => sum,
        cOut => carryout
    );

STIMULUS:
    process 
    variable i,j:   integer;
    begin
        for i in 0 to N*N-1 loop
            for j in 0 to N*N-1 loop
                a <= std_logic_vector(to_unsigned(i,N)); 
                b <= std_logic_vector(to_unsigned(j,N));
                wait for 10 ns;     -- so we can view waveform display
            end loop;
        end loop;
        wait;   -- end the simulation
    end process;   
end architecture;

所有这些都不考虑进位树延迟时间,该延迟时间可能受到快速进位电路的实现或使用(例如,进位前瞻)的影响。

这给了我们一个看起来像这样的模拟:

Adder4_tb Simulation Waveform

或者更仔细地查看:

Adder4_tb Simulation Waveform, closeup

当使用基于生成语句的架构时,如果您更改了 N 的声明,您将拥有一个加法器,它将以 N 指定的可变宽度进行合成和模拟,直到纹波进位不再适用于输入数据速率(在目前测试台)。

请注意,通用 N 形式与测试台中声明的实际 N 的通用映射关联意味着在这种情况下,测试台中声明的 N 也设置了 Adder4 中的宽度 N。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vhdl中的4位加法器 的相关文章

  • 无法使用 VHDL 2008 Quartus Prime 进行编译

    我正在使用 Quartus Prime Lite Edition 并且我想使用一元运算符nand像这样的 std logic vector library ieee use ieee std logic 1164 all use ieee
  • vhdl中的4位加法器

    我对 vhdl 语言还很陌生 所以请耐心等待 我刚刚为 1 位加法器编写了 vhdl 代码 但在为 4 位加法器编写时遇到了麻烦 这就是我到目前为止所得到的 如果有人能指出我要查找的内容的正确方向 那就太棒了 VHDL代码 LIBRARY
  • ERROR:Xst:827 = 信号计数无法合成,同步描述错误

    我正在尝试模拟电梯 结果出现错误 ERROR Xst 827 Signal count cannot be synthesized bad synchronous description 我正在关注此来源的代码 https www yout
  • 在vhdl中生成随机整数

    我需要在 vhdl 中生成 0 1023 之间的随机整数 但是我在互联网上找不到这方面的好资源 请问有人帮我吗 下面是生成范围 0 1023 内均匀 均匀 分布的整数的示例 请注意 floor必须在与最大值 1 相乘之后使用运算 在本例中为
  • VHDL:按钮去抖动(或不去抖动,视情况而定)

    我已阅读其他帖子 但似乎无法修复我的 我是 VHDL 新手 所以我确信这是一个简单的修复 简而言之 按钮没有防抖 代码编译和比特流程序 在测试台中 按下按钮可以工作 但输出 LED 不会改变 在板上 按下按钮会使随机 LED 亮起 我猜是因
  • 请帮助我解决VHDL编译错误[重复]

    这个问题在这里已经有答案了 library IEEE use IEEE std logic 1164 all entity doorlock is port reset in std logic enable in std logic pa
  • 信号分配在进程中如何工作?

    我了解到信号在遇到表达式时不会立即改变 而是在进程结束时立即改变 在此示例中 signal x y z bit process y begin x lt y z lt not x end process 这个例子是这样说的 如果信号 y 发
  • VHDL:进程块内的多个上升沿检测

    我对 VHDL 以及一般的数字电路 还很陌生 我正在尝试使用 BCD 样式块实现两位数的计数器 该电路的外部有一些按钮 按下这些按钮时 会将感兴趣的数字加一 很像闹钟 这是一个异步操作 会在某种形式的编辑模式下发生 外部强制 我编写的代码在
  • VHDL 上的反转位顺序

    我在做类似的事情时遇到困难 b 0 to 7 lt a 7 downto 0 当我用ghdl编译它时 出现顺序错误 我发现使我的电路工作的唯一方法如下 library ieee use ieee std logic 1164 all ent
  • 使用双寄存器方法解决亚稳态问题

    为了解决Verilog中不同时钟域引起的亚稳态 采用双寄存器方法 但据我所知 亚稳态的最终输出尚未确定 输出独立于输入 那么 我的问题是如何保证使用双寄存器方法输出的正确性 Thanks 您不能完全确定您避免了亚稳态 正如您所提到的 亚稳态
  • Quartus初始化RAM

    我制作了一个实体 其中 quartus 成功识别 RAM 并为其实例化 RAM 宏功能 如果我可以从文件初始化 RAM 那就太好了 我找到了制作此类文件 mif 文件 的教程 现在我已经创建了该文件 我不知道如何让 quartus 初始化该
  • 如何在Altera Quartus中生成.rbf文件?

    什么是 rbf 文件以及如何在 Windows 上从 Quartus 输出文件 sof 生成它们 An RBF is a 原始二进制文件例如 它代表原始数据 这些数据将被加载到闪存中 以便在上电时初始化 FPGA A SOF is an S
  • VHDL - 分配默认值

    我有以下架构 architecture datapath of DE2 TOP is begin U1 entity work lab1 port map error on this line clock gt clock 50 key g
  • 赋值语句中的“others=>'0'”是什么意思?

    cmd register process rst n clk begin if rst n 0 then cmd r lt others gt 0 elsif clk event and clk 1 then cmd r lt end if
  • VHDL 中数组的硬件表示

    使用 VHDL 我想要一些寄存器 每个寄存器存储 16 位 所以我发现VHDL有一个内置数组 我想用它来存储iy中每个元素的16位 所以我想知道VHDL是否将此数组映射到实际寄存器 简短的回答是否定的 数组类型不映射到寄存器 长答案 VHD
  • 在 VHDL 中使用 SB_RGBA_DRV 原语

    我在使用为 Lattice ICE40UP fpga 提供的 SB RGBA DRV 原语时遇到问题 技术库提供了一个 verilog 示例 我可以使用它 但是当我尝试在 VHDL 中使用它时 P R 失败 输出以下消息 错误 非法连接 S
  • VHDL 中的 #define 等价物是什么

    VHDL 中的 define ifdef 和 ifndef 相当于什么 我想使用泛型作为 define 并根据它们更改设计 举一个简单的例子 定义一个字符串泛型并用它来确定时钟是单时钟还是差分时钟 generic something boo
  • FPGA 系统中的同步与异步复位

    我刚开始使用各种不同的模块创建 FPGA 系统来驱动 I2C 总线 尽管我认为这个问题适用于任何 FPGA 系统 并且所有模块都使用同步复位 这些模块使用时钟分频器模块进行计时 该模块获取系统时钟并向系统的其余部分输出较低的频率 我遇到的问
  • VHDL FSM多驱动网Q连接到常量驱动程序,其他驱动程序被忽略,我的代码有什么问题?

    这段代码是一个 FSM 它是一个摩尔机 艾莉莎 P 哈克 Alyssa P Hacker 有一只蜗牛 沿着纸带爬下去 上面有 1 和 0 蜗牛 每当最后两个时都会微笑 它爬过的数字是 01 设计摩尔和米利 蜗牛大脑的 FSM 代码如下所示
  • 用几个 1 位 ALU 制作一个 4 位 ALU

    我正在尝试将几个 1 位 ALU 组合成一个 4 位 ALU 我对如何在 VHDL 中实际执行此操作感到困惑 这是我正在使用的 1 位 ALU 的代码 component alu1 define the 1 bit alu componen

随机推荐

  • 如何更改 ScrollBar 的宽度?

    我想更改 TFrame 的 ScrollingBar 宽度 我知道我可以通过以下方式更改系统中的所有 ScrollingBar SystemParametersInfo SPI SETNONCLIENTMETRICS 但是我该如何为特定的
  • Haskell 列表错误的部分和

    我需要在 Haskell 中编写一个函数 对列表的元素求和 直到某些特定元素存储在另一个列表中 例如partial add 1 2 3 4 5 6 2 5 0应该返回 3 12 6 我已经达到了这样的程度 partial add count
  • 删除数组中连续出现的重复项

    有什么方法可以从下面的数组中删除连续的重复项 同时只保留第一个重复项 该数组如下所示 a array 1 gt go 2 gt stop 3 gt stop 4 gt stop 5 gt stop 6 gt go 7 gt go 8 gt
  • 如何在 Mac OS cocoa 中获取已安装 USB 设备的设备 ID、供应商 ID 和产品 ID

    我正在尝试编写一个 Cocoa 程序来检测连接到 Mac OS 的 iPod 我正在监听 NSWorkspaceDidMountNotification 和 NSWorkspaceDidUnmountNotification 以获取 USB
  • JObject.Parse 与 JsonConvert.DeserializeObject

    JsonConvert DeserializeObject 和 JObject Parse 有什么区别 据我所知 两者都采用字符串并且都在 Json NET 库中 什么样的情况会让一种情况比另一种更方便 或者主要只是偏好 作为参考 下面是我
  • Azure API 管理:带有后端 API 的 Oauth2

    我有一个后端 API 想要使用 Azure API 管理进行代理 该后端 API 要求我提供 Bearer Oauth2 令牌 我想使用 Azure APIM 为我处理 Oauth2 流 并且我想公开一个非常简单的 API 供客户端应用程序
  • 如何在我的多面标签之一中包含希腊符号?

    我正在尝试使用 ggplot2 v 2 2 2 1 创建一个绘图facet wrap 并且我只需要在一个方面标签中包含一个希腊符号 共五个 我尝试使用 Stack Overflow 上发布的代码 R 分面网格中分面标签的 R 希腊字母和普通
  • OCaml 会将多参数函数转换为柯里化函数还是反之亦然?

    当我学习 OCaml 基础知识时 我被告知 OCaml 中的每个函数实际上都是一个只有一个参数的函数 多参数函数实际上是一个接受一个参数并返回一个函数 该函数接受下一个参数并返回 这是柯里化 我明白了 所以我的问题是 case 1 if I
  • OpenXmlPowerTools DocumentBuilder 在单独的页面上合并文档

    I am trying to merge 4 word documents and force content of each document starts at new page But instead of appending tex
  • 仅使用“小阴谋家”中的表格来展平列表

    我正在通过 The LIttle Scherer 来学习Scheme 作为一个老C程序员 作为练习 我尝试编写一个过程来使用以下方法来展平列表only 小阴谋家 中的表格 IE define lambda cond car cdr and
  • 默认接口方法。抽象类和接口之间现在有什么深刻的、有意义的区别?

    我知道抽象类是一种特殊的类 不能被实例化 抽象类只能被子类化 继承 换句话说 它只允许其他类继承它 但不能实例化它 优点是它可以为所有子类强制执行某些层次结构 简单来说 它是一种强制所有子类遵循相同层次结构或标准的契约 我也知道接口不是类
  • Ruby on Rails:功能齐全的无表模型

    在搜索无表模型示例后 我发现了这段代码 这似乎是关于如何创建一个模型的普遍共识 class Item lt ActiveRecord Base class inheritable accessor columns self columns
  • 如何编写一个以通用方式接受迭代器或集合的函数?

    在过去 8 年左右的时间里 我几乎一直是一名 Java 程序员 最近我又开始使用 C 这是我在 C STL 和 Java 中遇到的关于迭代器的问题 在 Java 中 您可以编写一个采用迭代器的方法 如下所示 void someMethod
  • PyQt 组合框中单行中的不同颜色

    我正在使用 PyQt 开发一个 UI 其中 Qcombobox 中的单个项目可以有两个或三个用逗号分隔的单词 例如 第 1 项可以是 文本1 文本2 文本3 第 2 项将是 文本4 文本5 我想要做的是为 itemText 中由 分隔的项目
  • Apache Camel - 拆分和聚合 - 旧 Exchange 始终为空

    我发现这个问题已经被问过很多次了 但没有一个帖子有帮助或有一个结论性的解决方案 我正在拆分一条消息 然后使用 Aggregator2 聚合它 该代码引发异常 因为 oldExchange 始终为 null 所以为了测试我设计了一个小代码 我
  • 使用 Google 的 .Net 目录 API?

    我正在尝试使用 Google 的 Directory API for Net 创建我的第一个控制台应用程序 我有一个基于 Google 示例的代码 它向我展示了一些错误 其中之一当我尝试创建服务时 var service new Direc
  • 如何为ListBoxItems设置不同的Horizo​​ntalAlignment

    我已经发布一个问题昨天 但我认为我未能正确解释 让我再尝试一次 这就是我的目标 红色气泡代表传入消息 蓝色气泡代表传出消息 我可以使用以下 xaml 代码更准确地描述这一点 请注意 以下代码只是对我的实际 xaml 代码 带有一些 Data
  • 在 iOS 13 上读取 Mifare Ultralight NFC 标签时出现“标签连接丢失”错误

    我正在尝试读取 Mifare Ultralight 标签的页面 更具体地说EnOcean PTM 215B using NFCMifareTag sendMifareCommand发现并连接后的方法 问题是我尝试发送的所有命令都会导致 标签
  • angular2 仅从字符串生成组件

    请告诉我们如何在 Angular2 4 中执行以下操作 成分SomeComponent来自 Input以下 html 作为字符串
  • vhdl中的4位加法器

    我对 vhdl 语言还很陌生 所以请耐心等待 我刚刚为 1 位加法器编写了 vhdl 代码 但在为 4 位加法器编写时遇到了麻烦 这就是我到目前为止所得到的 如果有人能指出我要查找的内容的正确方向 那就太棒了 VHDL代码 LIBRARY