Leo Опубликовано 12 февраля, 2014 Поделиться Опубликовано 12 февраля, 2014 Хотел спросить насчет сдвигового регистра я взял на сайте альтеры пример но он что то не заработал 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; Пример простой но почему то не работает. Хотя что то похожее видел в примерах у других. Запускал с простым тест бэнчем данные приходят но в регистр не записываются. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Vascom Опубликовано 13 февраля, 2014 Поделиться Опубликовано 13 февраля, 2014 (изменено) Всё тут работает. Данные на выходе появятся после заполнения регистра sr[63:0]. Видишь это assign sr_out = sr[63]; - на выход идёт последний бит. А тут sr[0] <= sr_in; - заполнение регистра начинается с первого бита. Покажи свой тестбенч, возможно в нём у тебя ошибка. Может ты клок не подал или shift не поставил в 1. Изменено 13 февраля, 2014 пользователем Vascom 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
Leo Опубликовано 13 февраля, 2014 Автор Поделиться Опубликовано 13 февраля, 2014 Привел всё сразу со всеми изменениями которые внес. Что не так не понятно. 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 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
Vascom Опубликовано 13 февраля, 2014 Поделиться Опубликовано 13 февраля, 2014 (изменено) Внеси это в тег "Код" пожалуйста. Ну и сразу видны ошибки у тебя: input wire [7:0]sr_in; sr[0] <= sr_in; Вход у тебя восьмибитный, но в регистр ты кладёшь только один бит, причём непонятно какой (нулевой наверное). Изменено 13 февраля, 2014 пользователем Vascom 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Leo Опубликовано 13 февраля, 2014 Автор Поделиться Опубликовано 13 февраля, 2014 Из этого я делаю вывод что 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; Изменение есть но результата нет. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Vascom Опубликовано 14 февраля, 2014 Поделиться Опубликовано 14 февраля, 2014 (изменено) Должно быть sr[31:8] <= sr[23:0]; sr[7:0] <= sr_in; Разберись в понимании шин и битов. И на выход у тебя идёт лишь один старший бит assign sr_out3 = sr[31]; Если ты хочешь все 8 бит на выходе иметь, то сделай assign sr_out3 = sr[31:24]; Изменено 14 февраля, 2014 пользователем Vascom 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Leo Опубликовано 14 февраля, 2014 Автор Поделиться Опубликовано 14 февраля, 2014 (изменено) Как хорошо не много просветлело и заработало. Но мне попался ещё один сдвиговый регистр этот заработал почти сразу sr <= { sr[31:0],sr_in }; но не очень ясно если разница с предыдущим вариантом sr[31:8] <= sr[23:0]; sr[7:0] <= sr_in; или это разнообразие в написании. Ещё хотел спросить насчет For вроде он не используется в коде при описании для микросхемы а только в тест бэнче? Изменено 14 февраля, 2014 пользователем Leo 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Vascom Опубликовано 15 февраля, 2014 Поделиться Опубликовано 15 февраля, 2014 Это разнообразие в описании. Причём вариант sr <= { sr[31:0],sr_in }; написан неграмотно. Слева у нас 32-рязрядный регистр sr, а справа ему присваивается уже 40-разрядное значение. Конечно компилятор умный, он отбросит старшие 8 разрядов, но вдруг нет? Так что если уж писать в одну строку, то так: sr <= { sr[23:0],sr_in }; В общем все неочевидности лучше сразу убирать. Так код и читается лучше, и поддерживается и работает . For вполне можно использовать и для описания микросхемы. Иногда это позволяет сделать код более компактным. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Leo Опубликовано 15 февраля, 2014 Автор Поделиться Опубликовано 15 февраля, 2014 Я решил попробовать цикл 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)beginif (shift == 1'b1)beginfor (n = 63; n>0; n = n-1)beginsr[n] <= sr[n-1];endsr[0] <= sr_in;endendassign sr_tap_one = sr[15];assign sr_tap_two = sr[31];assign sr_tap_three = sr[47];assign sr_out = sr[63];endmoduleНо проблема таже не загружаются данные хотя пример обсолютно такой же.Только значения поменял. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Vascom Опубликовано 16 февраля, 2014 Поделиться Опубликовано 16 февраля, 2014 Ты упорно пытаешься выходным многоразрядным шинами присваивать однобитовые значения. Строй эпюры всех сигналов, и у видишь где у тебя проблемы. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Leo Опубликовано 16 февраля, 2014 Автор Поделиться Опубликовано 16 февраля, 2014 (изменено) При построении эпюр выходит что не загружается регистр. sr[0] <= sr_in; А изменить sr[0] на sr[7:0] не удается компилятор ругается. И assign sr_out = sr[7]; на assign sr_out = sr[7:0]; тоже. Ведь при таком написании он заносит в регистр 8 бит. Но проблема помойму в цикле For где n должно быть типа регистра я запутался. Пример который я взял тоже работает с регистром а не содним сигналом? И что значит построить все эпюры загрузка не идет и дальше нету результатов. Изменено 16 февраля, 2014 пользователем Leo 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Vascom Опубликовано 16 февраля, 2014 Поделиться Опубликовано 16 февраля, 2014 Так sr_out у тебя же и есть 8 бит. А вот за масситвы ты рано взялся. Это reg [7:0] sr [31:0]; тут совершенно ни к чему. Ты всё слишком усложнил, не разобравшись с простейшим. Выясняй почему регистр sr[0] не загружается. И не используй конструкции for без необходимости. Как видишь, это тут всё лишь усложняет. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Leo Опубликовано 16 февраля, 2014 Автор Поделиться Опубликовано 16 февраля, 2014 Можно не много пояснений простой сдвиговый регистр у меня получился который был в самом начале он заполняется и выводит результат который указан assign sr_out = sr[7:0]; через него проходят все предидущие и в конце в нем остается что нужно sr[7:0]. Я взял не удачный пример но он приводился как продолжение сдвигового регистра разделяя его на части регистр с отводами наверное для более правельного чтения куска регистра.Хотя что то не так. Я хотел на примере понять как работает цикл For.Так много операторов что не понятно какой правельно использовать. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Vascom Опубликовано 17 февраля, 2014 Поделиться Опубликовано 17 февраля, 2014 Хм, в 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; 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Leo Опубликовано 17 февраля, 2014 Автор Поделиться Опубликовано 17 февраля, 2014 Я в коде цикла 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]; 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Vascom Опубликовано 17 февраля, 2014 Поделиться Опубликовано 17 февраля, 2014 Конечно. Раз у тебя 8 бит на входе, то и регистр надо заполнять по 8 бит, а не по одному биту. Переделай. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Leo Опубликовано 18 февраля, 2014 Автор Поделиться Опубликовано 18 февраля, 2014 Не знаю как переделать цикл For вместо sr[n] <= sr[n-1]; подставил sr[31:8] <= sr[23:0]; но For тогда зачем как должно быть правельно. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Vascom Опубликовано 19 февраля, 2014 Поделиться Опубликовано 19 февраля, 2014 Вот так: for (n = 1; n<4; n = n+1) begin sr[(n+1)*8-1:n*8] <= sr[n*8-1:(n-1)*8]; end sr[7:0] <= sr_in; 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Leo Опубликовано 19 февраля, 2014 Автор Поделиться Опубликовано 19 февраля, 2014 Вот это конструкция "больше вопросов чем ответов" Что то в твоей конструкции ему не понравилось и отладчик ругается. 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]; 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Vascom Опубликовано 19 февраля, 2014 Поделиться Опубликовано 19 февраля, 2014 Ну а где ругань-то? И неправильно ты выводишь $display("%d",sr[n]); Покажи что он пишет. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Leo Опубликовано 19 февраля, 2014 Автор Поделиться Опубликовано 19 февраля, 2014 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]); 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Vascom Опубликовано 19 февраля, 2014 Поделиться Опубликовано 19 февраля, 2014 ОК, значит нельзя такое через цикл for провернуть. Забил бы ты на эти циклы. Это же не Си, а Верилог, тут и без циклов всё отлично и понятно делается. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Leo Опубликовано 19 февраля, 2014 Автор Поделиться Опубликовано 19 февраля, 2014 Логично просто хотел понять что за код для работы с регистрами через For на сайте Альтера и при этом оказался не рабочий ведь заполнения регистра у меня тоже не получалось а оказалось всё просто. Есть ещё вопрос когда регистров много. С начала я заполняю один большой регистр разбиваю на меньшие а потом мне их надо сравнить все с определенными данными все сравнения пишутся в ручную для каждого малого регистра или они выводятся на оператор case. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Vascom Опубликовано 19 февраля, 2014 Поделиться Опубликовано 19 февраля, 2014 Не совсем понятна твоя формулировка. Если хочешь, чтобы они одновременно сравнивались - то конечно каждый описываешь. А если хочешь по очереди - можешь через оператор case. Ты пойми тут главное отличие от обычного программирования в широком параллелизме. То есть множество действий может быть выполнено одновременно за один такт. А не как в процессоре всё последовательно. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Leo Опубликовано 19 февраля, 2014 Автор Поделиться Опубликовано 19 февраля, 2014 О да меня параллелизм интересует почему и пробую понять. Просто когда их много штук 80 каждому пишется вывод assign sr_out = sr[7:0]; и для каждого пишутся сравнения которые нужны или в цикле возможно. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.