2013-02-18 48 views
0

我在做我自己的滚动/移动功能的学校工作。 下面是我写的代码,但是当我尝试编译它时,我在rownum上得到语法错误< = rol(rowcount,1);VHDL位旋转函数语法错误?

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.numeric_std.all; 

architecture main of proj is 

function "rol" (a: std_logic_vector; n : natural) 
       return std_logic_vector is 
begin 
return std_logic_vector(unsigned(a) rol n); 
end function; 

signal rownum : std_logic_vector(2 downto 0); 
signal rowcount : std_logic_vector(2 downto 0); 

begin 

process begin 
wait until rising_edge(i_clock); 
**rownum<=rol(rowcount,1);** 

end process; 

end architecture main; 

回答

1

有几件事情需要在这里解决。

首先,你需要一个实体声明:

entity proj is 
    port(
    i_clock : in std_logic 
    ); 
end proj; 

这声明什么信号是你的实体的输入和输出。在这种情况下,它只是一个时钟。您可以根据需要添加rownum和rowcount输入和输出。

您的函数名不应该以引号括起来,并且重载现有的运算符也不是一个好主意。

function rol_custom (a: std_logic_vector; n : natural) 
      return std_logic_vector is 
begin 
return std_logic_vector(unsigned(a) rol n); 
end function; 

这里的综合代码:

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.numeric_std.all; 

entity proj is 
    port(
    i_clock : in std_logic 
    ); 
end proj; 

architecture main of proj is 

function rol_custom (a: std_logic_vector; n : natural) 
       return std_logic_vector is 
begin 
return std_logic_vector(unsigned(a) rol n); 
end function; 

signal rownum : std_logic_vector(2 downto 0); 
signal rowcount : std_logic_vector(2 downto 0); 

begin 

process begin 
wait until rising_edge(i_clock); 
rownum<=rol_custom(rowcount,1); 

end process; 

end architecture main; 

然而,即使现在应该综合,结果将没有任何意义,因为行数并没有被赋予了价值。为了定义它,您可能需要添加一个基于特定条件(计数器?)来驱动信号的进程,或者将其作为输入添加到实体定义中。

0

如果您的向量代表数字,您应该为它们使用数字类型。根据需要使用ieee.numeric_std库和unsignedsigned类型。然后rol就会工作。你不需要创建自己的。