Vhdl 定义常量时的函数调用是否有效?
关于另一个,我试图制作一个切片器,它可以声明范围不断扩大的常量。下面的代码似乎具有正确的功能,但操作似乎不稳定 编译器确实给出了警告: (vcom-1515)预定义属性“range”的前缀是函数调用“ifRange”Vhdl 定义常量时的函数调用是否有效?,vhdl,Vhdl,关于另一个,我试图制作一个切片器,它可以声明范围不断扩大的常量。下面的代码似乎具有正确的功能,但操作似乎不稳定 编译器确实给出了警告: (vcom-1515)预定义属性“range”的前缀是函数调用“ifRange” 引用带有属性“range”的常量似乎不稳定,而“left”和“right”工作正常 这是有效的VHDL吗?还有其他方法可以达到同样的效果吗 library ieee; use ieee.std_logic_1164.all; package RangePack is impu
引用带有属性“range”的常量似乎不稳定,而“left”和“right”工作正常 这是有效的VHDL吗?还有其他方法可以达到同样的效果吗
library ieee;
use ieee.std_logic_1164.all;
package RangePack is
impure function ifRange(a : integer;
reset : boolean := false)
return std_logic_vector;
type tProtectedInteger is protected
impure function Get return integer;
procedure Set(a : in integer);
procedure Add(a : in integer);
end protected tProtectedInteger;
end package RangePack;
package body RangePack is
type tProtectedInteger is protected
body
variable vInteger : integer := 0;
impure function Get return integer is
begin
return vInteger;
end function Get;
procedure Set(a : in integer) is
begin
vInteger := a;
end procedure Set;
procedure Add(a : in integer) is
begin
vInteger := vInteger + a;
end procedure Add;
end protected body tProtectedInteger;
shared variable svOffset : tProtectedInteger;
impure function ifRange(a : integer;
reset : boolean := false)
return std_logic_vector is
variable vDummy : std_logic_vector(63 downto 0);
variable vOffset : integer;
begin
if(reset) then
svOffset.Set(0);
end if;
vOffset := svOffset.Get;
svOffset.Add(a);
return vDummy(vOffset+a-1 downto vOffset);
end ifRange;
end package body RangePack;
library ieee;
use ieee.std_logic_1164.all;
use work.RangePack.all;
entity tb is
end entity tb;
architecture sim of tb is
constant cB : std_logic_vector(ifRange(8, reset => true)'range) := (others => '1');
constant cA : std_logic_vector(ifRange(4)'range) := (others => '0');
signal sVector : std_logic_vector(11 downto 0) := x"CA7";
signal sA : std_logic_vector(3 downto 0);
signal sB : std_logic_vector(7 downto 0);
begin
-- works
sA <= sVector(cA'left downto cA'right);
sB <= sVector(cB'left downto cB'right);
--does't work
--sA <= sVector(cA'range);
--sB <= sVector(cB'range);
end architecture sim;
ieee库;
使用ieee.std_logic_1164.all;
包RangePack是
不纯函数ifRange(a:整数;
重置:布尔值:=false)
返回标准逻辑向量;
类型tProtectedInteger受保护
不纯函数得到返回整数;
程序集(a:整数);
程序加法(a:整数);
端部保护的tProtectedInteger;
端包装;
包体RangePack是
类型tProtectedInteger受保护
身体
变量维整数:整数:=0;
不纯函数Get返回整数为
开始
回程葡萄酒蒸馏器;
端函数Get;
过程集(a:整数)为
开始
维特格:=a;
结束程序集;
程序Add(a:整数)为
开始
维特格:=维特格+a;
结束程序添加;
端部保护体t保护集成电路;
共享变量svOffset:tProtectedInteger;
不纯函数ifRange(a:整数;
重置:布尔值:=false)
返回标准逻辑向量为
变量vDummy:std_逻辑_向量(63到0);
变量vOffset:整数;
开始
如果(重置)则
svOffset.Set(0);
如果结束;
vOffset:=svOffset.Get;
增加(a);
返回vDummy(vOffset+a-1向下至vOffset);
终点范围;
端包体范围包;
图书馆ieee;
使用ieee.std_logic_1164.all;
使用work.RangePack.all;
实体结核是
最终实体结核病;
tb-is的sim体系结构
常数cB:std_逻辑_向量(ifRange(8,reset=>true)范围):=(其他=>1');
常数cA:std_逻辑_向量(ifRange(4)范围):=(其他=>'0');
信号向量:标准逻辑向量(11到0):=x“CA7”;
信号sA:std_逻辑_向量(3到0);
信号sB:std_逻辑_向量(7到0);
开始
--工作
sA另一种方法可能是为字段宽度定义一个常量,并从中为字宽度定义一个常量,从而避免使用受保护的类型。此处似乎不需要使用受保护类型。您的作业<代码>--不起作用,因为这是合法的VHDL。IEEE标准1076-2008 16.2.3阵列的预定义属性A'范围[(N)]前缀:适用于数组对象或其别名的前缀,或表示其索引范围由约束定义的数组子类型的前缀。VHDL中没有定义警告,合法手段无错误。合法性可在详细阐述时确定。解决警告的一种方法是创建两个函数分别返回两个边界。也就是说,不要依赖“带有前缀的范围谁的合法性只能在运行时确定……我认为警告不是由注释掉的部分引起的,而是由以下原因引起的:例如,ifRange(8,reset=>true)范围。这里,'range
属性的前缀是函数调用。但是“操作不稳定”是什么意思?是的,正如标题所说,问题是关于常数定义部分。“不稳定”是指使用“范围”,如注释掉的部分。类似地,“范围”的各种使用也会导致运行时错误。错误消息清楚地表明范围失控,如“左侧13到2不是-200到99的一部分”。。。几乎每次引用“范围”时,模拟器都会调用该函数。您是否向我们展示了所有代码?我看不到范围从13到2…另一种方法可能是为字段宽度定义一个常量,并从中为字宽度定义一个常量,避免使用受保护的类型。此处似乎不需要使用受保护类型。您的作业<代码>--不起作用,因为这是合法的VHDL。IEEE标准1076-2008 16.2.3阵列的预定义属性A'范围[(N)]前缀:适用于数组对象或其别名的前缀,或表示其索引范围由约束定义的数组子类型的前缀。VHDL中没有定义警告,合法手段无错误。合法性可在详细阐述时确定。解决警告的一种方法是创建两个函数分别返回两个边界。也就是说,不要依赖“带有前缀的范围谁的合法性只能在运行时确定……我认为警告不是由注释掉的部分引起的,而是由以下原因引起的:例如,ifRange(8,reset=>true)范围。这里,'range
属性的前缀是函数调用。但是“操作不稳定”是什么意思?是的,正如标题所说,问题是关于常数定义部分。“不稳定”是指使用“范围”,如注释掉的部分。类似地,“范围”的各种使用也会导致运行时错误。错误消息清楚地表明范围失控,如“左侧13到2不是-200到99的一部分”。。。几乎每次引用“范围”时,模拟器都会调用该函数。您是否向我们展示了所有代码?我看不到范围从13到2。。。