Aldec ActiveHdl 中的自然数不会溢出

Natural number not overflowing in Aldec ActiveHdl

提问人:jo132123sda 提问时间:7/20/2023 最后编辑:Mikefjo132123sda 更新时间:7/21/2023 访问量:46

问:

获取运行时 error_0067 值 -1 超出范围(0 到 7)。Buf_ptr 被设置为自然数,但仍然变为负数,因为它没有溢出回 7。这可以通过 if 语句轻松修复,但是 ActiveHdl 中是否有我需要启用的设置以允许自然溢出?

.....
signal buf_ptr      : natural range 0 to 7
....
....
....
dma_wrt_Data(7 downto 0) <= incoming_data(buf_ptr);
bytes_available          <= bytes_available - 1;
buf buf_ptr              <= buf_ptr - 1;
packet_byte_count        <= packet_byte_count -1;
rcv_pkt_bct              <= rcv_pkt_bct - 1;

在网上搜索了一下,看看是否有其他人有这个问题,找不到任何:(

VHDL Vivado 主动-HDL

评论

0赞 user16145658 7/21/2023
虽然 Ada95 引入了模块化整数,这些整数将具有使用包含保留字 mod 的类型声明引发的行为,但 VHDL 最初基于 Ada83 并且没有跟踪。模块化整数还允许按位运算,显示包含整数类型的底层实现类型,而 VHDL 保留了 Ada83 的“纯”数学定义,并要求您在仿真设计描述中避免溢出/下溢。(整数类型通过合成映射到二进制类型。这种映射并不总是可用的。

答:

1赞 Tricky 7/21/2023 #1

VHDL 是一种强类型语言。因此,整数类型没有上溢/下溢的概念。当为对象分配超出范围的值时,这是一个运行时错误。

如果你想要显式上溢/下溢,你可以用 / types from package 来做到这一点。unsignedsignedieee.numeric_std

2赞 Jim Lewis 7/21/2023 #2

范围不这样做。Mod 可以:

buf_ptr <= (buf_ptr - 1) mod 8;

就像@Tricky说的,范围的目的是允许在赋值期间检查边界。

Ada 有模块化类型可以做到这一点。这些在VHDL中可能是有趣的东西,但必须有人想要在语言的这一方面工作。此类活动的起点是:https://gitlab.com/IEEE-P1076/VHDL-Issues/-/issues