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

Форматное присваивание VERILOG HDL.

ПРОБЛЕМА:

 

Хочется сделать следующее: присвоить переменной результат операции из середины результирующего вектора (после деления).

пока мысли такие:

 

reg [13:0] empty1;

reg [2:0] empty2;

reg [7:0] result;

always ... begin

...

 

{empty1[13:0], result[7:0],empty2[2:0]} <= period_[24:0] / cnt_reg[13:0];

 

end

 

использование EMPTY* конечно решает проблему, но как–то некрасиво получается. Может есть более красивый способ?

VERILOG 95/2001 ???

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


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

/****************************************************/

reg [24:0] result_9to3 ;

 

always ... begin

...

 

result_9to3 [24:0] <= period_[24:0] / cnt_reg[13:0] ;

...

<result of some operator> = <some operatior> result_9to3 [ 9:3 ]

...

end

/****************************************************/

 

Тоже не очень красиво. Но как вариант.

Ещё можно попробывать так.

 

/****************************************************/

reg [ 24:0 ] temp_result ;

reg [ 7:0 ] part_result ;

 

always ... begin

...

temp_result[24:0] <= period_[24:0] / cnt_reg[13:0] ;

part_result [ 7:0 ] = temp_result [ 9:3 ] ;

...

end

/****************************************************/

 

А зачем неблокирующее присваивание?

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


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

Мда... Хороши однако способы.. Все равно как–то коряво ;)

Ладно, видимо по другому и никак.

 

А почему такое присваивание? ;) Да по виду процесса так надо...

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


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

Поясни.

Что значит по виду процесса?

 

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

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


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

Несовсем и не всегда так как ты говоришь!

 

Например при синтезе неблокирующее назначение в процессе активном по фронту приводит к результату синтеза типа ТРИГГЕР. Блокирующее... ну тоже может, однако чаще всего оно может привести к неожиданностям с синтезом дополнительной (ненужной) комбинаторики...

 

Просто это мой стиль: для реализации последовательностой логики – использовать _только_ неблокирующие назначения, для реализации сложной комбинаторики – иногда блокирующие...

 

А вообще я в душе блокирующие назначения – ненавижу... ;)

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


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

ПРОБЛЕМА:

 

Хочется сделать следующее: присвоить переменной результат операции из середины результирующего вектора (после деления).

пока мысли такие:

 

reg [13:0] empty1;

reg [2:0] empty2;

reg [7:0] result;

always ... begin

...

 

{empty1[13:0], result[7:0],empty2[2:0]}  <= period_[24:0] / cnt_reg[13:0];

 

end

Чтобы я написал бы вместо

{empty1[13:0], result[7:0],empty2[2:0]} <= period_[24:0] / cnt_reg[13:0]; ?

Так это

{14'hxxxx, result[7:0],3'hx]} <= period_[24:0] / cnt_reg[13:0];

Да и то поместил бы это в функцию, а функцию - в always блок:

always ... begin

...

 

result[7:0] <= div_function (period_,cnt_reg);

 

end

Если result[7:0] вычисляется так неоднократно, то применение функции оправдывается.

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


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

Спасибо, не знал что можно так всех обмануть:

{14'hxxxx, result[7:0],3'hx]} <= period_[24:0] / cnt_reg[13:0];

 

... а на {14'hXXXX...}

в левой части точно ни кто не ругается?

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


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

... а на {14'hXXXX...}

в левой части точно ни кто не ругается?

 

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

 

Например на

x=x+1

 

синтезатор всегда напоминает что один бит отреал, ну и пусть с ним...

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


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

Для небольших проектов – действиетольно ничего,

а вот если таких предушреждений много – тяжело...

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

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


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

Можно предложить использовать сдвиги, на мой вкус наиболее просто и наглядно:

 

reg [7:0] result;

always ... begin

...

 

result[7:0] <= (period_[24:0] / cnt_reg[13:0]) >> 3;

 

end

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


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

... а на {14'hXXXX...}

в левой части точно ни кто не ругается?

К сожалению, ругается, и я должен извиниться за неверное решение - присваивание значения неименованным разрядам не проходит. Верное решение, как уже предлагалось cdg, - это сдвиг вправо на число разрядов empty2; в этом случае синтезатор возьмёт при присваивании именно с нужного места в правой части, обрезав разряды старше присваивающего идентификатора. Можно "спрятать" сам сдвиг простейшим образом:

 

`define format /8

...

reg [7:0] result;

always ... begin

...

result[7:0] <= (period_[24:0] / cnt_reg[13:0])`format;

 

end

Само собой, 2**3=8, где 3 - разрядность empty2.

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


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

Ну можно сделать в функции, чтобы небыло warnings:

<PRE>

define MaxLength 10000000000;//в общем столь много, сколь хочется B)

 

function BitExtract;

input [`MaxLength:0] InVector;

input integer NumBitPosition;

 

BitExtract = InVector >> num_bit_position;

endfunction

 

assign bit_select = bit_extract(AAA[255:0],149);

</PRE>

 

Проще выключить warnings такого типа :cheers: .

 

По крайней мере странно, что даже с <PRE> ... </PRE> исходное форматирование тектса портится :bb-offtopic:

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


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

Объяснили, надо [_code] ... [/_code] использовать без _, проверим

 

  define MaxLength 10000000000;//в общем столь много, сколь хочется  

 function BitExtract;
            input [`MaxLength:0] InVector;
            input integer NumBitPosition; 
 
            BitExtract = InVector >> num_bit_position;
 endfunction 

 assign bit_select = bit_extract(AAA[255:0],149);

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


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

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

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

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

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

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

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

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

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

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