2013-07-29 3 views
0

пытаются имитировать Verilog поведения относительно битовых операций (что означает - операцию, которая работает на все биты вектора и выход 1 битого ответVHDL операции побитовых на векторе

пример:.

use ieee.std_logic_1164.all; 
use ieee.std_logic_unsigned.all; 
... 
signal vect : std_logic_vector (length -1 downto 0); 
signal ans : std_logic; 
signal addin : std_logic; 

когда Vect = все '0' я буду хотеть анс быть '1' (ни)

при Vect = все '1' я буду хотеть анс быть '1' (и)

когда Vect = даже num '1' я хочу анс быть «1» (XOR) и т.д.

я сделал следующие функции (только один показан здесь):

function vand (vect :std_logic_vector) return std_logic is 
    variable temp : std_logic; 
begin 
    temp := '1'; 
    for I in (vect'length -1) downto 0 loop 
    temp := temp and vect(I); 
    end loop; 
    return temp; 
end; 

эта функция должна дать «И» на всех битах. , вот, сюда приходят мои вопросы:

a. есть ли более простой способ сделать такие операции?

b. Я использую Vand так, как это if Vand(vect & addin) = '1' do something..., но когда vect является «0H», а addin - «H», условие заполнено, и я понятия не имею, почему. может кто-нибудь подумать, почему этот вид операции проблематичен? функция ведет себя в других случаях, но здесь я протестировал ее для быстрого иммунитета и получил это нежелательное поведение.

редактировать

я не знаю длину вектора «Vect» или «вектор VECT & надстройки».

редактировать 2

решить вторую проблему, создав функцию Vand(vect : std_logic_vector; b: std_logic) юга, который использует оригинальную Vand (и нашел ошибку в моем Vnor по пути). все еще надеясь на лучшее решение, чем эти две функции.

ответ

1

Есть функции, называемые or_reduce и and_reduce, которые делают то, что вы хотите. Они также называют to_X01 на входах, что означает, что H и L s будут преобразованы в 1 и 0.

Они могут быть найдены в std_logic_misc для std_logic_vector с и предложены для следующей оборот в VHDL для ieee.numeric_std для signed и unsigned векторов.

VHDL-2008 также позволяет этот синтаксис на std_logic_vector с:

anded <= and v; 
ored <= or v; 
+0

Пробовал найти, например, 'or_reduce' в моем локальном numeric_std, но может найти только что-нибудь в Synopsys std_logic_misc; любое предложение о том, где искать? –

+2

@MortenZdk - я не смог найти никаких логических операторов сокращения в http://standards.ieee.org/downloads/1076/1076.2-1996/ или http://standards.ieee.org/downloads/1076/1076-2008/(Дополнительный материал IEEE-SA). Я нашел их в библиотеках Synopsys ghdl, в частности std_logic_misc. Их также можно найти в Дэвиде Бишопсе, где предлагаются математические расширения (http://www.vhdl.org/fphdl/), http://www.vhdl.org/fphdl/numeric_std_additions.vhdl, http: //www.vhdl. org/fphdl/numeric_std_additions.html (Руководство пользователя). Предлагается для VHDL-201X. – user1155120

+0

@Koontz: Спасибо за отзыв и ссылки IEEE :-) –

Смежные вопросы