【问题标题】:type in vhdl corresponds to c-language: "uint32_t" or "unsigned long"vhdl 中的类型对应于 c 语言:“uint32_t”或“unsigned long”
【发布时间】:2019-07-26 16:08:21
【问题描述】:

VHDL中最接近经典c语言数据类型“uint32_t”的数据类型是什么,例如:

#include "stdint.h"
void main() {
    uint32_t data = 0xFFFFFFFF;
}

据我了解,VHDL 的“正”和“自然”类型只是有符号“整数”类型的子集,缺少 c 语言 uint32_t 类型范围的一半。

architecture sim of testbench is
    --integer range: -2,147,483,648 to +2,147,483,647
    --same as c-language int32_t
    signal a0 :integer  := 1;  

    --integer range: 0 to +2,147,483,647
    --same as c-language int32_t and'ed with 0x7FFFFFFF
    signal a1 :natural  := 1;

    --integer range: 1 to +2,147,483,647
    --same as c-language int32_t and'ed with 0x7FFFFFFF, and 0 thrown away
    signal a2 :positive := 1;

    --integer range: -1 to -2,147,483,648
    --same as c-language int32_t or'ed with 0x80000000, and 0 thrown away
    signal a3 :negative := 1;


    --unsigned integer range: 0 to 4,294,967,295
    --??????  does it exist in VHDL?
    signal a4 :uint32_t 

begin
end architecture;

【问题讨论】:

  • 我强烈建议您停止将 HDL 与普通编程语言进行比较。它只会使您的思想和设计 HDL 的方式完全走上错误的轨道。例如,在 HDL 中,您可以创建一个“尽可能大”的变量。您使用 9、17、32 或 48 位。 (顺便说一下,有多种方法可以制作无符号 32 位整数。我看到第一个答案已经到来。)
  • 是的,但是 VHDL 仍然需要与将这些数据大小硬连线到 CPU 中的 c 语言应用程序接口,因此了解这些信息很重要。此外,您的 VHDL 模拟将运行得更快,因为您的大小与指令集支持的 CPU 整数大小相匹配。没有意义仅仅因为 VHDL 不会自动定义 uint32_t 数据类型而浪费一点。
  • 唯一模拟速度更快的类型是 Verilog 'int' 类型,为此目的明确定义。所有其他人都不会为你带来任何好处。仅仅因为您使用 32 位并不意味着模拟器会将其映射到整数上。

标签: vhdl


【解决方案1】:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity testit is
end entity;

architecture sim of testit is
    subtype uint32_t is unsigned(31 downto 0);

    signal a1 :uint32_t := X"FFFFFFFF";
    signal a2 :uint32_t := X"AFFFFFFF";

    -- Error out of bounds
    --signal a3 :integer := 16#FFFFFFFF;
begin
end architecture;

【讨论】:

  • 实际上,虽然这在技术上是最接近的(也是事实上的用法),但它会模拟最慢的。它基于9态std_logic类型,也是一个信号,所以涉及到时序和调度。最接近的可能是variable uint : unsigned(31 downto 0),其中无符号类型来自ieee.numeric_bit
  • 另外,vhdl 2019 将要求整数为 64 位
  • 实际上,如果它的 9 级逻辑,这甚至比普通 VHDL 整数还要好...这意味着您可以使用整数创建逻辑,而不必担心 X 与 0 混淆...更好然而,子类型 uint64_t 是无符号的(63 下降到 0);并且子类型 int64_t 已签名(63 降至 0);不知道为什么 VHDL 2019 甚至对整数类型感到困扰......他们应该摆脱它并创建一个“stdint”包,将所有相同的整数定义为 c 语言头文件:#include using signed and unsigned而不是内置的整数类型......在我看来这使得 VHDL 不那么烦人。
  • 如果需要,请使用 verilog。整数类型的要点是它比数组类型模拟更快并且使用更少的内存。它初始化为实际值,可以子类型化为任何离散范围,通常用作数组索引。因为您可以设置范围,所以很容易检测到越界错误。签名或未签名永远不会这样做。对于无符号,它们的范围为 0 到 2^n。基本上,整数类型有很多不能用于数组类型的用途。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-22
  • 1970-01-01
  • 2021-07-31
相关资源
最近更新 更多