我正在为我的学校工作做这个,我正在制作自己的滚动/移位功能。 下面是我写的代码,但是当我尝试编译它时,我在rownum上得到语法错误< = rol(rowcount,1);
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;
答案 0 :(得分: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;
然而,即使现在应该合成,结果也没有任何意义,因为rowcount没有给出值。为了定义它,您可能希望添加一个根据特定条件(计数器?)驱动信号的过程,或者将其添加为实体定义中的输入。
答案 1 :(得分:0)
如果矢量代表数字,则应使用数字类型。根据需要使用ieee.numeric_std
库和unsigned
或signed
类型。然后rol
才能正常工作。您不必创建自己的。