2013-06-23 191 views
1

有一些VHDL代码我正在经历的决赛,并遇到一些混乱的语法。我知道这是因为类型的差异,但并不真正了解发生了什么。 我只张贴代码的相关部分和库使用VHDL,混淆语法“”&

USE ieee.std_logic_1164.ALL; 
USE ieee.numeric_std.ALL; 

count : IN std_logic; 
SIGNAL qi : unsigned(w downto 0); 

qi <= qi + ("" & count); 

基本上我的问题是,什么是“‘’&”,不串联与“”做一个自动转换为其他类型?

在此先感谢

编辑类型转换的混乱

原因,这里的代码

LIBRARY ieee; 
USE ieee.std_logic_1164.ALL; 
USE ieee.numeric_std.ALL; 

ENTITY counter_alt IS 
GENERIC (w : integer := 8); 
PORT (clk, load, count : IN std_logic; 
     d : IN unsigned(w-1 downto 0); 
     q : OUT unsigned(w-1 downto 0); 
     co : OUT std_logic); 
END counter_alt; 


ARCHITECTURE bhv OF counter_alt IS 
SIGNAL qi : unsigned(w downto 0); 

BEGIN 
    PROCESS(clk) 
     BEGIN 
     IF rising_edge(clk) THEN 

     IF load='1' THEN 
     qi <= '0' & d; 
     ELSE qi <= qi + ("" & count); 
     END IF; 
     END IF; 

    END PROCESS; 
q <= qi(w-1 downto 0); 
co <= qi(w); 
END bhv; 
+0

你肯定这些都是相关的库,还是有一些更像'ieee.std_logic_unsigned.all'? – damage

+0

该程序编译并运行与上述库 – hops1

回答

1

空字符串""是该上下文中的空无符号向量,因为包含USE ieee.numeric_std.ALL;,并且相关表达式涉及unsigned类型的信号。

因此,("" & count)的结果具有无符号类型,因此可以在没有任何其他类型转换的情况下使用。在这种情况下,带有""的concat充当隐式类型转换为无符号的。 “

+0

感谢您清除那 – hops1

+0

我不确定这是学问正确的...(“”&计数)的结果是一个std_logic_vector。我不确定编译器*是否应该允许你将它添加到未签名的目录中,但我现在已经远离了Modelsim。 –

+0

在我提交答案之前,我在ModelSim中尝试了这个表达式,所以你确实可以做'sl'='0'; slv_00 <=“”& sl; uns_00 <=“”& sl;'。 –

1

的其余部分通过连接一个空字符串""std_logic值返回std_logic_vector。如果在算术表达式中使用std_logic值,这会很有用。然后可以将得到的std_logic_vector铸造成所需的类型,例如, signedunsignedinteger ...
因此(为一个数为1个位宽相当无用),在例如类型转换应该仍然是需要的,因为VHDL确实没有自动类型转换从std_logic_vectorunsigned

+0

感谢您的答复,使现在更有意义。但是对于你关于类型转换的最后陈述。实际上我的想法很多,但其余代码中根本没有进行类型转换。这就是我实际上有点困惑的原因 – hops1

0

”“只是指定一个空字符串文字。通过将它与std_logic连接起来,它将成为基于std_logic的一些数组类型。由于使用无符号添加的“+”运算符仅支持无符号或自然类型的值(pre-vhdl-2008),因此字符串值将解析为无符号。

qi <= qi + "0101" ; 

采用VHDL-2008,你现在可以添加一个无符号与std_ulogic(并因此也STD_LOGIC):

同种类型的分辨率,当您添加一个字符串常量的值发生:

qi <= qi + count;