aosp 0 24 августа, 2004 Опубликовано 24 августа, 2004 · Жалоба ПРОБЛЕМА: Хочется сделать следующее: присвоить переменной результат операции из середины результирующего вектора (после деления). пока мысли такие: 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 ??? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
emerg_reanimator 0 1 ноября, 2004 Опубликовано 1 ноября, 2004 · Жалоба /****************************************************/ 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 /****************************************************/ А зачем неблокирующее присваивание? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aosp 0 1 ноября, 2004 Опубликовано 1 ноября, 2004 · Жалоба Мда... Хороши однако способы.. Все равно как–то коряво ;) Ладно, видимо по другому и никак. А почему такое присваивание? ;) Да по виду процесса так надо... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
emerg_reanimator 0 1 ноября, 2004 Опубликовано 1 ноября, 2004 · Жалоба Поясни. Что значит по виду процесса? Различие между блокирующем и неблокирующем присваиванием начинаеться полсе использования присваиваний с временной задержкой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aosp 0 2 ноября, 2004 Опубликовано 2 ноября, 2004 · Жалоба Несовсем и не всегда так как ты говоришь! Например при синтезе неблокирующее назначение в процессе активном по фронту приводит к результату синтеза типа ТРИГГЕР. Блокирующее... ну тоже может, однако чаще всего оно может привести к неожиданностям с синтезом дополнительной (ненужной) комбинаторики... Просто это мой стиль: для реализации последовательностой логики – использовать _только_ неблокирующие назначения, для реализации сложной комбинаторики – иногда блокирующие... А вообще я в душе блокирующие назначения – ненавижу... ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
emerg_reanimator 0 2 ноября, 2004 Опубликовано 2 ноября, 2004 · Жалоба Не очень понятно :huh: , но всё равно спасибо за ответ ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
cyclop 0 8 февраля, 2005 Опубликовано 8 февраля, 2005 · Жалоба ПРОБЛЕМА: Хочется сделать следующее: присвоить переменной результат операции из середины результирующего вектора (после деления). пока мысли такие: 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 <{POST_SNAPBACK}> Чтобы я написал бы вместо {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] вычисляется так неоднократно, то применение функции оправдывается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aosp 0 9 февраля, 2005 Опубликовано 9 февраля, 2005 · Жалоба Спасибо, не знал что можно так всех обмануть: {14'hxxxx, result[7:0],3'hx]} <= period_[24:0] / cnt_reg[13:0]; ... а на {14'hXXXX...} в левой части точно ни кто не ругается? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexf 0 9 февраля, 2005 Опубликовано 9 февраля, 2005 · Жалоба ... а на {14'hXXXX...} в левой части точно ни кто не ругается? <{POST_SNAPBACK}> Даже если вообще ничего не написать слева, синтезатор скажет что результат обрезан, но все сделает нормально. Например на x=x+1 синтезатор всегда напоминает что один бит отреал, ну и пусть с ним... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aosp 0 9 февраля, 2005 Опубликовано 9 февраля, 2005 · Жалоба Для небольших проектов – действиетольно ничего, а вот если таких предушреждений много – тяжело... Приходтся каждый раз вникать в проблему. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
cdg 0 10 февраля, 2005 Опубликовано 10 февраля, 2005 · Жалоба Можно предложить использовать сдвиги, на мой вкус наиболее просто и наглядно: reg [7:0] result; always ... begin ... result[7:0] <= (period_[24:0] / cnt_reg[13:0]) >> 3; end Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
cyclop 0 13 февраля, 2005 Опубликовано 13 февраля, 2005 · Жалоба ... а на {14'hXXXX...} в левой части точно ни кто не ругается? <{POST_SNAPBACK}> К сожалению, ругается, и я должен извиниться за неверное решение - присваивание значения неименованным разрядам не проходит. Верное решение, как уже предлагалось 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
cdg 0 14 февраля, 2005 Опубликовано 14 февраля, 2005 · Жалоба Ну можно сделать в функции, чтобы небыло 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: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
cdg 0 14 февраля, 2005 Опубликовано 14 февраля, 2005 · Жалоба Объяснили, надо [_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); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться