bmv89 0 June 2, 2020 Posted June 2, 2020 · Report post Ну мне почему-то хотелось этот сигнал генерировать именно на стороне мк. Короче, не важно уже. Основную концепцию я усвоил - синхросигнал один единственный, всё остальное обрабатывать синхронно, не зависимо откуда пришло (извне или из этой же ПЛИС). Quote Share this post Link to post Share on other sites More sharing options...
Plain 322 June 2, 2020 Posted June 2, 2020 · Report post 15 минут назад, pinchemierda сказал: хотелось этот сигнал генерировать именно на стороне мк Из этого никак не следует, что его надо заводить в ПЛИС без синхронизации. Quote Share this post Link to post Share on other sites More sharing options...
bmv89 0 June 2, 2020 Posted June 2, 2020 (edited) · Report post Да уж тупанул)) Не те методички читаю (или потому что по диагонали). Спасибо за разъяснения! А можно ещё вопрос чисто фундаментальный? Что вообще можно считать с т.з. верилога одновременными событиями? Например есть такая ситуация: два always блока, которые должны выполнятся одновременно (в списках чувствительности у обоих есть, к примеру, posedge CLK): always@(posedge CLK or posedge Reset) begin if(Reset) //.......... else counter <= counter+1; end always@(posedge CLK) begin val <= counter; //чему будет равен val? end При самом первом фронте CLK val будет равен инкрементированному значению уже? Или он будет равен исходному значению counter (до сложения с 1)? Или таких ситуаций необходимо избегать, из-за неопределённости? Edited June 2, 2020 by pinchemierda Quote Share this post Link to post Share on other sites More sharing options...
Plain 322 June 2, 2020 Posted June 2, 2020 · Report post 8 минут назад, pinchemierda сказал: При самом первом фронте CLK val будет равен инкрементированному значению уже? После тактового сигнала, на выходе регистра всегда будет то, что было на входе. И тут только один фронт, никакого второго нет. Соответственно, val=counter, counter=+1, т.е. буквально то, что описано операторами. Quote Share this post Link to post Share on other sites More sharing options...
dvladim 0 June 2, 2020 Posted June 2, 2020 · Report post 50 минут назад, pinchemierda сказал: Что вообще можно считать с т.з. верилога одновременными событиями? Стандартом Verilog порядок выполнения always/initial не специфицируется. Т.е. может быть произвольным. А то как это обрабатывается симулятором хорошо описано у sunburst-design но это уже детальное объяснение. Quote Share this post Link to post Share on other sites More sharing options...
xvr 12 June 2, 2020 Posted June 2, 2020 · Report post 56 minutes ago, pinchemierda said: При самом первом фронте CLK val будет равен инкрементированному значению уже? Почитайте про отличия 2х типов присваивания: '=' и '<=' Вопрос отпадёт сам собой Quote Share this post Link to post Share on other sites More sharing options...
bmv89 0 June 2, 2020 Posted June 2, 2020 · Report post Решил уж уточнить, а то симулятору слепо доверять не хочется. Спасибо! Quote Share this post Link to post Share on other sites More sharing options...
bmv89 0 June 21, 2020 Posted June 21, 2020 · Report post И снова здравствуйте, уважаемые знатоки ПЛИС и Verilog! Гляньте, что не так с кодом? Пытаюсь SPI slave в железе запустить, в функциональном симуляторе (без учёта таймингов) всё как надо работает. Приёмный буфер o_rx_buf вывел наружу и подключил 8 светодиодов для отладки. В результате в этом буфере всё что угодно, только не то, что реально отправляется по линии MOSI. На выходе MISO тоже не пойми что. Если закомментировать всё, что связано с MISO, то сразу всё оживает и модуль начинает правильно воспринимать данные на линии MOSI. Частота i_core_clk = 50МГц, частота SPI clk = 18 МГц (хотя пробовал и меньше). Всё пытался сделать максимально синхронным. module spi_slave( input i_core_clk, //FPGA clock input i_cs, input i_clk, input i_mosi, output reg o_miso, output reg o_irq, output reg [7:0]o_rx_buf, input [7:0]i_tx_buf ); reg [2:0]counter; //счётчик битов reg sync_clk; //-------------------------- MOSI --------------------------------- reg [7:0]sr_rx; //сдвиговый приёмный регистр //Детектирование фронта CLK always @(posedge i_core_clk) begin sync_clk <= i_clk; if(!counter && sync_clk) begin o_irq <= 1'd1; o_rx_buf <= sr_rx; end else o_irq <= 1'd0; end always @(posedge sync_clk or posedge i_cs) begin if(i_cs) counter <= 3'd0; else begin counter <= counter + 1'd1; sr_rx <= {sr_rx[6:0], i_mosi}; end end //-------------------------- MISO --------------------------------- reg [7:0]sr_tx; //сдвиговый регистр отправки reg [2:0]tmp; always @(*) begin if(i_cs) o_miso = 1'dZ; else o_miso = sr_tx[7]; end always @(posedge i_core_clk) begin tmp <= counter; if(!counter) sr_tx <= i_tx_buf; if(counter != tmp) sr_tx <= sr_tx << 1'd1; end endmodule Quote Share this post Link to post Share on other sites More sharing options...
Джеймс 5 June 21, 2020 Posted June 21, 2020 · Report post 1 hour ago, pinchemierda said: Всё пытался сделать максимально синхронным. Для начала проверьте, что sync_clk у вас на глобальной цепи "сидит" Quote Share this post Link to post Share on other sites More sharing options...
des00 27 June 22, 2020 Posted June 22, 2020 · Report post 7 hours ago, pinchemierda said: Всё пытался сделать максимально синхронным. вы логику того что написали, точно представляете? выложите файл модуля и тестбенча, как оно у вас работает в симуляторе Quote Share this post Link to post Share on other sites More sharing options...
bmv89 0 June 22, 2020 Posted June 22, 2020 · Report post Симулировал в квартусе с использованием функционального симулятора (там не нужен тестбенч). Modelsim не освоил пока ((. Файл модуля выложил. Могу диаграммы выложить, но опять ругаться будут)). А что там с логикой то? Можете поправить? Цитата что sync_clk у вас на глобальной цепи "сидит" не совсем понял, что здесь означает "на глобальной цепи" Quote Share this post Link to post Share on other sites More sharing options...
des00 27 June 22, 2020 Posted June 22, 2020 · Report post 1 hour ago, pinchemierda said: А что там с логикой то? Можете поправить? в трех словах: в утиль, все. осваивайте нормальный симулятор и тестбенчи. на все про все 2-3 часа туториала. Quote Share this post Link to post Share on other sites More sharing options...
new123 0 June 22, 2020 Posted June 22, 2020 · Report post 23 minutes ago, des00 said: на все про все 2-3 часа туториала везет =) у меня пару недель ушло Quote Share this post Link to post Share on other sites More sharing options...
des00 27 June 22, 2020 Posted June 22, 2020 · Report post 51 minutes ago, new123 said: везет =) у меня пару недель ушло это если в слепую идти или самодеятельностью заниматься. А если поставить софт, открыть туториал и идти по шагам, то первый простой проект (ЕМНИП, там обычный счетчик + тестбенч) проходится за 2-3 часа. За это время студент получает: навык работы со средой, проектом, компиляция, запуск моделирования, отладка). Потом уже туториал по проектной работе, работы с командной строки, библиотеки. Для старта этого достаточно. У меня студенты через это проходят все) Причем весь материал идет вместе с софтом) Quote Share this post Link to post Share on other sites More sharing options...
dxp 115 June 23, 2020 Posted June 23, 2020 · Report post 2-3 часа достаточно для того, чтобы пройти по шагам инструкции, но совершенно недостаточно для того, чтобы что-то значимое осело в голове и появилось нормальное понимание и представление. Это легко проверяется - дайте студенту, не знакомому ранее с темой и прошедшему тутор, задание сделать теперь самостоятельно другое подобное задание - результат не обрадует. Скорость освоения у всех, конечно, разная, но отличается не кардинально - определяется скоростью образования синапсических связей в мозгу, а мозг штука инертная и за раз в него не вложишь много. Т.ч. пройти-то студент это пройдёт за 3 часа, но что он усвоит - большой вопрос. От бэкграунда ещё сильно зависит. Поэтому в неделю-две мне верится больше, и то при условии, что новичка "поставили в колею" и сразу объяснили что к чему - сориентировали, так сказать, в "системе координат". Полностью самостоятельно это осваивается намного медленнее - там одних док прочесть надо немало, а их ещё надо найти (понять, какие нужны и в каком объёме изучать). Quote Share this post Link to post Share on other sites More sharing options...