Перейти к содержанию
    

Реверсировать порядок бит

Добрый день

 

как в VHDL присвоить значение одного вектора с инверсным порядком бит другому вектору

Изменено пользователем _zx_

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Совет: давайте теме осмысленное название.

как в VHDL пристоить ИНВЕРСНОЕзначение одного вектора другому вектору(т.е. поменять местами порядокбит в векторе)

Это не т. е. Это разные операции. Инверсноезначение --- это результат функции not. Для того, что вам нужно,готовой функции в стандартной библиотеке нет. Когда мне такое надо было, я написал свою. Ловите:

-- reverse bit order
function Reverse(constant X : in std_logic_vector) return std_logic_vector is
alias alX  : std_logic_vector(X'length - 1 downto 0) is X;
variable Y : std_logic_vector(alX'range);
begin
       for i in alX'range loop
               Y(i) := alX(alX'left - i);
       end loop;

       return Y;
end;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что в VHDL нельзя написать также просто как в Verilog?

 

B[3:0] <= A[0:3]

///////////////////////

И в верилоге это не имеет смысла.

Нужно всегда придерживаться одного вида разрядности старший младший.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И в верилоге это не имеет смысла.

Нужно всегда придерживаться одного вида разрядности старший младший.

 

Ну человеку очень хочется/надо

Синтезатор поругается но сделает

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

LIBRARY IEEE;
    USE IEEE.std_logic_1164.all;

ENTITY conv IS
PORT(  
       A : in std_logic_vector(7 downto 0);
       B : out std_logic_vector(0 to 7)
     );
END conv;

ARCHITECTURE rus OF conv IS
BEGIN

   B <= A;

END rus;

Только смысла в этом мало. Это примерно как пиво из одного ящика переставлять в другой, вместо того, чтобы его пить (тем более в такую жару) :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только смысла в этом мало. Это примерно как пиво из одного ящика переставлять в другой, вместо того, чтобы его пить (тем более в такую жару)//////

Истину глаголите. Потом все равно придется делать преобразование.

А вот пример того как получить результат, которого не ожидаешь:

 

 

module a

(

input [0:3] dcr_addr_mask,

input [3:0] DCR_ABus_l,

output dcr_valid

);

 

parameter C_DCR_BASEADDR = 4'ha;

 

assign dcr_valid = (dcr_addr_mask & C_DCR_BASEADDR) == (DCR_ABus_l & dcr_addr_mask);

 

endmodule

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что в VHDL нельзя написать также просто как в Verilog?

 

B[3:0] <= A[0:3]

B[3:0] <= A[0:3]

///////////////////////

а помоему вполне съест такое

 

Вы будете очень смеяться, но я сам думал, что так писать можно, пока однажды не столкнулся (в Верилоге) с реальной необходимостью заюзать сию конструкцию.

Так вот - синтезатором был послан далеко и надолго.

Низзя так писать.

Если вы задали вектор как

wire [15:0] ddd;

то писать потом

ddd[0:15]

неправомерно

 

ЗЫ: cинтезатор XST от комплекта ISE6.1 (юзаю ка кудобный редактор - по сравнению с 8кой он не тормозит так жутко)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2andrew_b:

А зачем сложности с alias и constant,

а почему не попроще:

-- reverse bit order
function Reverse(X : in std_logic_vector) return std_logic_vector is
variable Y : std_logic_vector(X'range);
begin
    for i in X'range loop
        Y(i) := X(X'left - i);
    end loop;
   return Y;
end;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2andrew_b:

А зачем сложности с alias и constant,

Про constant: просто так. Привычка.

Если вы заметили, то указан еще и in для параметра. Хотя этого не надо. У функции все параметры входные. Можно убрать.

 

Использование псевдонима позволяет задать порядок индексации (в данномслучае -- descending) объектов, используемых внутри функции, независимоот порядка индексации фактического параметра при вызове функции(подробности см. ниже), а также установить левую границу этих самых внутренних объектов равной 0.

 

а почему не попроще

На первый взгляд да, ваш вариант проще. Но. Есто одно но, делающее вашу функцию не универсальной. Представьте,что ваша функция вызывается для сигнала, определенного так:

signal X : std_logic_vector(0 to 7);

Индексация восходящая (ascending). При этом получается X'left=0. При заходе в цикл получаем:

  -- цикл 0 to 7
  -- первая итерация
  Y(0) := X(0 - 0); -- уже неправильно
  -- вторая итерация
  Y(1) := X(0 - 1); -- тем более неправильно -- выходим за границы массива

Могу предложить два варианта патча на вашу функцию:

1. Использовать в цикле X'high вместо X'left.

2. Использовать для определения пременной Y атрибут 'reverse_range вместо 'range и тело цикла упростить до

Y(i) := X(i);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что в VHDL нельзя написать также просто как в Verilog?

 

B[3:0] <= A[0:3]

B[3:0] <= A[0:3]

///////////////////////

а помоему вполне съест такое

 

Вы будете очень смеяться, но я сам думал, что так писать можно, пока однажды не столкнулся (в Верилоге) с реальной необходимостью заюзать сию конструкцию.

Так вот - синтезатором был послан далеко и надолго.

Низзя так писать.

Если вы задали вектор как

wire [15:0] ddd;

то писать потом

ddd[0:15]

неправомерно

 

ЗЫ: cинтезатор XST от комплекта ISE6.1 (юзаю ка кудобный редактор - по сравнению с 8кой он не тормозит так жутко)

 

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

Если так то регистр A[3:0] нужно воспринимать как временный заданный как wire|reg [3:0] A

Те сделать присвоение через временый регистр/линию!!! Так даже по Вашему всё оk

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Если так то регистр A[3:0] нужно воспринимать как временный заданный как wire|reg [3:0] A

Те сделать присвоение через временый регистр/линию!!! Так даже по Вашему всё оk

 

не могу тут согласиться:

вот представьте что вам надо разработать такой блок, оформив его как module

реальный пример - бит-реверсивная адресация для БПФ.

input [3:0]a;

output [3:0]b;

и какие бы внутренние wire не вводить, исхитряясь - операцию дающую в итоге "B[3:0] <= A[0:3]" без доп-х манипуляций не получить

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

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

Если так то регистр A[3:0] нужно воспринимать как временный заданный как wire|reg [3:0] A

Те сделать присвоение через временый регистр/линию!!! Так даже по Вашему всё оk

 

не могу тут согласиться:

вот представьте что вам надо разработать такой блок, оформив его как module

реальный пример - бит-реверсивная адресация для БПФ.

input [3:0]a;

output [3:0]b;

и какие бы внутренние wire не вводить, исхитряясь - операцию дающую в итоге "B[3:0] <= A[0:3]" без доп-х манипуляций не получить

Да чего то я поверхностно последнее прикинул...

Сейчас на проверялся - Verilog 2001 в одну строчку не может переварить :( :( :(

А в AHDL это было очень удобно :a14:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...