Перейти к содержанию
    

я делаю визардом из XPS компонент, обычно с верилоговским юзер файлом и с проектом ISE. Потом в ISE открываю проект, правлю файлы, добавляю сигналы в верхний модуль обертку, и провожу их в свой юзер. UCF и MHS не правлю, потом делаю имплемент том подуль, посел чего появляется xps проект, который импортится в платформ студию и уже имеет все нужные сигналы.

 

Только надо следить чтобы сигналы прерывания и клока спец словами снабжать в верхнем модуле, а то они таковыми не станут.

 

ISE виснет если переключится на русский язык после запуска любой процедуры ISE. То есть если только запустил ISE можно писать по русски, как только нажали чек синтез, симуляцию, или еще что-то, все... Любое переключение раскладки - висяк! Бесит, меня по контракту было раньше все комменты на русском, теперь привык, а ISE такую подлянку делает....

 

В ISE тоже можно делать компоненты хардварные, можно сделать память РАМ и ФИФО, оба эти компонента позволят быстро сохранить 500 слов...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

500 слов раз в секунду или чаще?

32р 400 слов ~16MГц , это как бы строка. затем новый адрес и повтор

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

32р 400 слов ~16MГц , это как бы строка. затем новый адрес и повтор

 

Разъясните, что означает ~16MГц?

 

Вы хотите передавать 16 000 000 раз в секунду 400 32-разрядных слов?

или 16 000 000 одно 32 разрядного слова,

или 16 мегабайт в сек

или 16 мегабит/сек?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Разъясните, что означает ~16MГц?

 

Вы хотите передавать 16 000 000 раз в секунду 400 32-разрядных слов?

или 16 000 000 одно 32 разрядного слова,

или 16 мегабайт в сек

или 16 мегабит/сек?

32р слово записывается с частотой 16МГц. таких слов 400. это записывается по одному начальному адресу. 9 разрядов. пусть с адреса 8000_0000 по 8000_01FF(если 512) . потом наращивается адрес для следующей строки еще 10разрядов с 10 по 19,. всего 19разрядов. это вся информация. может быть еще один или два разряда, чтобы следующую писать в другую область памяти. всего от 19 до 22разрядов адреса.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

32р слово записывается с частотой 16МГц. таких слов 400. это записывается по одному начальному адресу. 9 разрядов. пусть с адреса 8000_0000 по 8000_01FF(если 512) . потом наращивается адрес для следующей строки еще 10разрядов с 10 по 19,. всего 19разрядов. это вся информация. может быть еще один или два разряда, чтобы следующую писать в другую область памяти. всего от 19 до 22разрядов адреса.

 

Вы хотите сказать, что данные в Вашу плату вводятся по последовательному интерфейсу на частоте 16 МГц пакетами по 400 32битных слов? Если так, и если исходить из того, что пакеты поступают друг за другом встык, то поток данных получается 2 Мбайта в сек. Для нашего верианта построения проекта это максимально возможный поток. Мы недавно купили плату отладки AVNET, скачали с их сайта готовый проект, включающий тест пропускной способности. Там примерно так и получалось (несмотря на то, что там гигабитный Ethernet) . Это к тому, что возможно, система не будет успевать переработать ваши данные, и часть будет пропадать.

 

Чтобы переправить данные в DDR, записывать их в FIFO.

 

1. нужно найти в user_logic.vhd DATA_CAPTURE_FIFO_I. Там в качестве примера уже инстанциирован FIFO. Идея примера в том, что блэйз кладет данные в fifo и сам же их оттуда считывает. Нужно адаптировать пример под себя.

 

в DATA_CAPTURE_FIFO_I:

 

2. C_DEPTH заменяете на 400

3. к порту Data_In вместо того, что там написано, подключаете свои данные (32 bit)

4. управляете записью сигналом FIFO_Write.

5. Проверяйте состояние fifo сигналами FIFO_empty, FIFO_full и addr. Не допускайте переполнения.

 

В программе MicroBlaze:

 

6. Когда вы создавали ядро через визард, у вас в проекте должна была появиться папка drivers, в которой должны лежать примеры считывания из ядра. Должно быть что-то вроде AXI_mmm_core_MasterSendBytes (в зависимости от того, как вы назвали свое ядро).

 

Как-то так.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

на гигабитном езернете, в крайне не оптимальном режиме имею 29 Мегабит запись

и около 20 чтение. Это когда каждый пакет блокируется, то есть пока не обработается прошлый новый не лезет, и это на ЛвИП стеке. так что 2 мегобайта в секунду не предел, вроде как....

 

также у меня модуль фифо, который выдает по алгоритму данные, у меня поулчилось 7 тактов на запись в него 1 слова через акси-лите, и около 8 на выдачу, на самом деле из-за алгоритма, в целом около 2 тактов надо на чтение из фифо. При 100 МГц проце тоже весьма солидный поток.

 

Построить автомат который будет 400 входных слов собирать и перепихивать в фифо тоже вроде как не проблема для 16 МГц, правда если это не 16 мегаслов, а 16 мегабит:)... если же это мегослов 16 штук, то тогда ой...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3. к порту Data_In вместо того, что там написано, подключаете свои данные (32 bit)

4. управляете записью сигналом FIFO_Write.

т.е. к FIFO_Write тоже подключить свой сигнал?

и еще есть много вопросов по подключению.

Ведь для записи нужно задать адрес, количество записей и др. все это в mst_reg, а туда они из Bus2IP_Data. и как сюда попасть.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

такс...

ФИФО

 

это компонент с входом и выходом параллельная шина. и 2 строба запись чтение

и несколько сигналов.

клок

фифо полно

фифо почти полно

фифо пустое

в фифо лежит столько то строк.

 

Когда на входе строба записи появляется единица, с каждым положительным фронтом данные со входа попадают в фифо.

Аналогично с появление единицы на стробе чтения, с каждым фронтом клока на выходе появляются очередные данные.

количество данных в фифо также отмечается с каждым клоком.

 

это готовое ИП корка, которая добавляется через хардваре визард в исе или платформ студии...

 

я себе такое сделал, и в юзер_логик файле компонента его заюзал.

 

ФИФО не РАМ оно не адресуется, сначала все пихаете, а потом все забираете, это буфер.

 

В плис также можно сделать РАМ, если хотите адресовать, я не делал, мне не надо было, но в инете стандартный пример как раз делают таблицу РАМ.

 

 

Дальше если вы делаете из платформ студии через визард свой компонент. То там можно выбрать чтобы он имел регистры от 1 до 32 штук. И сразу создастся компонент с оберткой и всем необходимым для доступа. А в юзер логик будет уже написана часть отвечающая за чтение и запись регистров. Компонент уже сделан для подключения к акси шине. Все регистры что внутри компонента адресуются из вне, там в коментах написано как к ним достучаться.

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дальше если вы делаете из платформ студии через визард свой компонент. То там можно выбрать чтобы он имел регистры от 1 до 32 штук. И сразу создастся компонент с оберткой и всем необходимым для доступа. А в юзер логик будет уже написана часть отвечающая за чтение и запись регистров. Компонент уже сделан для подключения к акси шине. Все регистры что внутри компонента адресуются из вне, там в коментах написано как к ним достучаться.

создал в XPS компонент. выбрал чтобы он имел регистры от 1 до 32. и не нахожу ничего кроме

-- control register (byte 0)
        if ( mst_byte_we(0) = '1' ) then
          mst_reg(0) <= Bus2IP_Data(7 downto 0);
        end if;
        -- status register (byte 1)
        mst_reg(1)(1) <= mst_cmd_sm_busy;
        if ( mst_byte_we(1) = '1' ) then
          -- allows a clear of the 'Done'/'error'/'timeout'
          mst_reg(1)(0) <= Bus2IP_Data((1-(1/BE_WIDTH)*BE_WIDTH)*8);
          mst_reg(1)(2) <= Bus2IP_Data((1-(1/BE_WIDTH)*BE_WIDTH)*8+2);
          mst_reg(1)(3) <= Bus2IP_Data((1-(1/BE_WIDTH)*BE_WIDTH)*8+3);
        else
          -- 'Done'/'error'/'timeout' from master control state machine
          mst_reg(1)(0)  <= mst_cmd_sm_set_done or mst_reg(1)(0);
          mst_reg(1)(2)  <= mst_cmd_sm_set_error or mst_reg(1)(2);
          mst_reg(1)(3)  <= mst_cmd_sm_set_timeout or mst_reg(1)(3);
        end if;
        -- byte 2 and 3 are reserved
        -- address register (byte 4 to 7)
        -- be register (byte 8 to 9)
        -- length register (byte 12 to 13)
        -- byte 10, 11 and 14 are reserved
        for byte_index in 4 to 14 loop
          if ( mst_byte_we(byte_index) = '1' ) then
            mst_reg(byte_index) <= Bus2IP_Data(
                                     (byte_index-(byte_index/BE_WIDTH)*BE_WIDTH)*8+7 downto
                                     (byte_index-(byte_index/BE_WIDTH)*BE_WIDTH)*8);
          end if;
        end loop;
      end if;

я не вижу где здесь регистры?

или не там ищу, или еще чего-то не понимаю. этот компонент позволяет сделать (при написании дополнений в User_logic) задать нач.адрес записи,длину, принять данные и осуществлять запись в память?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Когда на входе строба записи появляется единица, с каждым положительным фронтом данные со входа попадают в фифо.

Аналогично с появление единицы на стробе чтения, с каждым фронтом клока на выходе появляются очередные данные.

количество данных в фифо также отмечается с каждым клоком.

 

Разве это FIFO работает по фронту? По-моему по уровню. Т.е. если fifo_write = '1', то данные из data_in на этом же цикле записываются в fifo.

 

на гигабитном езернете, в крайне не оптимальном режиме имею 29 Мегабит запись

и около 20 чтение. Это когда каждый пакет блокируется, то есть пока не обработается прошлый новый не лезет, и это на ЛвИП стеке. так что 2 мегобайта в секунду не предел, вроде как....

Вот что-то такое и было на тестовом проекте. В принципе если использовать драйвер Ethernet напрямую (на MAC-уровне), то по крайней мере в spartan3 удавалось разогнать скорость до 6-7 мегабайт в сек. Но тогда получается громоздкий софтовый проект, приходится самому делать ARP, ICMP и т.д.

 

Дальше если вы делаете из платформ студии через визард свой компонент. То там можно выбрать чтобы он имел регистры от 1 до 32 штук. И сразу создастся компонент с оберткой и всем необходимым для доступа. А в юзер логик будет уже написана часть отвечающая за чтение и запись регистров. Компонент уже сделан для подключения к акси шине. Все регистры что внутри компонента адресуются из вне, там в коментах написано как к ним достучаться.

Зачем нужны регистры, если речь идет о прокачке 2 MB/sec ? Если только для передачи медленных данных.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

то данные из data_in на этом же цикле записываются в fifo.

цикле чего?:) когда на врайте 1, то каждый такт клока данные записываются, и произойдет это по переднему фронту.

 

Вот что-то такое и было на тестовом проекте.

да я тоже планирую подразогнать, но сильно усугубляет ЛвИП, все же он много чего еще делает кроме передачи данных...

 

Зачем нужны регистры, если речь идет о прокачке 2 MB/sec ?

для удобства пользования.

 

я сделал модуль у которого с одной стороны доступ через акси, через регистры, пишеш в регистр, данные в фифо проваливаются, с другой стороны уже контакты к исполняемым устройствам и автомат управления.

 

 

мне когда я генерю такую штуку получаю такой файл, это уже помененный мной,

по умолчанию он регистрам дает имена reg_0 reg_1 ....

и адреса

00001

00010

00100

....

 

 // ------------------------------------------------------
  // Example code to read/write user logic slave model s/w accessible registers
  // 
  // Note:
  // The example code presented here is to show you one way of reading/writing
  // software accessible registers implemented in the user logic slave model.
  // Each bit of the Bus2IP_WrCE/Bus2IP_RdCE signals is configured to correspond
  // to one software accessible register by the top level template. For example,
  // if you have four 32 bit software accessible registers in the user logic,
  // you are basically operating on the following memory mapped registers:
  // 
  //    Bus2IP_WrCE/Bus2IP_RdCE   Memory Mapped Register
  //                     "1000"   C_BASEADDR + 0x0
  //                     "0100"   C_BASEADDR + 0x4
  //                     "0010"   C_BASEADDR + 0x8
  //                     "0001"   C_BASEADDR + 0xC
  // 
  // ------------------------------------------------------

  assign
    slv_reg_write_sel = Bus2IP_WrCE[10:0],
    slv_reg_read_sel  = Bus2IP_RdCE[10:0],
    slv_write_ack     = Bus2IP_WrCE[0] || Bus2IP_WrCE[1] || Bus2IP_WrCE[2] || Bus2IP_WrCE[3] || Bus2IP_WrCE[4] || Bus2IP_WrCE[5] || Bus2IP_WrCE[6] || Bus2IP_WrCE[7] || Bus2IP_WrCE[8] || Bus2IP_WrCE[9]  || Bus2IP_WrCE[10],
    slv_read_ack      = Bus2IP_RdCE[0] || Bus2IP_RdCE[1] || Bus2IP_RdCE[2] || Bus2IP_RdCE[3] || Bus2IP_RdCE[4] || Bus2IP_RdCE[5] || Bus2IP_RdCE[6] || Bus2IP_RdCE[7] || Bus2IP_RdCE[8] || Bus2IP_RdCE[9]  || Bus2IP_RdCE[10];

  // implement slave model register(s)
  always @( posedge Bus2IP_Clk )
    begin

      if ( Bus2IP_Resetn == 1'b0 )
        begin
                    fifo_write_signal <= 0;
          command_reg <= 0;
          path_data_reg <= 0;
          start_step_time_reg <= 0;
          max_step_time_reg <= 0;
          min_step_time_reg <= 0;
          step_time_plus_reg <= 0;
          step_time_minus_reg <= 0;
          stop_path_length <= 0;
          step_len <= 0;
                    dir_len <= 0;
                    STATUS_ADDR <= MAIN_STATUS;
        end
      else
                begin
                    //сбрасываем флаг если нет сигнала записи в данные пути
                    if(slv_reg_write_sel !=  11'b0000000010)
                        fifo_write_signal <= 2'b00;    

                    case ( slv_reg_write_sel )
                        STATUS_REG_CE : //запись в регистр статуса - выбор регистра
                            begin
                                if ( Bus2IP_BE[0] == 1 ) //только младший байт
                                    STATUS_ADDR <=  Bus2IP_Data[STATUS_ADR_SIZE - 1 : 0];
                            end
                        COMMAND_REG_CE :
                            for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
                                if ( Bus2IP_BE[byte_index] == 1 )
                                    command_reg[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
                        PATH_DATA_REG_CE :
                            begin
                                for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
                                    if ( Bus2IP_BE[byte_index] == 1 )
                                        path_data_reg[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
                                
                                //по клоку надо выдать строб на запись в фифо
                                if(fifo_write_signal == 0)
                                    fifo_write_signal <= 2'b01;
                                //по следующему клоку надо снять строб, но не поставить заново если будет еще клок
                                else if (fifo_write_signal == 2'b01)
                                    fifo_write_signal <= 2'b10;
                                //когда убиреться разрешение на запись, флаг сброситься в 0    
                            end            
                        START_STEP_REG_CE :
                            for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
                                if ( Bus2IP_BE[byte_index] == 1 )
                                    start_step_time_reg[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
                        MAX_STEP_REG_CE :
                            for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
                                if ( Bus2IP_BE[byte_index] == 1 )
                                    max_step_time_reg[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
                        MIN_STEP_REG_CE :
                            for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
                                if ( Bus2IP_BE[byte_index] == 1 )
                                    min_step_time_reg[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
                        PLUS_STEP_REG_CE :
                            for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
                                if ( Bus2IP_BE[byte_index] == 1 )
                                    step_time_plus_reg[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
                        MINUS_STEP_REG_CE :
                            for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
                                if ( Bus2IP_BE[byte_index] == 1 )
                                    step_time_minus_reg[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
                        STOP_PATH_REG_CE :
                            for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
                                if ( Bus2IP_BE[byte_index] == 1 )
                                    stop_path_length[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
                        STEP_LEN_REG_CE :
                            for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
                                if ( Bus2IP_BE[byte_index] == 1 )
                                    step_len[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
                        STEP_DIR_REG_CE :
                            for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
                                if ( Bus2IP_BE[byte_index] == 1 )
                                    dir_len[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
                        default :
                            begin
                            end
                    endcase
                end    
    end // SLAVE_REG_WRITE_PROC

  // implement slave model register read mux
  always @( slv_reg_read_sel or status_reg or command_reg or path_data_reg or start_step_time_reg or max_step_time_reg or min_step_time_reg or step_time_plus_reg or step_time_minus_reg or stop_path_length or step_len or dir_len)
    begin 
      case ( slv_reg_read_sel )
        STATUS_REG_CE : slv_ip2bus_data <= status_reg;
        COMMAND_REG_CE : slv_ip2bus_data <= command_reg;
        PATH_DATA_REG_CE : slv_ip2bus_data <= path_data_reg;
        START_STEP_REG_CE : slv_ip2bus_data <= start_step_time_reg;
        MAX_STEP_REG_CE : slv_ip2bus_data <= max_step_time_reg;
        MIN_STEP_REG_CE : slv_ip2bus_data <= min_step_time_reg;
        PLUS_STEP_REG_CE : slv_ip2bus_data <= step_time_plus_reg;
        MINUS_STEP_REG_CE : slv_ip2bus_data <= step_time_minus_reg;
        STOP_PATH_REG_CE : slv_ip2bus_data <= stop_path_length;
        STEP_LEN_REG_CE : slv_ip2bus_data <= step_len;
                STEP_DIR_REG_CE : slv_ip2bus_data <= dir_len;
        default : slv_ip2bus_data <= 0;
      endcase

    end // SLAVE_REG_READ_PROC

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я сделал модуль у которого с одной стороны доступ через акси, через регистры, пишеш в регистр, данные в фифо проваливаются, с другой стороны уже контакты к исполняемым устройствам и автомат управления.

 

 

мне когда я генерю такую штуку получаю такой файл, это уже помененный мной,

по умолчанию он регистрам дает имена reg_0 reg_1 ....

и адреса

00001

00010

00100

....

да такой код есть . буду разбираться. я так понимаю , что он для записи и чтения ФИФО. а вот после него идет другая часть. для инициализации и запуска одиночной записи. я то думал , что нужно ей пользоваться для реализации алгоритма записи с помощью этого компонента. только не одиночной как в примере ,а Burst Write Transaction . как Figure 10: Example Burst Write Transaction Timing DS844.

//  ------------------------------------------
// Example code to demonstrate user logic master model functionality
// 
// Note:
// The example code presented here is to show you one way of instatiating
// the AXI4 (Burst) master interface under user control. It is provided for
// demonstration purposes only and allows the user to exercise the AXI4 (Burst)
// master interface during test and evaluation of the template.
// This user logic master model contains a 16-byte flattened register and
// the user is required to initialize the value to desire and then write to
// the model's 'Go' port to initiate the user logic master operation.
//
//    Control Register     (C_BASEADDR + OFFSET + 0x0):
//       bit 0    - Rd     (Read Request Control)
//       bit 1    - Wr     (Write Request Control)
//       bit 2    - BL     (Bus Lock Control)
//       bit 3    - Brst   (Burst Assertion Control)
//       bit 4-7  - Spare  (Spare Control Bits)
//    Status Register      (C_BASEADDR + OFFSET + 0x1):
//       bit 0    - Done   (Transfer Done Status)
//       bit 1    - Busy   (User Logic Master is Busy)
//       bit 2    - Error  (User Logic Master request got error response)
//       bit 3    - Tmout  (User Logic Master request is timeout)
//       bit 2-7  - Spare  (Spare Status Bits)
//    Addrress Register    (C_BASEADDR + OFFSET + 0x4):
//       bit 0-31 - Target Address (This 32-bit value is used to populate the
//                  ip2bus_Mst_Addr(0:31) address bus during a Read or Write
//                  user logic master operation)
//    Byte Enable Register (C_BASEADDR + OFFSET + 0x8):
//       bit 0-15 - Master BE (This 16-bit value is used to populate the
//                  ip2bus_Mst_BE byte enable bus during a Read or Write user
//                  logic master operation for single data beat transfer)
//    Length Register      (C_BASEADDR + OFFSET + 0xC):
//       bit 0-3  - Reserved
//       bit 4-15 - Transfer Length (This 12-bit value is used to populate the
//                  ip2bus_Mst_Length(0:11) transfer length bus which specifies
//                  the number of bytes (1 to 4095) to transfer during user logic
//                  master Read or Write fixed length burst operations)
//    Go Register          (C_BASEADDR + OFFSET + 0xF):
//       bit 0-7  - Go Port (Write to this byte address initiates the user
//                  logic master transfer, data key value of 0x0A must be used)
// 
//    Note: OFFSET may be different depending on your address space configuration,
//          by default it's 0x100. Refer to IPIF address range array
//          for actual value.
// 
// Here's an example procedure in your software application to initiate a 64-byte
// read operation (single data beat) of this master model:
//    1. write 0x09 to the control register to perform write operation.
//    2. write the target address to the address register.
//    3. write valid byte lane value to the be register
//      - note: this value must be aligned with ip2bus address  
//    4. write 0x040 to the length register
//    5. write 0x0a to the go register, this will start the master write operation
//
// Here's an example procedure in your software application to initiate a 64-byte
// write operation (single data beat) of this master model:
//   1. write 0x0A to the control register to perform write operation.
//   2. write the target address to the address register
//   3. write valid byte lane value to the be register
//      - note: this value must be aligned with ip2bus address
//   4. write 0x0040 to the length register
//   5. write 0x0a to the go register, this will start the master write operation
// 
//----------------------------------------
  assign mst_reg_write_req = Bus2IP_WrCE[10] || Bus2IP_WrCE[11] || Bus2IP_WrCE[12] || Bus2IP_WrCE[13];
  assign mst_reg_read_req  = Bus2IP_RdCE[10] || Bus2IP_RdCE[11] || Bus2IP_RdCE[12] || Bus2IP_RdCE[13];
  assign mst_reg_write_sel = Bus2IP_WrCE[13 : 10];
  assign mst_reg_read_sel  = Bus2IP_RdCE[13 : 10];
  assign mst_write_ack     = mst_reg_write_req;
  assign mst_read_ack      = mst_reg_read_req;

  // rip control bits from master model registers
  assign mst_cntl_rd_req   = mst_reg[0][0];
  assign mst_cntl_wr_req   = mst_reg[0][1];
  assign mst_cntl_bus_lock = mst_reg[0][2];
  assign mst_cntl_burst    = mst_reg[0][3];
  assign mst_ip2bus_addr   = {mst_reg[7], mst_reg[6], mst_reg[5], mst_reg[4]};
  assign mst_ip2bus_be     = {mst_reg[9], mst_reg[8]};
  assign mst_xfer_reg_len  = {mst_reg[14][3 : 0], mst_reg[13], mst_reg[12]};// changed to 20 bits 
  assign mst_xfer_length   = mst_xfer_reg_len[C_LENGTH_WIDTH-1 : 0];

  // implement byte write enable for each byte slice of the master model registers
  always @ (Bus2IP_BE or mst_reg_write_req or mst_reg_write_sel)
    begin
      for ( byte_index = 0; byte_index <= 15; byte_index = byte_index+1 )
        mst_byte_we[byte_index] <= mst_reg_write_req & mst_reg_write_sel[3 - (byte_index/BE_WIDTH)] & Bus2IP_BE[byte_index - ((byte_index/BE_WIDTH)*BE_WIDTH)];
    end // MASTER_REG_BYTE_WR_EN
  // implement master model registers
  // The master registers are written to initialize master transfer.
  always @ ( posedge Bus2IP_Clk)
    begin
    if (Bus2IP_Resetn == 1'b0 )
      begin
        for ( byte_index = 0; byte_index <= 14; byte_index = byte_index+1 ) 
          mst_reg[byte_index] <= 0;
      end
    else 
      begin 
          if ( mst_byte_we[0] == 1'b1 )
            begin
              mst_reg[0][7:0] <= Bus2IP_Data[7 : 0];
            end
          
             mst_reg[1][1] <= mst_cmd_sm_busy;  
      
          if (mst_byte_we[1] == 1'b1 )
          // allows a clear of the 'Done'/'error'/'timeout'
            begin
              mst_reg[1][0] <= Bus2IP_Data[(1-(1/BE_WIDTH)*BE_WIDTH)*8];
              mst_reg[1][2] <= Bus2IP_Data[(1-(1/BE_WIDTH)*BE_WIDTH)*8+2];
              mst_reg[1][3] <= Bus2IP_Data[(1-(1/BE_WIDTH)*BE_WIDTH)*8+3];
            end
        else
          // 'Done'/'error'/'timeout' from master control state machine
          begin
             mst_reg[1][0]  <= mst_cmd_sm_set_done | mst_reg[1][0];
             mst_reg[1][2]  <= mst_cmd_sm_set_error | mst_reg[1][2];
             mst_reg[1][3]  <= mst_cmd_sm_set_timeout | mst_reg[1][3];
           end
             // byte 2 and 3 are reserved
             // address register (byte 4 to 7)
             // be register (byte 8 to 9)
             // length register (byte 12 to 13)
             // byte 10, 11 and 14 are reserved
         for ( byte_index = 4; byte_index <= 14; byte_index = byte_index+1 )
           if ( mst_byte_we[byte_index] == 1'b1 )
             begin
               mst_reg[byte_index] <= Bus2IP_Data[(byte_index-(byte_index/BE_WIDTH)*BE_WIDTH)*8 +: 8];
             end
      end
    end // MASTER_REG_WRITE_PROC

 

 

в примере есть код

 STEP_LEN_REG_CE :
                            for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
                                if ( Bus2IP_BE[byte_index] == 1 )
                                    step_len[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];

что в результате получается. не конкретно в этом. не понятно в целом. т.е. из неизвестного (так ли это?) Bus2IP_Data,ведь он из другого модуля axi_lite_ipif получается нужный сигнал. этот же вопрос возникает и в MASTER_REG_BYTE_WR_EN.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

сдается мне у кого-то полная путаница в голове:)..

 

 

создайте сначала компонент без браст записи, для акси лайт шины, для слейв модуля.

 

сделайте так чтобы из проца вы в него писали, а от этого загорались лампочки, и чтобы вы нажимали кнопочки, а от этого по заданному адресу данные менялись. И вы все поймете как оно устроено.

 

глобально компонент это

 

1. Модуль обертка - который вешается на шину внутри содержит:

1.1 вспомогательный модуль который работает с шиной и преобразует ее сложные сигналы в понятный набор сигналов

Bus2IP - бас ту айпи, от шины к вам и

IP2Bus - обратно

клоки чипселекты, и прочие вспомогательные сигналы.

1.2 Пользовательский модуль, куда заведены эти понятные сигналы

 

Последний сделан для вас, для редактирования. Изначально он не содержит ничего кроме набора регистров с прописанным примером их чтения и записи.

 

Дальше вы в него пихаете компоненты, написанные вами прочие модули, и все все все что вам надо. И делаете управление всем этим через регистры. И выдачу данных обратно через регистры. и все.

 

Также не воспрещается добавлять прочие как входные, так и выходные сигналы, их надо добавить и в пользовательском модуле и в модуле обертке, и соединить в модуле обертке...

 

Также в модуль обертки можно добавить еще пользовательский модуль если это надо...

 

Только надо понимать что это все для взаимодействия вашего модуля с микроблайзом, а если микроблайза нет, то и с шиной париться не надо, и можно писать обычный плисовый не процессорный модуль, что иногда бывает проще... без регистров, оберток и прочеее

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

создал в XPS компонент. выбрал чтобы он имел регистры от 1 до 32. и не нахожу ничего кроме

-- control register (byte 0)
        if ( mst_byte_we(0) = '1' ) then
          mst_reg(0) <= Bus2IP_Data(7 downto 0);
....

я не вижу где здесь регистры?

Ну так mst_reg это и есть регистры.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...