Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Операция "И" над вектором и битовой переменной
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
seldim
Недавно начал осваивать VHDL и столкнулся с несколькими проблемами:

1. есть переменная sts_logik_vector на 25 разрядов и битовая переменная logik_vector. Необходимо провести логическую операцию ("и" или "или" и.т.д.) между каждым разрядом вектора и битовой переменной. Как это сделать оптимально, минимальным кодом? Очень не хочется разбивать вектор на отдельные биты.

2. есть переменная sts_logik_vector на 25 разрядов. Как оказалось 25 цифра не хорошая, т.к. если необходимо присвоить константу то приходитсь писать чтото типа led_in [24 downto 0] <= '0000000000000000000111111'
в хексе присвоть не получается так как не совпадает количество бит. Можно ли упростить форму записи таких присваений?

3. никак не могу понять можно ли синтезировать в Плис оператор for и как это правильно делать если он синтезируемый?

Postoroniy_V
Цитата(seldim @ Apr 3 2012, 00:50) *
Недавно начал осваивать VHDL и столкнулся с несколькими проблемами:

1. есть переменная sts_logik_vector на 25 разрядов и битовая переменная logik_vector. Необходимо провести логическую операцию ("и" или "или" и.т.д.) между каждым разрядом вектора и битовой переменной. Как это сделать оптимально, минимальным кодом? Очень не хочется разбивать вектор на отдельные биты.

2. есть переменная sts_logik_vector на 25 разрядов. Как оказалось 25 цифра не хорошая, т.к. если необходимо присвоить константу то приходитсь писать чтото типа led_in [24 downto 0] <= '0000000000000000000111111'
в хексе присвоть не получается так как не совпадает количество бит. Можно ли упростить форму записи таких присваений?

3. никак не могу понять можно ли синтезировать в Плис оператор for и как это правильно делать если он синтезируемый?

1)можно использовать либу reduce
http://www.vhdl.org/vhdlsynth/vhdl/reduce_pack.vhd
2) led_in<= '0' & x"00_0000"; 1+8+16 бит
3)
Код
signal data_or25:std_logic;
signal data_or:std_logic;
signal data:std_logic_vector(24 downto 0);
.....
begin

process(clk)
var  x:std_logic;
begin
        if clk'event and clk='1' then
               x :=  data_or;
               for i in 0 to 24 loop
                     x := x or data(i);
               end loop;
              data_or25 <= x;
        end if;
end process;
seldim
Спасибо попробую все применить.
Hoodwin
1) в зависимости от задачи можно по разному оптимально написать:
Код
signal a : std_logic;
signal u : std_logic_vector(24 downto 0);
signal y : std_logic_vector(24 downto 0);
signal z : std_logic_vector(24 downto 0);

-- a OR u
y <= (others=>'1') when a='1' else u;

-- a AND u
z <= (others=>'0') when a='0' else u;


2) Для этих целей есть функция conv_std_logic_vector;
Код
signal v : std_logic_vector(24 downto 0);

v <= conv_std_logic_vector( 16#1ABCDEF#, 25 );


Также советую Вам поизучать типы UNSIGNED и SIGNED. Это надстройка над std_logic_vector, которая понимает арифметические операции. Например, добавить к std_logic_vector единицу нельзя, так как это просто массив битов, над которым не определена схема представления целых чисел, ну то есть операции сложения и вычитания. А над UNSIGNED и SIGNED определены такие операции. Для UNSIGNED будет что-то типа такого:
Код
signal u : UNSIGNED(24 downto 0);

u <= TO_UNSIGNED( 16#1ABCDEF#, 25 );


3) Да, оператор for можно синтезировать, если на этапе синтеза можно вычислить все выражения, зависящие от итератора цикла. Ну или попросту, представьте себе, что транслятор просто N раз запишет все операторы внутренностей цикла, заменив в них итератор конкретным значением. В тех случаях, когда синтезатору цикл не нравится, его обычно можно переписать в другом виде, который будет синтезируемым. Но for при этом останется.
seldim
А оператор For должен применяться только в процедуре?
Hoodwin
Оператор for можно применять много где. Конструкция for ... loop ... end loop; может применяться при описании процедур, функций и просто процессов. Конструкция for ... generate ... end generate; может применяться прямо в архитектуре.

Вообще смотрите на for как на способ компактной записи нескольких выражений, которые отличаются только числовым параметром.
bark
Для примера как это реализовалось бы в Verilog:

1. Присваивание.
reg [24:0] var ; // 25 битная регистровая переменная

варианты присвоения:
HEX
var <= 25'd23_799_994 ;
DEC
var <= 25'h16B_28BA ;
BIN
var <= 25'b1_0110_1011_0010_1000_1011_1010 ;

подчеркивание можно использовать как разделитель для удобства.

2. Побитные операции.
Это свёртывающая операция между всеми битами выражения. Записывается так:

wire var_or = |var ;
wire var_and = &var ;
wire var_xor = ^var ;

в итоге линия var_or будет содержать побитный OR регистра var.
аналогично с AND и XOR
andrew_b
Цитата(bark @ Apr 10 2012, 14:31) *
Для примера как это реализовалось бы в Verilog:
В VHDL начиная с 2008 аналогичное этому уже есть.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.