iosifk 3 23 мая, 2018 Опубликовано 23 мая, 2018 · Жалоба Конечно не в каждом, но зачем лишние заморочки? Данные передаются с начала процесса одной колбасой по SPI, каждое слово ложится в RAM по конкретному адресу и далее используется отдельными блоками (автоматими). Зачем здесь арбитр и дополнительная синхронизация автоматов по выборке данных из одного большого RAM-блока? То, что "проще" для Вас, совсем не проще для ПЛИС... На 16х16 битов данных необходимо задействовать столько же интерконнектов. И это самый дорогой ресурс в ПЛИС. И, кстати не говорилось о том, с какой скоростью идет обработка данных. Говорилось о 25 Мгц от АЦП и 100 Мгц тактовой. А сколько тактов в автомате и в скольки тактах он пользуется данными из памяти? И всегда ли арбитр будет задерживать автоматы, если запрос на доступ подать на 1 такт раньше, чтобы ссработал арбитр? И, кстати, компилятор совершенно прав, когда пытается вместо блочной памяти, применить триггера. Потому как ко входам триггеров идет одна шина в 16 бит, а сами триггера можно разместить в любом месте кристалла. А вот блочная память сидит в центре кристалла и от нее надо гнать 16х16 проводов... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alex1985 0 23 мая, 2018 Опубликовано 23 мая, 2018 · Жалоба Flip-fl0p, Иосиф Григорьевич спасибо! Подумаю над Вашим вариантом, сейчас другая проблема возникла - не хочет запускаться pll clock. Делал так: 1. Сгенерил мегавизардом компонент pll с коэффициентом умножения 6. Один клок на входе и один на выходе. 2. Выкинул все из проекта, кроме pll. 3. Скопировал файл altera_mf.v и добавил его в компиляцию (без него ModelSim не может найти altpll). Нажимаю на "ТЫЦ" - все собирается, проходит компиляция файлов и тестбенча, но выдается ошибка: ** Error: (vsim-3601) Iteration limit reached at time 0 ns. Сам "ТЫЦ.bat" и файлы проекта во вложении. Отладку провожу в ModelSim 10.3d. Прошу прощения, нашел ошибку: в строке макроса было задано слишком малое время симуляции: vsim -t 1ns tb project.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nice_vladi 2 23 мая, 2018 Опубликовано 23 мая, 2018 · Жалоба ** Error: (vsim-3601) Iteration limit reached at time 0 ns. Это modelsim достигает предела итераций моделирования. Из-за того, что в core PLL много подмодулей, и они довольно крупные и для симуляции каждого требуется куча операций. Вот он и наедается. Можно покрутить параметр лимита операций в настройка сабжа, но лучше при моделировании не использовать PLL, а описывать клоки несинтезируемыми конструкциями языка (ИМХО). Т.е.: Для симуляции используете "искусственные" клоки; Для синтеза - корку Альтеры; Совсем хорошо будет отбить дефайнами эти области, что бы вручную не комментить каждый раз. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
OM-S 0 23 мая, 2018 Опубликовано 23 мая, 2018 (изменено) · Жалоба В tb.v поставьте начальное значение для регистра clk, иначе инверсия неизвестного значения даст неизвестное значение Не могу запустить ваш пример и проверить, но в в macros.do наверно нужно указать симуляцию с разрешением 1ps.(строка 4 vsim -t 1ps tb). Pll обычно симулируются с пикосекундными разрешениями. Изменено 23 мая, 2018 пользователем OM-S Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alex1985 0 23 мая, 2018 Опубликовано 23 мая, 2018 (изменено) · Жалоба В tb.v поставьте начальное значение для регистра clk, иначе инверсия неизвестного значения даст неизвестное значение Спасибо! Исправил. Теперь другая проблема: клок вместо умножения начал делиться) Тестбенч: `timescale 1ps / 1ps `include "altera_mf.v" `include "main.v" `include "pll.v" module tb; reg clk; wire clk_108MHz; main main_tb( .clk(clk), .clk_108MHz(clk_108MHz)); always #5 clk = !clk; initial begin clk = 0; #10000; $stop; end endmodule Макрос запуска: transcript on vlib work vlog -sv tb.v vsim -t 1ps tb add wave /* quietly radix unsigned configure wave -timelineunits ns run -all wave zoom full Причем если в тестбенче явно указываю время, т.е. вместо #5 ставлю #5ns и вместо #10000 ставлю #10000ns - то все работает. В чем проблема? nice_vladi, похоже Вы правы - для симуляции проще использовать искусственные клоки. По крайней мере один железный плюс я здесь вижу - размер проекта меньше (не включаются файлы типа altera_mf.v и т.д.) Насколько такой подход правильный - не знаю. Изменено 23 мая, 2018 пользователем Sprite Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_sda 0 23 мая, 2018 Опубликовано 23 мая, 2018 · Жалоба Что-то у вас входной клок дюже быстро клацает для 18 МГц... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alex1985 0 23 мая, 2018 Опубликовано 23 мая, 2018 (изменено) · Жалоба Что-то у вас входной клок дюже быстро клацает для 18 МГц... Это потому что я в тестбенче указываю задержку в тактах, а не в реальном времени, а в качестве величины такта система, как я понимаю, принимает минимальный timescale из всех модулей проекта, в данном случае как правильно заметил OM-S - это pll. По совету nice_vladi задефайнил все, что касается pll. Теперь при симуляции в modelsim если дефайн активен - то pll волшебным образом исчезает из схемы)). Получилось довольно красиво и главное работает! :biggrin: Изменено 23 мая, 2018 пользователем Sprite Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alex1985 0 25 мая, 2018 Опубликовано 25 мая, 2018 · Жалоба Добрый день всем! Еще один нубский вопрос: Решил промоделировать конечный автомат, но сигнал на выходе (out) в ModelSim отображает как "X", хотя в квартус-симуляторе моделируется все нормально. Если файлы (конечный автомат и тестбенч) добавлять в ModelSim вручную и - то тоже нормально все, сигнал out отображается так как планировалось. Делаю вывод - дело в макросе. Конечный автомат: module generator ( input clk, input ena, output reg out ); wire pulse; reg [15:0] cnt_val = 16'd0; reg [15:0] cnt_comp_val = 16'hFFFF; reg [1:0] state = 2'b00; parameter S0 = 0, S1 = 1, S2 = 2, S3 = 3; reg [15:0] comp_val[3:0]; initial begin comp_val[0] = 16'd4; comp_val[1] = 16'd5; comp_val[2] = 16'd6; comp_val[3] = 16'd7; end //---------------------------------------- always @ (state) begin case (state) S0: begin cnt_comp_val = comp_val[0]; out = 1; end S1: begin cnt_comp_val = comp_val[1]; out = 0; end S2: begin cnt_comp_val = comp_val[2]; out = 1; end S3: begin cnt_comp_val = comp_val[3]; out = 0; end default: begin cnt_comp_val = 16'hFFFF; out = 0; end endcase end //---------------------------------------- always @ (posedge clk) begin if (!ena) state <= S0; else case (state) S0: state <= pulse? S1:S0; S1: state <= pulse? S2:S1; S2: state <= pulse? S3:S2; S3: state <= pulse? S0:S3; default: state <= S0; endcase end //---------------------------------------- always @(posedge clk) begin if(ena) if(cnt_val==cnt_comp_val) cnt_val = 4'b1; else cnt_val = cnt_val + 1'd1; else cnt_val = 4'd1; end assign pulse = (cnt_val==cnt_comp_val); //---------------------------------------- endmodule Тестбенч к нему: `timescale 1ns / 1ns `include "generator.v" module tb; reg clk; reg ena; wire out; generator generator1(.clk(clk), .ena(ena), .out(out)); always #1 clk = ~clk; initial begin clk = 0; ena = 0; #100; ena = 1; #1000; $stop; end endmodule Макрос: #transcript on vlib work vlog -sv tb.v vsim -t 1ns tb add wave /tb/* add wave /tb/generator1/* #quietly radix unsigned configure wave -timelineunits ns run -all wave zoom full И картина на выходе (если запускать с помощью макроса): Что делаю не так - ума не приложу. Вроде бы объявлены начальные состояния регистров. Что это? Глюк ModelSim? Пробовал в 10.3d и в 6.5 - результат один и тот же( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 25 мая, 2018 Опубликовано 25 мая, 2018 · Жалоба Добрый день всем! Еще один нубский вопрос: .... Что делаю не так - ума не приложу. Вроде бы объявлены начальные состояния регистров. Что это? Глюк ModelSim? Пробовал в 10.3d и в 6.5 - результат один и тот же( Мой опыт работы в техподдержке говорит, что если пользователь сначала делает что-то не по шаблону, а как-то по своему, то потом у него появляется богатая возможность для "преодоления", для "трудового подвига", для "порыва души"... Это к стилю описания автомата... Вот не согласились же Вы узнать, что есть общего у одноглазого бога викингов, у сигналов паритета, у девушки и у симулятора. А если бы знали это, то моментально бы и причину нашли... А это - к "красному" сигналу "out"... Вот какие дела... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nieve 0 25 мая, 2018 Опубликовано 25 мая, 2018 · Жалоба 1. У вас в схеме нет сигнала "reset", рекомендуется его сипользовать для начальной инициализации. 2. Не рекомендую вносить в список чувствительности текущее состояние FSM. 3. В модуле "generator", сигнал "out" задан как "output reg", а в модуле "tb" как "wire". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 25 мая, 2018 Опубликовано 25 мая, 2018 · Жалоба Что делаю не так - ума не приложу. Вроде бы объявлены начальные состояния регистров. Что это? Глюк ModelSim? Пробовал в 10.3d и в 6.5 - результат один и тот же( Вот странный Вы человек. Вам же говорили как лучше начинать делать правильно тем кто только встал на путь изучения HDL. https://electronix.ru/forum/index.php?showtopic=146965 Но Вы упорно продолжаете делать по-своему. Вот я смотрю Вы в прошлой теме описали несчастный счетчик. Теперь Вы описываете счетчик ещё раз. А не проще было создать один отдельный файл счетчика. Добавить необходимые параметры, отладить, и больше к нему не возвращаться ? Таким образом Вы упростите следующие проекты, т.к исключите место где потенциально можно допустить ошибку. А если у Вас будет проект где используется десяток счетчиков, десяток FSM и куча всего ? Как тогда Вы будете все это отлаживать ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alex1985 0 25 мая, 2018 Опубликовано 25 мая, 2018 · Жалоба 1. У вас в схеме нет сигнала "reset", рекомендуется его сипользовать для начальной инициализации. 2. Не рекомендую вносить в список чувствительности текущее состояние FSM. 3. В модуле "generator", сигнал "out" задан как "output reg", а в модуле "tb" как "wire". 1. Не люблю reset. Предпочитаю задавать начальные значения регистрам при их объявлении или в секции initial 2. Не совсем понимаю Вас. Работать только по clk? Пример state-машины брал из шаблона verilog. 3. Модуль tb - это тестбенч. В них если я правильно понимаю выходные сигналы объявляются как wire. Иосиф Григорьевич, за Вашей мыслю так и не угнался) Слишком уж она сложная и мудреная, а настроения ребусы разгадывать нет. Вот странный Вы человек. Вам же говорили как лучше начинать делать правильно тем кто только встал на путь изучения HDL. https://electronix.ru/forum/index.php?showtopic=146965 Но Вы упорно продолжаете делать по-своему. Не только странный, но и упрямый - это Вы верно заметили) За наводку на мысль спасибо! Мысль: проблема в описании стейт-машины. Вот я смотрю Вы в прошлой теме описали несчастный счетчик. Ниче он не несчастный! Счетчик как счетчик - все по фэншую. Или проблема в том, что он находится в одном файле с автоматом? Так это просто пример, код еще будет причесываться и дорабатываться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nieve 0 25 мая, 2018 Опубликовано 25 мая, 2018 (изменено) · Жалоба 1. В таком случае как быть если схема зависла и необходимо ее сбросить? Или необходимо задать другие значения? В таком случае сначала "подать" сброс, а затем, по сигналу загрузки, записать входные данные. 2. Шаблон FSM не всегда является универсальным. Рекомендую использовать FSM "по clk" либо комбинационной логикой " @(*) ". 3. Я о другом. В модуле "generator" выходные сигналы делайте "wire-ми", чтобы могли их связывать с другими модулями (например верними уровнями) или для того, чтобы вывести этот сигнал на ножку ПЛИС и снять значения с "осцила". Изменено 25 мая, 2018 пользователем Nieve Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 25 мая, 2018 Опубликовано 25 мая, 2018 · Жалоба Ниче он не несчастный! Счетчик как счетчик - все по фэншую. Или проблема в том, что он находится в одном файле с автоматом? Так это просто пример, код еще будет причесываться и дорабатываться. Смысл в том, что зачем описывать ещё раз то, что уже было когда то описано ? Это опять тратить время надо. Опять проверять счетчик надо. Да и схема выглядит в итоге некрасивой, и запутанной. Вот представьте: у вас есть некий блок, где применяется несколько счетчиков, несколько регистров сдвига и автомат. В случае если Вы пишете "все в одном" то при тестировании Вам приходится проверять автомат. А ещё придется проверять правильность работы счетчиков и регистров сдвига. Безусловно, счетчик штука простая, и шансов допустить ошибку мало. Тем не менее ошибку допустить можно и она скорее всего будет :laughing: . И Вам придется тратить время на проверку, выискивание этой ошибки. А если бы счетчик был отдельным файлом, который уже протестирован и гарантированно работает, то нет необходимости тратить время на его проверку. Поскольку неправильная работа счетчика говорит лишь о том, что им неправильно управляют. А ещё счетчик можно сделать универсальным и параметрами настраивать: 1. Направление счета: вверх или вниз. 2. Максимальное значение счета. 3. Будет ли счетчик обновляться при переполнении, или останется в максимальном значении. 4. Можно добавить режим Debug и выводить состояния счетчика на консоль. Я от такого подхода вижу только преимущества - ускорение разработки, упрощение тестирования, уменьшение риска совершить ошибку. Да и код становится более понятным. Проще поддерживать его. Но как поступать - решать Вам. Я все карты раскрыл :beer: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 25 мая, 2018 Опубликовано 25 мая, 2018 · Жалоба Иосиф Григорьевич, за Вашей мыслю так и не угнался) Слишком уж она сложная и мудреная, а настроения ребусы разгадывать нет. Не только странный, но и упрямый - это Вы верно заметили) Мысль: проблема в описании стейт-машины. Ниче он не несчастный! Счетчик как счетчик - все по фэншую. Или проблема в том, что он находится в одном файле с автоматом? Так это просто пример, код еще будет причесываться и дорабатываться. так вот... Одноглазого бога звали Один. Именно поэтому мы говорим: один, два, три... И бит нечетности называется одд, тоже в честь него. А вот бит четности назван в честь Евы, потому как она дополнила Адама до четного. И для Адама это было большое событие, которые некоторые называют ивент. И именно по ивнтам срабатывает симулятор. А сигнал out у Вас переключается по какому событию? А вот оно: always @ (state) begin case (state) S0: begin cnt_comp_val = comp_val[0]; out = 1; end........ А переключается ли state??? Смотрим картинку и видим, что? Не переключается state, ни разу... А значит, если не выполняется always, то и до case дело ни разу не доходило.. Так с чего бы выполнилось вот это: out = 1??? Ведь этот out нигде больше не встречается... А почему? Да потому что некоторые маршируют по-Суворовски, через Альпы и при этом заявляют, что "Не люблю reset"... И все в таком же духе... А когда весь проект в один прекрасный момент раком встанет, то кого любить будете? Или только перезагружаться? И как тогда будете отлаживать железо? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться