Вадим Н. 1 Пятница в 05:46 Опубликовано Пятница в 05:46 · Жалоба Всем привет, У меня задача: запрограммировать на GW2A18 определённый алгоритм управления устройством с обратной связью. У кого есть опыт проектирования чего-то подобного, посмотрите пожалуйста. Термины и названия блоков навеяны одной презентацией GoWin. См. скрин: Надо сказать, что первая версия "дизайна" толком не работала, и блок-схема, нарисованная уже постфактум, (я её здесь не привожу) похожа на кашу из модулей. По новой блок-схеме есть сомнения и вопросы: "Буфер" - это модуль который накапливает актуальную телеметрию на случай если она понадобится для отправки по SPI. Как он реализуется я пока не знаю. "Регистр настроек работы" - это вот главный вопрос. Вообще-то это массив. Где-нибудь 16x64. Не пойму: это должно быть реализовано как память, или можно реализовать и доступ по адресу, и непосредственный доступ к отдельным регистрам для параллельного чтения/записи. Вот сценарий их использования: каждому регистру соответствует один писатель и много читателей всем модулям кроме SPI регистры нужны индивидуально SPI-модулю регистры нужны как массив Может кто подскажет какие-нибудь образцы хорошего стиля на эту тему ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
stealthisname 7 Суббота в 07:25 Опубликовано Суббота в 07:25 · Жалоба если считать, что MC управляет работой устройства через SPI controller и видит регистры настроек как память, то SPI controller может сформировать сигналы чтения/записи, сигналы адреса и данных для МС помимо возможности записать настройки необходима возможность считать информацию о работе устройства, и самое главное - считать информацию о количестве данных в buffer, а значит в памяти помимо настроек для записи/чтения MC ещё должны быть регистры только для чтения пример для меньшего количества регистров module OSReg ( input clk, rst, input wr_en, input rd_en, input [2:0] addr, input [15:0] wr_data, output reg [15:0] rd_data, // output [15:0] settings0, output [15:0] settings1, output [15:0] settings2, output [15:0] settings3, input [15:0] status0, input [15:0] status1, input [15:0] status2, input [15:0] status3 ); reg [15:0] settings_ram [0:3]; always @(posedge clk) begin if (rst) begin settings_ram[0] <= 0; settings_ram[1] <= 0; settings_ram[2] <= 0; settings_ram[3] <= 0; end else begin if (wr_en) settings_ram[addr] <= wr_data; end end assign settings0 = settings_ram[0]; assign settings1 = settings_ram[1]; assign settings2 = settings_ram[2]; assign settings3 = settings_ram[3]; wire [15:0] settings_ram_rd [0:7]; assign settings_ram_rd[0] = settings0; assign settings_ram_rd[1] = settings1; assign settings_ram_rd[2] = settings2; assign settings_ram_rd[3] = settings3; assign settings_ram_rd[4] = status0; assign settings_ram_rd[5] = status1; assign settings_ram_rd[6] = status2; assign settings_ram_rd[7] = status3; always @(posedge clk) begin if (rst) begin rd_data <= 0; end else begin if (rd_en) rd_data <= settings_ram_rd[addr]; end end endmodule в примере, если МС записывает данные, то SPI controller формирет wr_en, addr, wr_data если МС считывает данные, то SPI controller формирет rd_en, addr и отправляет в MC rd_data в примере регистры с 0 по 3 - регистры на запись и чтение, с которых остальные блоки могут брать переданные с MC настройки работы , регистры с 4 по 7 - регистры только для чтения, куда остальные блоки могут сообщать для MC состояние своей работы и где будет храниться взятая с buffer информация о количестве данных, которые может считать MC через SPI controller Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 Суббота в 10:08 Опубликовано Суббота в 10:08 · Жалоба У процессора есть возможность подключения SRAM памяти? если есть то лучше сделать - fpga имитирует работу SRAM памяти - процессор видит fpga как внешнюю SRAM память тогда берете двухклоковую память один порт заводите на на логику имитирующую SRAM память второй порт на Вашу логику + 1-2 сигнала от процессора (GPIO) для квітірования операций (готовность данних, какие-то команди) В случае с SPI тоже самое процессор мастер. FPGA слейв. Есть протокол общения. Логика FPGA декодирует протокол. В зависимости например данние или команди пишет в блочную память (двухклоковую и двухпортовую) по определенним адресам команди/данние И дает сигнал квитирования дальнейшей логике для дальнейшей обработки... по 1-2 сигнала от процессора (GPIO) для квітірования операций - логика понимает по каким адресам надо считать Для процессора наоборот - логика пишет в память и квитирует по gpio (возможно на преривание для процессора) Таким образом можно передавать информацию размером в несколько сотен байт/слов Можно организовать даблбуффер в FPGA для обмена... пришла команда с процессора дай мне такие то данние - мастер видает N байт/слов(главное клок SPI) - логика слейва видает нужную информацию Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Вадим Н. 1 Понедельник в 10:52 Опубликовано Понедельник в 10:52 · Жалоба On 7/6/2024 at 2:25 PM, stealthisname said: а значит в памяти помимо настроек для записи/чтения MC ещё должны быть регистры только для чтения - ну да, так всё и планируется. в ближайшее время сделаю примерчик в подтверждение концепции и закину сюда. надеюсь )) On 7/6/2024 at 5:08 PM, Maverick_ said: тогда берете двухклоковую память один порт заводите на на логику имитирующую SRAM память второй порт на Вашу логику + 1-2 сигнала от процессора Про Dual Port SRAM - красиво, но у нас пока точно будет SPI. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 23 часа назад Опубликовано 23 часа назад · Жалоба On 7/8/2024 at 1:52 PM, Вадим Н. said: - ну да, так всё и планируется. в ближайшее время сделаю примерчик в подтверждение концепции и закину сюда. надеюсь )) Про Dual Port SRAM - красиво, но у нас пока точно будет SPI. Память внутри fpga с помощью нее можно правильно организовать обмен Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться