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

Timmy

А можете поподробнее рассказать, как альтеровцы сделали однотактовое чтение из блочной памяти в ниосе?

Конкретно у альтеровцев, полагаю, классическая архитектура MIPS, по ней в Сети достаточно материала.

А по-простому, это можно сделать так: берутся две двухпортовых M9k, порты записи объединяются, в результате оба M9k содержат одинаковую информацию. А порты чтения независимо читают первый и второй операнды. Только необходимо, чтобы память поддерживала режим "сначала пишу, потом читаю", что означает, что при совпадении адресов чтения и записи на выходе должны появиться свежезаписанные данные. Поскольку M9K такой режим не поддерживает, придётся его эмулировать при помощи внешней обвески:

  reg [dw-1:0]bypass;
  req addr_eq;
  always @(posedge clk)begin
    addr_eq <= wr_addr == rd_addr;
    bypass <= wr_data;
  end
  assign rd_data = addr_eq? bypass: m9k_rd_data;

то есть, если адреса чтения и записи совпали, в следующем такте выход данных переключится с выхода m9k на bypass, который содержит свежие данные, которые сам m9k ещё не готов выдавать.

Такую обвеску надо независимо добавить к обоим M9k, работающим у нас параллельно. Странно, что это не умеет делать Мегавизард:).

 

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


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

Такую обвеску надо независимо добавить к обоим M9k, работающим у нас параллельно. Странно, что это не умеет делать Мегавизард:).

это умеет делать квартус сам, при синтезе памяти из описания, как рекомендовано в темплейтах

 

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


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

Из даташита на CycloneIII (для CycloneV то-же самое):

"Mixed-Port Read-During-Write Mode

This mode applies to a RAM in simple or true dual-port mode, which has one port reading and the other port writing to the same address location with the same clock. In this mode, you also have two output choices: Old Data mode or Don't Care mode. In Old Data mode, a read-during-write operation to different ports causes the RAM outputs to reflect the old data at that address location. In Don't Care mode, the same operation results in a “Don't Care” or unknown value on the RAM outputs."

 

А синтезировать память из описания Квартус не может, если есть сигнал разрешения клока.

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


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

В темплейтах 9.1 квартуса.

// Quartus II Verilog Template
// Simple Dual Port RAM with separate read/write addresses and
// single read/write clock

module simple_dual_port_ram_single_clock
#(parameter DATA_WIDTH=8, parameter ADDR_WIDTH=6)
(
    input [(DATA_WIDTH-1):0] data,
    input [(ADDR_WIDTH-1):0] read_addr, write_addr,
    input we, clk,
    output reg [(DATA_WIDTH-1):0] q
);

    // Declare the RAM variable
    reg [DATA_WIDTH-1:0] ram[2**ADDR_WIDTH-1:0];

    always @ (posedge clk)
    begin
        // Write
        if (we)
            ram[write_addr] <= data;

        // Read (if read_addr == write_addr, return OLD data).    To return
        // NEW data, use = (blocking write) rather than <= (non-blocking write)
        // in the write assignment.     NOTE: NEW data may require extra bypass
        // logic around the RAM.
        q <= ram[read_addr];
    end

endmodule

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


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

To return

// NEW data, use = (blocking write) rather than <= (non-blocking write)

// in the write assignment. NOTE: NEW data may require extra bypass

// logic around the RAM.

Ух ты, круто. Об этом я не знал, раньше в темплейтах было указано, что нужно было вручную через assign байпассить текущее входное значение.

И это всё конечно хорошо, но всё равно ни о каком чтении за один такт из синхронной памяти речи здесь не идёт. ) Защёлкивать данные по заднему фронту - это конечно решение, но вряд ли получится даже 100 МГц тактовая. Есть ли другие варианты? Как альтера сделала регистровый файл на М9К, если у неё латенси 1 такт, а для регистрового файла нужно 0?

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


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

Ух ты, круто. Об этом я не знал, раньше в темплейтах было указано, что нужно было вручную через assign байпассить текущее входное значение.

И это всё конечно хорошо, но всё равно ни о каком чтении за один такт из синхронной памяти речи здесь не идёт. ) Защёлкивать данные по заднему фронту - это конечно решение, но вряд ли получится даже 100 МГц тактовая. Есть ли другие варианты? Как альтера сделала регистровый файл на М9К, если у неё латенси 1 такт, а для регистрового файла нужно 0?

От регистрового файла не нужно 0, если правильно применять конвейер. Даже в моём вышеприведённом mica8 с двухступенчатым конвейером латентность регистрового файла 1. В первом такте/первой ступени выбирается код инструкции и номера регистров из этой инструкции подаются непосредственно на адресные входы модуля регистров, где будут защёлкнуты при смене тактов. Вскоре после начала следующего такта на выходе регистов будут необходимые значения, которые прогоняются через АЛУ, и к концу такта результат стабилизируется на входе данных записи регистрового файла. Из-за особенностей распределённой памяти удаётся обойтись двумя портами адреса, это особенно эффектно смотрится на Ксайлинксах.

 

А у Ниоса конвейер пятиступенчатый, там целый такт выделен на выборку из регистровой памяти и защёлкивание в FF непосредственно перед АЛУ.

 

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


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

к ~Elrond~

Вы намерены регистровый файл разместить в М9К?

Каков объем этого файла?

Если объем малый, то почему бы этот файл не разместить на регистрах?

 

Если все же остаться с М9К, то может сбрасывать часть данных из М9К в регистры, работать там с ними, а потом опять весь блок возвращать в М9К. Что-то типа кеша... Иначе только конвейер...

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


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

Serhiy_UA

Я знаю, что так сделано в ниосе, и мне интересно, как. Если конвейер - то это не интересно, так и я умею. )) Регистровый файл мне нужен в разных модулях разный, в зависимости от задачи. Обычно это 4-16 32-битных регистров, что в случае 16ти на LUT'ах делать довольно накладно.

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


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

Всем привет!

 

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

Потому кому не трудно напишите что особенного вы видите в регистрах, в сравнении например с РАМ. А там тему можно будет и развить.

 

 

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


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

Всем привет!

 

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

Потому кому не трудно напишите что особенного вы видите в регистрах, в сравнении например с РАМ. А там тему можно будет и развить.

быстрый + "без адресный" доступ.

алтернатива:

стек (форт)

spark (???) - там регистры отображены на общую память.

 

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


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

spark (???) - там регистры отображены на общую память.

 

кто такое сказал?

 

у спарка регистровый файл как в обычном ARM-е, просто он больше по размеру и рабочее окно "ездит" по этому файлу. собственно, цель всего этого как раз избавится от стека на общей памяти - то есть когда следуют call-call-return-return то рабочие регистры можно в стек не сохранять а оставлять, вызываемый код к ним доступа не имеет

 

 

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


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

быстрый + "без адресный" доступ.

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

 

быстрый-возможно, вот думаю 3 блока РАМ чтобы можно было делать R1 + R2 -> R3, а учитывая 2 портовость брамов интересная идея. И опять же уход от стека, можно младшие адреса - адрес регистра, а старшие - адрес страницы, вход в прерывание, перебросил адрес страницы и дальше погнали. Что я не учитываю?

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


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

По ссылкам видно вы проделали большую работу,

Основной вопрос имеет ли смысл регистры делать массивом на ЛУТах, если сделать их на БРАМах где возникнут сложности?

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


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

post-72596-1432062340_thumb.png

свободного выхода от этого регистра в BRAM-е напрямую обратно в матрицу - нету.

 

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

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


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

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

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

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

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

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

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

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

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

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