2013-06-23 2 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); 

В основном мой вопрос, что «„“&», делает конкатенацию с «» сделать автоматический преобразование в другой тип?

Заранее спасибо

EDIT

Причина путаницы преобразования типа вот остальная часть кода

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) имеет тип unsigned, поэтому его можно использовать дополнительно без какого-либо последующего преобразования типов. Конкат с "" служит неявным преобразованием типа в unsigned в этом случае.

+0

Спасибо за очищение, что – hops1

+0

Я не уверен, что это педантично правильно ... Результат («& count») - это std_logic_vector. Я не уверен, что компилятор * должен * позволить вам добавить это к unsigned ... но я сейчас далеко от Modelsim. –

+0

Выражение было опробовано в ModelSim, прежде чем я отправил ответ, так что вы действительно можете сделать 'sl <= '0'; slv_00 <= "" & sl; uns_00 <= "" & sl; '. –

1

Объединяя пустая строка "" к std_logic значению а std_logic_vector возвращается. Это может быть полезно, если значение std_logic должно использоваться в арифметическом выражении. Полученный в результате std_logic_vector затем может быть отлит до желаемого типа, например. signed (совершенно бесполезны для числа, которое является 1 битой шириной), unsigned, integer ...
Таким образом, в вашем примере все еще должно быть необходимо приведение типа, поскольку VHDL не делает автоматическое преобразования типа из std_logic_vector в unsigned.

+0

Спасибо за ответ, теперь имеет немного больше смысла. Но для вашего последнего заявления о преобразовании типов. Я на самом деле так много думал, но в остальном коде нет никакого преобразования типов. Вот почему я был на самом деле немного смущен – hops1

0

"" просто обозначает нулевой строковый литерал. Объединяя его с std_logic, он становится некоторым типом массива на основе std_logic. Поскольку оператор «+» для добавления без знака поддерживает только неподписанное или естественное типизированное значение (pre-vhdl-2008), строковое значение разрешается без знака.

Такая же разрешения типа происходит при добавлении с буквальным значением строки:

qi <= qi + "0101" ; 

С VHDL-2008, теперь вы можете добавить беззнаковое с std_ulogic (и, как следствие, также std_logic):

qi <= qi + count;