_sda 0 28 ноября, 2017 Опубликовано 28 ноября, 2017 · Жалоба Коллеги, я сначала передавал данные(содержимое нескольких регистров 16 бит) через PIO и всё было нормально. Но у заказчика аппетит растёт, проект развивается и уже делать десятки PIO вроде как нехорошо. Для записи я использую параллельную шину данных + шина адреса , прекрасно работает, прописываю таким образом десятки регистров по всему проекту. Вот бы так и для чтения соорудить интерфейс. Единственное что смущает - Z-состояние на выходе невыбранных регистров. Как решаете подобную задачу? Наверняка есть отработанное решение... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Realking 0 28 ноября, 2017 Опубликовано 28 ноября, 2017 · Жалоба Коллеги, я сначала передавал данные(содержимое нескольких регистров 16 бит) через PIO и всё было нормально. Но у заказчика аппетит растёт, проект развивается и уже делать десятки PIO вроде как нехорошо. Для записи я использую параллельную шину данных + шина адреса , прекрасно работает, прописываю таким образом десятки регистров по всему проекту. Вот бы так и для чтения соорудить интерфейс. Единственное что смущает - Z-состояние на выходе невыбранных регистров. Как решаете подобную задачу? Наверняка есть отработанное решение... Добавь в Qsys Avalon-MM Pipeline Bridge через него и записать и прочитать можешь в описании будет типа такого (System Verilog) // FPGA IO Regs .mm_ioreg_waitrequest(1'b0), .mm_ioreg_byteenable(cpu_byteenable), .mm_ioreg_address(cpu_address), .mm_ioreg_read(cpu_read), .mm_ioreg_readdata(cpu_readdata), .mm_ioreg_readdatavalid(cpu_readdatavalid), .mm_ioreg_write(cpu_write), .mm_ioreg_writedata(cpu_writedata), .mm_ioreg_burstcount(), .mm_ioreg_debugaccess(), для чтения (у меня 64 разрядная шина) bit [2047:0] [7:0] ioreg_input; assign ioreg_input = FPGA_Status_Registers; always_ff @(posedge g_clk_100MHz, negedge g_reset_n) begin if (!g_reset_n) begin cpu_readdata <= '0; cpu_readdatavalid <= 1'b0; end else begin cpu_readdatavalid <= cpu_read; cpu_readdata <= { ioreg_input[{cpu_address, 3'b111}], ioreg_input[{cpu_address, 3'b110}], ioreg_input[{cpu_address, 3'b101}], ioreg_input[{cpu_address, 3'b100}], ioreg_input[{cpu_address, 3'b011}], ioreg_input[{cpu_address, 3'b010}], ioreg_input[{cpu_address, 3'b001}], ioreg_input[{cpu_address, 3'b000}] }; end end FPGA_Status_Registers - структура Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_sda 0 28 ноября, 2017 Опубликовано 28 ноября, 2017 · Жалоба Спасибо! Из описания пока не понял - ему пофигу Z-состояние на входе? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Realking 0 28 ноября, 2017 Опубликовано 28 ноября, 2017 · Жалоба если альтера то там нет Z состояний или я не правильно понял, и регистры вне ПЛИС? в ниос определяешь FPGA_Status_Registers* mFPGA_Status_Registers = (FPGA_Status_Registers*)(IO_REG_BASE + 0x80000000); 0x80000000 - для отключения хэширования Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_sda 0 28 ноября, 2017 Опубликовано 28 ноября, 2017 · Жалоба если альтера то там нет Z состояний или я не правильно понял, и регистры вне ПЛИС? в ниос определяешь FPGA_Status_Registers* mFPGA_Status_Registers = (FPGA_Status_Registers*)(IO_REG_BASE + 0x80000000); 0x80000000 - для отключения хэширования 1). Для определения какой хедер нужно подключить? 2). Как на одну входную шину бриджа подключить выходы например 20-ти регистров? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Realking 0 28 ноября, 2017 Опубликовано 28 ноября, 2017 · Жалоба 1). Для определения какой хедер нужно подключить? 2). Как на одну входную шину бриджа подключить выходы например 20-ти регистров? 1. system.h там адрес этого бриджа 2. можно так (если регистры 32 разрядные например) bit [2047:0] [7:0] ioreg_input; assign ioreg_input[3:0] = reg0; assign ioreg_input[7:4] = reg1; assign ioreg_input[11:8] = reg2; и тд а уж выбор делается тут always_ff @(posedge g_clk_100MHz, negedge g_reset_n) begin if (!g_reset_n) begin cpu_readdata <= '0; cpu_readdatavalid <= 1'b0; end else begin cpu_readdatavalid <= cpu_read; cpu_readdata <= { ioreg_input[{cpu_address, 3'b111}], ioreg_input[{cpu_address, 3'b110}], ioreg_input[{cpu_address, 3'b101}], ioreg_input[{cpu_address, 3'b100}], ioreg_input[{cpu_address, 3'b011}], ioreg_input[{cpu_address, 3'b010}], ioreg_input[{cpu_address, 3'b001}], ioreg_input[{cpu_address, 3'b000}] }; end end или always_ff @(posedge g_clk_100MHz, negedge g_reset_n) begin if (!g_reset_n) begin cpu_readdata <= '0; cpu_readdatavalid <= 1'b0; end else begin cpu_readdatavalid <= cpu_read; if (cpu_address == 0) cpu_readdata <= reg0; else if (cpu_address == 1) cpu_readdata <= reg1; ... end end Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_sda 0 28 ноября, 2017 Опубликовано 28 ноября, 2017 · Жалоба 1. system.h там адрес этого бриджа Спасибо, туплю. 2. можно так (если регистры 32 разрядные например) always_ff @(posedge g_clk_100MHz, negedge g_reset_n) begin if (!g_reset_n) begin cpu_readdata <= '0; cpu_readdatavalid <= 1'b0; end else begin cpu_readdatavalid <= cpu_read; if (cpu_address == 0) cpu_readdata <= reg0; else if (cpu_address == 1) cpu_readdata <= reg1; ... end end Не ну с мультиплексором понятно, т.е. я ничего не выиграю. Ведь тоже самое можно сделать и с PIO. У меня регистры на разных уровнях иерархии по всему проекту разбросаны, это с каждого регистра тянуть шину к мультиплексору? При записи по проекту просто идёт шина и на неё вешается столько регистров, сколько потребуется. Так же хочется и при чтении. Т.е. нужен некий распределённый мультиплексор. Так не получится? На ум приходит только последовательное включение мультиплексоров, но это тоже не сахар. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Realking 0 28 ноября, 2017 Опубликовано 28 ноября, 2017 · Жалоба Спасибо, туплю. 2. можно так (если регистры 32 разрядные например) Не ну с мультиплексором понятно, т.е. я ничего не выиграю. Ведь тоже самое можно сделать и с PIO. У меня регистры на разных уровнях иерархии по всему проекту разбросаны, это с каждого регистра тянуть шину к мультиплексору? При записи по проекту просто идёт шина и на неё вешается столько регистров, сколько потребуется. Так же хочется и при чтении. Т.е. нужен некий распределённый мультиплексор. Так не получится? понятно... тогда, если разбросаны)) сделайте с Z состоянием (синтезатор их сам должен преобразовать в мультиплексор) с PIO просто код на С не красивый получается (а с бриджом эти регистры как память) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_sda 0 28 ноября, 2017 Опубликовано 28 ноября, 2017 · Жалоба понятно... тогда, если разбросаны)) сделайте с Z состоянием (синтезатор их сам должен преобразовать в мультиплексор) с PIO просто код на С не красивый получается (а с бриджом эти регистры как память) Почему? Write2BusFpga(ADR_SET_BAND,band); Но это дело вкуса. Большое спасибо за консультацию. Буду пробовать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться