我不明白我应该做什么。
这是我的代码:
use ieee.std_logic_1164.all;
use ieee.numeric_std.all ;
use ieee.std_logic_signed .all ;
entity M is
port(
clk : in std_logic ;
rst : in std_logic ;
data : in std_logic_vector(1 downto 0);
CD : in std_logic_vector(3 downto 0);
s : out std_logic_vector (1 downto 0));
end entity ;
architecture beh of M is
signal com :std_logic_vector(3 downto 0);
begin
code :process(clk,rst)
begin
if (rst='1') then
(others=>'0')<=data;
--data<='0' !!! ;
(others=>'0')<=CD;
--"0000"<=CD ;
s <=(others=>'0');
else
for i in 0 to 3 loop
if (clk'event and clk='1')then
--for i in 0 to 3 loop
com(i)<= not(CD(i)xor(data) ) ;
--s<=not(CD(i) xor (data));
end if ;
end loop ;
end if ;
end process ;
s<=com(i) ;
end architecture ;
这是我的问题:
错误(10476):M.vhd(39)处的VHDL错误:标识符“data”的类型 不同意其用作“std_ulogic”类型
答案 0 :(得分:0)
一些问题。首先,您的赋值运算符<=
应始终位于所分配信号的右侧。对于这些行:
(others=>'0')<=data;
(others=>'0')<=CD;
将其更改为:
data <= (others=>'0');
CD <= (others=>'0')
同样如N8TRO建议的那样,你不能在矢量输入上使用xor。您需要单独访问每一位数据。
正如BrianDrummond所指出的,分配符号是:=
和<=
答案 1 :(得分:0)
com(i)<= not(CD(i)xor(data) )
data
是2位宽 - 您希望编译器与data
的单个位进行XOR CD(i)
吗?
正如评论中所指出的,VHDL2008以两种方式支持XORing向量:
这两者都与顶部的代码完全匹配......
答案 2 :(得分:0)
您的代码存在多个问题。请看Martin和Russell对更关键的答案。另外:
您应该按照注释的方式颠倒for循环的顺序和流程中的if (clk'event ...
语句。即:
if rst = '1' then
...
elsif clk'event and clk = '1' then
for i in 0 to 3 loop
...
end loop;
end if;
它可能会以另一种方式起作用,但它是非标准的。
无论哪种方式,i
都不在您尝试在流程外使用它的范围内(在s<=com(i);
语句中)。如果您想将com
直接分配给s
,则可以写s <= com;
。如其他答案所示,您的xor
语句的向量宽度存在一些问题,因此我不确定您的意图是什么。
正如其他地方所提到的那样,您看到的错误告诉您,您正在尝试将data
(2位向量)与运算符(xor
)一起使用,该运算符需要一位(例如,std_ulogic
)。我已经在这个问题的其他地方提出了一个问题,准确地指出什么是合法的,哪些是不合法的,尤其是VHDL-2008(免责声明,我大多只是挑剔),但即使你使用的是VHDL-2008 (该错误似乎表明您不是),操作的结果将是一个向量,并且您尝试将其分配给单个位(com(i)
)。如何修复此行取决于您对代码的意图。