Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vhdl 函数参数为负数时出现意外的函数输出_Vhdl - Fatal编程技术网

Vhdl 函数参数为负数时出现意外的函数输出

Vhdl 函数参数为负数时出现意外的函数输出,vhdl,Vhdl,我有一个优先级编码函数,它返回一个向量,在输入向量中找到第一个1的位置包含一个1。函数按预期工作,除非我尝试对输入向量求反。下面是一个演示意外行为的示例: ieee库; 使用ieee.std_logic_1164.ALL; 实体结核是 结束结核病; tb运行的体系结构是 常数N:自然值:=5; 函数get_first_one_in_vec(vec_in:std_logic_vector)返回std_logic_vector为 变量ret:std_逻辑_向量(vec_在'high down'中到

我有一个优先级编码函数,它返回一个向量,在输入向量中找到第一个
1
的位置包含一个
1
。函数按预期工作,除非我尝试对输入向量求反。下面是一个演示意外行为的示例:


ieee库;
使用ieee.std_logic_1164.ALL;
实体结核是
结束结核病;
tb运行的体系结构是
常数N:自然值:=5;
函数get_first_one_in_vec(vec_in:std_logic_vector)返回std_logic_vector为
变量ret:std_逻辑_向量(vec_在'high down'中到'low'中);
开始
ret:=(其他=>'0');
对于“低”到“高”循环中的向量u中的i
如果(i)中的vec_=1,则
ret(i):=“1”;
出口
如果结束;
端环;
返回ret;
end get_first_one_in_vec;
信号a:std_逻辑_向量(N-1向下至0);
信号abar:std_逻辑_向量(N-1向下至0);
第一信号_a:标准逻辑_向量(N-1向下至0);
信号优先注释:标准逻辑向量(N-1向下至0);
信号优先:标准逻辑向量(N-1向下至0);
开始
过程
开始
a这工作正常:

function get_first_one_in_vec (vec_in: std_logic_vector) return std_logic_vector is
    variable ret: std_logic_vector(vec_in'length downto 1);
    variable inp: std_logic_vector(vec_in'length downto 1) := vec_in;
begin
    ret := (others => '0');
    for i in inp'right to inp'left loop
        if inp(i)='1' then
            ret(i) := '1';
            exit;
        end if;
    end loop;

    return ret;
end get_first_one_in_vec;

为什么你的不起作用?当您使用
not
操作符*作为表达式的一部分调用函数时:

first_nota  <= get_first_one_in_vec(not a);
无论如何,这会破坏代码(从单词的另一端开始扫描)

使函数对其输入的编号顺序不可知的一种方法是将输入标准化,如下所示:

variable inp: std_logic_vector(vec_in'length downto 1) := vec_in;
一旦你做到了这一点,你就可以控制局面了。因此,我们可以更明确地从右循环到左循环,而不是从高循环到低循环:

for i in inp'right to inp'left loop

  • 不是
    是运算符而不是函数。你不需要括号

。。。您不需要括号,除非您使用函数调用表示法调用它:“not”(A)。:)。这个符号的有趣之处在于它可以作为一个转换函数,并且可以在端口映射上使用(甚至在2008年之前)。遗憾的是,我不能准确地表达我对
而不是
函数实现方式的厌恶。这是一段骇人听闻的代码。谢谢你,马修斯,我想你的厌恶可能放错地方了。
not
的实现不是问题所在:问题在于您在代码中隐含了一个假设,即“first”等同于“low
中的
vec_。它不是:它实际上是
vec_in'right
,这就是马修的代码所修复的。您假设系统中的每个人都预先同意所有向量都应该有一个
的范围,而这在实践中从未发生过。但是,您可以非常确定,每个人都同意右侧的位是LS位,这是优先级编码器应该从中开始操作的位置。
variable inp: std_logic_vector(vec_in'length downto 1) := vec_in;
for i in inp'right to inp'left loop