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

Не Работает Сдвиговый Регистр В Верилог


Leo

Рекомендуемые сообщения

Хотел спросить насчет сдвигового регистра я взял на сайте альтеры пример но он что то не заработал

www.altera.com/support/examples/verilog/verilog.html

www.altera.com/support/examples/verilog/ver-1x64-shift-reg.html

module shift_1x64 (clk,

shift,

sr_in,

sr_out,

);

input clk, shift;

input sr_in;

output sr_out;

reg [63:0] sr;

always@(posedge clk)

begin

if (shift == 1'b1)

begin

sr[63:1] <= sr[62:0];

sr[0] <= sr_in;

end

end

assign sr_out = sr[63];

endmodule

Тут есть какие то тонкости он не заполняет данными регистр и не передает данные на вывод и данные он должен выводить сразу как они обновились или в конце когда полностью заполнен регистр [63:0] sr;

Пример простой но почему то не работает. Хотя что то похожее видел в примерах у других.

Запускал с простым тест бэнчем данные приходят но в регистр не записываются.

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

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

  • Ответов 144
  • Создана
  • Последний ответ

Топ авторов темы

Топ авторов темы

Изображения в теме

Всё тут работает. Данные на выходе появятся после заполнения регистра sr[63:0].

Видишь это assign sr_out = sr[63]; - на выход идёт последний бит. А тут sr[0] <= sr_in; - заполнение регистра начинается с первого бита.

Покажи свой тестбенч, возможно в нём у тебя ошибка. Может ты клок не подал или shift не поставил в 1.

Изменено пользователем Vascom
Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Привел всё сразу со всеми изменениями которые внес. Что не так не понятно.

module counter (

shift,

clk,

sr_in,

sr_out3

);

input shift,clk;

input wire [7:0]sr_in;

output [7:0] sr_out3;

reg [31:0]sr;

always @ (posedge clk)

begin

if (shift == 1'b1)

begin

sr[31:1] <= sr[30:0];

sr[0] <= sr_in;

$display("%d",sr[n]);

end

end

assign sr_out3 = sr[31];

initial

$monitor($stime,, shift,, clk,,, sr_out3, sr_in );

endmodule

module test_counter;

reg shift,clk;

reg [7:0]sr_in;

wire [7:0] df1,df4;

counter counter_inst(shift,clk,sr_in,

df1,df4);

always

#10 clk = ~clk;

initial

begin

clk = 0;

shift = 0;

sr_in=8'h00;

#10;

@(posedge clk)

#0

begin

shift = 1;

sr_in=8'h55;

end

@(posedge clk)

#0

begin

shift = 0;

sr_in=8'h00;

end

#10;

@(posedge clk)

#0

begin

shift = 1;

sr_in=8'h56;

end

@(posedge clk)

#0

begin

shift = 0;

sr_in=8'h00;

end

#10;

@(posedge clk)

#0

begin

shift = 1;

sr_in=8'h53;

end

@(posedge clk)

#0

begin

shift = 0;

sr_in=8'h00;

end

#10;

@(posedge clk)

#0

begin

shift = 1;

sr_in=8'h51;

end

@(posedge clk)

#0

begin

shift = 0;

sr_in=8'h00;

end

end

initial

begin

#200 $finish;

end

initial

begin

$dumpfile("out.vcd");

$dumpvars(0,test_counter);

end

endmodule

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

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Внеси это в тег "Код" пожалуйста.

Ну и сразу видны ошибки у тебя:

input wire [7:0]sr_in;
sr[0] <= sr_in;

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

Изменено пользователем Vascom
Ссылка на комментарий
Поделиться на другие сайты

Из этого я делаю вывод что sr[7] и смещение sr[31:1] <= sr[30:0]; тоже переделываю

if (shift == 1'b1)

begin

sr[31:1] <= sr[30:0];

sr[0] <= sr_in;

на

if (shift == 1'b1)

begin

sr[31:1] <= sr[23:0];

sr[7] <= sr_in;

Изменение есть но результата нет.

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

Должно быть

sr[31:8] <= sr[23:0];
sr[7:0] <= sr_in;

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

И на выход у тебя идёт лишь один старший бит assign sr_out3 = sr[31];

Если ты хочешь все 8 бит на выходе иметь, то сделай

assign sr_out3 = sr[31:24];
Изменено пользователем Vascom
Ссылка на комментарий
Поделиться на другие сайты

Как хорошо не много просветлело и заработало. Но мне попался ещё один сдвиговый регистр этот заработал почти сразу

sr <= { sr[31:0],sr_in };

но не очень ясно если разница с предыдущим вариантом

sr[31:8] <= sr[23:0]; sr[7:0] <= sr_in;

или это разнообразие в написании. Ещё хотел спросить насчет For вроде он не используется в коде при описании для микросхемы а только в тест бэнче?

Изменено пользователем Leo
Ссылка на комментарий
Поделиться на другие сайты

Это разнообразие в описании.

Причём вариант

sr <= { sr[31:0],sr_in };

написан неграмотно. Слева у нас 32-рязрядный регистр sr, а справа ему присваивается уже 40-разрядное значение. Конечно компилятор умный, он отбросит старшие 8 разрядов, но вдруг нет? Так что если уж писать в одну строку, то так:

sr <= { sr[23:0],sr_in };

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

For вполне можно использовать и для описания микросхемы. Иногда это позволяет сделать код более компактным.

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

Я решил попробовать цикл For

module counter (

shift,

clk,

sr_in,

sr_out,

sr_out1,

sr_out2,

sr_out3,

sr_out4

);

input shift,clk;

input wire [7:0]sr_in;

output [7:0]sr_out,sr_out1,sr_out2,sr_out3,sr_out4;

reg [7:0] sr [31:0];

integer n;

always @ (posedge clk)

if (shift == 1'b1)

begin

for (n = 31; n>0; n = n-1)

begin

sr[n] <= sr[n-1];

$display("%d",sr[n]);

end

sr[0] <= sr_in;

end

assign sr_out = sr[7];

assign sr_out1 = sr[15];

assign sr_out2 = sr[23];

assign sr_out3 = sr[31];

initial

$monitor($stime,, shift,, clk,,,sr_out, sr_in );

endmodule

[code]

module shift_8x64_taps (clk,

shift,

sr_in,

sr_out,

sr_tap_one,

sr_tap_two,

sr_tap_three,

);

input clk, shift;

input [7:0] sr_in;

output [7:0] sr_tap_one, sr_tap_two, sr_tap_three, sr_out;

reg [7:0] sr [63:0];

integer n;

always@(posedge clk)

begin

if (shift == 1'b1)

begin

for (n = 63; n>0; n = n-1)

begin

sr[n] <= sr[n-1];

end

sr[0] <= sr_in;

end

end

assign sr_tap_one = sr[15];

assign sr_tap_two = sr[31];

assign sr_tap_three = sr[47];

assign sr_out = sr[63];

endmodule

Но проблема таже не загружаются данные хотя пример обсолютно такой же.Только значения поменял.

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

Ты упорно пытаешься выходным многоразрядным шинами присваивать однобитовые значения.

Строй эпюры всех сигналов, и у видишь где у тебя проблемы.

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

При построении эпюр выходит что не загружается регистр.

sr[0] <= sr_in;

А изменить sr[0] на sr[7:0] не удается компилятор ругается. И

assign sr_out = sr[7]; 

на

assign sr_out = sr[7:0];

тоже.

Ведь при таком написании он заносит в регистр 8 бит.

Но проблема помойму в цикле For где n должно быть типа регистра я запутался.

Пример который я взял тоже работает с регистром а не содним сигналом?

И что значит построить все эпюры загрузка не идет и дальше нету результатов.

Изменено пользователем Leo
Ссылка на комментарий
Поделиться на другие сайты

Так sr_out у тебя же и есть 8 бит.

А вот за масситвы ты рано взялся. Это reg [7:0] sr [31:0]; тут совершенно ни к чему.

Ты всё слишком усложнил, не разобравшись с простейшим.

Выясняй почему регистр sr[0] не загружается. И не используй конструкции for без необходимости. Как видишь, это тут всё лишь усложняет.

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

Можно не много пояснений простой сдвиговый регистр у меня получился который был в самом начале он заполняется и выводит результат который указан assign sr_out = sr[7:0]; через него проходят все предидущие и в конце в нем остается что

нужно sr[7:0]. Я взял не удачный пример но он приводился как продолжение сдвигового регистра разделяя его на части регистр

с отводами наверное для более правельного чтения куска регистра.Хотя что то не так. Я хотел на примере понять как работает цикл For.Так много операторов что не понятно какой правельно использовать.

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

Хм, в Verilog совсем немного операторов. for работает так же как и везде.

А отвод из регистра сделать очень просто.

Допустим сдвиговый регистр наш по 8 бит сдвигает

sr[31:8] <= sr[23:0];
sr[7:0] <= sr_in;

Тогда отводы будут такими

assign ssr_out = sr[31:24];
assign ssr_out_1 = sr[23:16];
assign ssr_out_2 = sr[15:8];
assign ssr_out_3 = sr[7:0];

При этом все они должны быть объявлены как 8-битные. Для лучшего понимания, наглядности и однозначности лучше каждый отдельно описать, а не в одну строку:

output [7:0] sr_out;
output [7:0] sr_out1;
output [7:0] sr_out2;
output [7:0] sr_out3;

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

Я в коде цикла For удалил массив. Симулятор показывает что регистр заполняется побитно приходящими данными но только первые 8 бит а в эпюрах регистр так и не заполняется.Он не правельно читает sr_in врядли наверное проблема sr[n] <= sr[n-1];

он же отвечает за заполнение?

reg [31:0]sr;
integer n;
always @ (posedge clk)

if (shift == 1'b1)
	 begin

for (n = 31; n>0; n = n-1)
begin

sr[n] <= sr[n-1];

$display("%d",sr[n]);
end
sr[7:0] <= sr_in;
end
			 assign sr_out = sr[7:0];
			 assign sr_out1 = sr[15:8];
			 assign sr_out2 = sr[23:16];
			 assign sr_out3 = sr[31:24];

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

Вот это конструкция "больше вопросов чем ответов" Что то в твоей конструкции ему не понравилось и отладчик ругается.

reg [31:0]sr;
integer n;
always @ (posedge clk)
if (shift == 1'b1)
			 begin
for (n = 1; n<4; n = n+1)
begin
sr[(n+1)*8-1:n*8] <= sr[n*8-1:(n-1)*8]; 
$display("%d",sr[n]);
end
sr[7:0] <= sr_in;
end
							 assign sr_out = sr[7:0];
							 assign sr_out1 = sr[15:8];
							 assign sr_out2 = sr[23:16];
							 assign sr_out3 = sr[31:24];

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

ppp2.v:35: error: Part select expressions must be constant.

ppp2.v:35: : This lsb expression violates the rule: (n)*('sd8)

ppp2.v:35: error: Part select expressions must be constant.

ppp2.v:35: : This msb expression violates the rule: (((n)+('sd1))*('sd8))-('sd1)

ppp2.v:35: error: Part select expressions must be constant.

ppp2.v:35: : This lsb expression violates the rule: ((n)-('sd1))*('sd8)

ppp2.v:35: error: Part select expressions must be constant.

ppp2.v:35: : This msb expression violates the rule: ((n)*('sd8))-('sd1)

ppp2.v:35: error: Part select expressions must be constant.

ppp2.v:35: : This lsb expression violates the rule: ((n)-('sd1))*('sd8)

ppp2.v:35: error: Part select expressions must be constant.

ppp2.v:35: : This msb expression violates the rule: ((n)*('sd8))-('sd1)

6 error(s) during elaboration.

А как правельно?

$display("%d",sr[n]);

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

ОК, значит нельзя такое через цикл for провернуть.

Забил бы ты на эти циклы. Это же не Си, а Верилог, тут и без циклов всё отлично и понятно делается.

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

Логично просто хотел понять что за код для работы с регистрами через For на сайте Альтера и при этом оказался не рабочий ведь заполнения регистра у меня тоже не получалось а оказалось всё просто. Есть ещё вопрос когда регистров много. С начала я заполняю один большой регистр разбиваю на меньшие а потом мне их надо сравнить все с определенными данными все сравнения пишутся в ручную для каждого малого регистра или они выводятся на оператор case.

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

Не совсем понятна твоя формулировка.

Если хочешь, чтобы они одновременно сравнивались - то конечно каждый описываешь.

А если хочешь по очереди - можешь через оператор case.

Ты пойми тут главное отличие от обычного программирования в широком параллелизме. То есть множество действий может быть выполнено одновременно за один такт. А не как в процессоре всё последовательно.

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

О да меня параллелизм интересует почему и пробую понять. Просто когда их много штук 80 каждому пишется вывод assign sr_out = sr[7:0]; и для каждого пишутся сравнения которые нужны или в цикле возможно.

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

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

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

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

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

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

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

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Сообщения

    • У меня больше всего вопросов вызвала необычная схема обеспечения отрицательного питания. Автор этой обстоятельной заметки пишет: For this supply to work correctly, the transformer must have a secondary voltage of at least 18V RMS.  Почему? Что будет не так с отрицательным питанием, если напряжение на трансформаторе будет меньше 18В?   https://tinyurl.com/23mlwxtt - я в простейшей эмуляции ставлю 12В пикового напряжения для трансформатора и на стабилитроне все как положено: -5.6В.
    • Согласен, очень криво объяснил. Это работа трёх вольтовой линии, просто на диод шотки сдвоенный, на один анод приходит сигнал напрямую с трансформатора, а на второй через дроссель. Вольт/деление 5 вольт в клетке, тайминг по моему 10 МС. Третья фотография это сигнал на катодах уровень земли ровно по центру экрана. Но все линии по итогу в порядке 3.3 в, 5, в, 12 в и -12 в. Нагрузить все линии не могу сразу ,так как тут же выгорают транзисторы (имеется нагрузка 250 ватт по 10 ампер на каждую линию за исключением-12в), поэтому нагружаю 3.3 вольтовую линию на 10 ампер,  подключаю переменный резистор 50 ватт на 15 ом на 5 вольтовую линию и постепенно довожу до той той картины с перекосом (это гдето  50 ватт общее). По поводу микросхемы, вверху имеется скрин где между импульсами проскакивает мини импульс, если так можно сказать, он проскакивает и на одной  и на второй ноге (7,8). Микросхема не tl 494, а lw4933/abx942.1/c9421646. Далее они приходят на базы транзисторов 945g  коллекторы этих транзисторов соединены с  выводами трансформатора. Просто схема типовая, легче мне кажется просто привести фото самого блока, для тех кто разбирается будет гораздо информативне.  Диод шотки по 12 вольтовой линии был подгоревший, заменил на донора. Приводить скрины не буду что бы не захламлять тему. В итоге, пока все так же, при достижении определенной нагрузки суммарно где-то 50 ватт, появляется этот "выброс и перекос". По этому имеются мысли на два варианта, это микросхема , этот мини импульс между периодами, на низкой нагрузке особо не влияет, но при достижении определенной приводит с самовозбуждению входной цепи и непроизвольному открытию транзистора нижнего плеча. Либо дело в "горячей части", плавающий дефект в обвязке силовых ключей.  Спасибо за ответ.
    • @Gomerchik а вы контролировали как меняется уровень сигнала на А1 ардуины?
    • Спасибо за совет. Автором данного проекта я не являюсь, мне нужно было воссоздать уличный датчик для метеостанции взамен пропавшего(( Из разного найденного в интернете этот проект работает с моей станцией Орегон (спасибо автору). В понедельник попробую последовать Вашему совету. Но все равно куча непоняток  как блин это работает)) Если дело в неправильной отправки команды, то как на это влияет подключение датчика температуры? Если совсем не подключать таймер, то передача идет один раз (как и прописано в программе), станция принимает и отображает, но минут через сколько-то естественно станция уже ни чего не показывает, но с таймером питание полностью не пропадает с ардуинки, но передача сигнала каким-то образом работает по таймеру.  В моем понимании данная команда подается один раз потому, что таймер должен отключать питание МК после передачи сигнала и каждые 43 сек снова подавать питание (так того требует станция).  Ардуино передает показания температуры отключается полностью и 43 секунды мк не работает.  Сейчас у меня питание пока сделано на подпитке от солнечной батареи, но пару пасмурных дней и аккумулятор съедается до отключения(
    • thickman Так и сделаю. Вытащу из бу БП.  Буду знать, как отличить. Благодарю. Заменил транзисторы на IRFB20N50K. Картина стала, совсем другой.  Похоже трудность не в драйвере, на момент подвозбуда, переходные процессы, в нем, завершены. Увеличил затворные резисторы до 50ом, стало немного лучше.  Не понятно, почему верхний ключ греется несколько сильнее. Возможно, стоит посмотреть ток в коллекторе.  Снабберные емкости временно удалил, изменений не произошло.  Замена ТГР на другой, на кольце MSTN-16A-TH, так же, результата не принесла.   irfb20n50k.pdf
    • А что нить из ассортимента активных щупов производства СССР..))
  • Похожий контент

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