реклама на сайте
подробности

 
 
> Операция "И" над вектором и битовой переменной
seldim
сообщение Apr 2 2012, 15:50
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 96
Регистрация: 2-04-12
Из: Саратов
Пользователь №: 71 142



Недавно начал осваивать VHDL и столкнулся с несколькими проблемами:

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

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

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

Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 7)
Postoroniy_V
сообщение Apr 2 2012, 16:02
Сообщение #2


МедвеД Инженер I
****

Группа: Свой
Сообщений: 816
Регистрация: 21-10-04
Пользователь №: 951



Цитата(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;


--------------------
Cogito ergo sum
Go to the top of the page
 
+Quote Post
seldim
сообщение Apr 2 2012, 17:07
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 96
Регистрация: 2-04-12
Из: Саратов
Пользователь №: 71 142



Спасибо попробую все применить.
Go to the top of the page
 
+Quote Post
Hoodwin
сообщение Apr 2 2012, 19:02
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 881
Регистрация: 21-03-10
Из: _// \\_
Пользователь №: 56 107



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 при этом останется.
Go to the top of the page
 
+Quote Post
seldim
сообщение Apr 3 2012, 02:54
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 96
Регистрация: 2-04-12
Из: Саратов
Пользователь №: 71 142



А оператор For должен применяться только в процедуре?
Go to the top of the page
 
+Quote Post
Hoodwin
сообщение Apr 3 2012, 04:25
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 881
Регистрация: 21-03-10
Из: _// \\_
Пользователь №: 56 107



Оператор for можно применять много где. Конструкция for ... loop ... end loop; может применяться при описании процедур, функций и просто процессов. Конструкция for ... generate ... end generate; может применяться прямо в архитектуре.

Вообще смотрите на for как на способ компактной записи нескольких выражений, которые отличаются только числовым параметром.
Go to the top of the page
 
+Quote Post
bark
сообщение Apr 10 2012, 11:31
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 131
Регистрация: 16-11-09
Из: Украина Юг
Пользователь №: 53 659



Для примера как это реализовалось бы в 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


--------------------
Работаю 20ns в сутки.
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Apr 11 2012, 04:29
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(bark @ Apr 10 2012, 14:31) *
Для примера как это реализовалось бы в Verilog:
В VHDL начиная с 2008 аналогичное этому уже есть.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 04:00
Рейтинг@Mail.ru


Страница сгенерированна за 0.0141 секунд с 7
ELECTRONIX ©2004-2016