二进制补码 VHDL

2023-12-04

我只是想用 VHDL 制作一个简单的二进制补码设备,但它抛出了这个非常烦人的错误,我不确定我做错了什么。可能是一些非常愚蠢的事情......错误是 “错误 (10327):twocompliment.vhd(21) 处的 VHDL 错误:无法确定运算符“nand”的定义 -- 找到 0 个可能的定义”

代码是

library ieee;
use ieee.std_logic_1164.all; 
use ieee.numeric_std.all;
entity twoscompliment is
      generic
      (
              Nbits : positive := 8 
       );
 port 
( 
           --Inputs
           A : in std_logic_vector (Nbits-1 downto 0);
           --Outputs
           Y : out std_logic_vector (Nbits downto 0)
);
end twoscompliment;

architecture twoscompliment_v1 of twoscompliment is
 begin
  Y <= std_logic_vector(unsigned(A NAND '1') + '1');
 end twoscompliment_v1;

任何帮助都是极好的!


在我看来,你试图否定输入的数字......也许我错过了一些重要的东西,但其他答案给出了一种解决方案,该解决方案在实现目标的同时,似乎比他们需要的更加混乱。

除非丑陋的转换,有什么问题

y <= std_logic_vector(-signed(resize(unsigned(A)), y'length));

当然,我认为如果 A 和 Y 应该表示有符号数(或无符号数),那么它们应该表示为这样:

library ieee;
use ieee.numeric_std.all;
entity twoscomplement is
  generic
  (
     Nbits : positive := 8 
  );
  port 
  ( 
     A : in  unsigned (Nbits-1 downto 0);
     Y : out signed   (Nbits downto 0)
  );
end entity twoscomplement;

architecture a1 of twoscomplement is
begin
  Y <= -signed(resize(A, Y'length));
end architecture;

让我们检查一下结果:

entity test_twoscomplement is
end entity;

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
architecture test of test_twoscomplement is
    signal A : unsigned (7 downto 0);
    signal Y : signed(8 downto 0);
begin
    dut : entity work.twoscomplement port map (A => A, Y=>Y); 

    process
    begin
       for i in 0 to 255 loop
         A <= to_unsigned(i, A'length);
         wait for 1 ns;
         assert to_integer(Y) = -i severity error;
       end loop;
       report "tests done";
       wait;
     end process;
end architecture;

使用 GHDL 运行:

$ ghdl -a twoscomp.vhd 
$ ghdl --elab-run test_twoscomplement
twoscomp.vhd:40:8:@256ns:(report note): tests done

Success!

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

二进制补码 VHDL 的相关文章

  • vhdl中的4位加法器

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

    我正在参与这个学校项目 我有两个 std logic vector 31 downto 0 A 和 B 并且我有一个变量类型 std logic vector 32 downto 0 我想添加 A B 并将结果放入 32 位的 std lo
  • 调试 VHDL Modelsim 中的迭代限制错误

    我正在 Modelsim 上为 d 触发器编写 VHDL 代码 当我尝试模拟它时出现错误 错误 vsim 3601 在 400 ps 时达到迭代限制 我不确定这意味着什么 但我已经检查了大部分源代码以查找错误 但没有成功 谁能猜出问题可能是
  • ERROR:Xst:827 = 信号计数无法合成,同步描述错误

    我正在尝试模拟电梯 结果出现错误 ERROR Xst 827 Signal count cannot be synthesized bad synchronous description 我正在关注此来源的代码 https www yout
  • VHDL:按钮去抖动(或不去抖动,视情况而定)

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

    考虑这段代码 architecture synth of my entity is signal a std logic begin a lt c and d b lt a and c end synth 第二行会尊重这一点吗a在其他进程中
  • VHDL:进程块内的多个上升沿检测

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

    我有一条记录定义如下 type ifx t is record data std logic vector 127 downto 0 address std logic vector 19 downto 0 WrReq std logic
  • 如何在 Sphinx 运行时预处理源文件?

    我已经为我的项目设置了 Sphinx 文档 并希望提取源文件的文档字符串并将它们嵌入到最终文档中 不幸的是 Sphinx 不支持源文件的语言 VHDL VHDL 似乎没有 Sphinx 域 所以我的想法如下 挂钩 Sphinx 运行并在 S
  • 在非时钟信号上使用上升沿是不好的做法吗?还有其他选择吗?

    我正在研究 VHDL 设计并且它可以工作 但是代码非常丑陋 而且我似乎正在尝试围绕语言的设计来实现我的目标 这一事实让我觉得有些事情是错误的 我对 VHDL 还很陌生 但我已经研究该项目的较小部分近一个月了 所以我有了总体想法 然而 这部分
  • VHDL门控时钟如何避免

    我收到了避免使用门控时钟的建议 因为它可能会导致松弛和时序限制问题 但我想问一下我可以认为什么是门控时钟 例如 此代码对时钟进行门控 因为 StopCount 对它进行门控 process ModuleCLK begin if rising
  • 将整数转换为 std_logic

    假设你有一个循环 for i in 1 downto 0 loop for j in 1 downto 0 loop tS0 lt i 但我需要将整数 这是自然的 转换为 std logic tS0被声明为 std logic 我只做了一位
  • 有没有办法使用 std textio 在 vhdl 中多次读取文件?

    我试图了解如何在 vhdl 中读取文件 如果我打开一个文件 通读它 测试文件结尾 关闭文件 然后重新打开该文件 然后再次开始读取 它会从开头开始吗 文件 非常感谢 向 VHDL 语言的权威寻求答案 IEEE 标准 1076 2008 5 5
  • 模拟器和合成器之间初始化状态机的差异

    我的问题是关于合成状态机中使用的第一个状态 我正在使用莱迪思 iCE40 FPGA 用于仿真的 EDA Playground 和用于综合的莱迪思 Diamond Programmer 在下面的示例中 我生成一系列信号 该示例仅显示引用状态机
  • Quartus初始化RAM

    我制作了一个实体 其中 quartus 成功识别 RAM 并为其实例化 RAM 宏功能 如果我可以从文件初始化 RAM 那就太好了 我找到了制作此类文件 mif 文件 的教程 现在我已经创建了该文件 我不知道如何让 quartus 初始化该
  • 在VHDL中将8位二进制数转换为BCD

    该算法众所周知 您进行 8 次左移 并在每次移位后检查个位 数十位或数百位 每个 4 位 如果它们超过 4 个 则将 3 个添加到该组中 依此类推 这是一个基于流程的解决方案 但不起作用 它会编译 但输出不是我想要的 有什么想法可能是什么问
  • VHDL 中数组的硬件表示

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

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

    如何最明智地设计用于初始化芯片的 VHDL 状态机 我当前的设计是 伪代码 案例状态 当 s0 gt VHDL CODE FOR WRITING VALUE TO REGISTER状态 s1 当 s1 gt VHDL CODE FOR WR
  • 是否为 VHDL numeric_std 有符号/无符号定义了溢出

    如果我有一个unsigned MAX downto 0 包含值2 MAX 1 VHDL 87 93 200X 标准是否定义了当我将其加一时会发生什么 或者 类似地 当我从零减一时 简短回答 没有溢出处理 溢出进位只是丢失 因此结果就是你的操

随机推荐