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

Заставить Quartus использовать блочную память

Quartus 8.1, ПЛИС FLEX10KE (5576ХС4Т)

Ожидал, что синтезируется на блочной памяти, но нет...

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

module GF_ALU
  #(
    parameter m = 4, // Степень образующего многочлена.
    parameter f = 'b1001 // Образующий многочлен.
  )
  (
    input wire clk,
    input wire [m - 1:0] A,
    input wire [m - 1:0] B,
    output reg [m - 1:0] Y
  );
  
  integer i, j;
  integer n;
  integer GF;
  integer feedback;
  
  integer GF_exp [(1 << m) - 2:0];
  integer GF_log [(1 << m) - 1:1];

  reg [m - 1:0] MUL_Table [(1 << m) - 1:0][(1 << m) - 1:0];
  
  initial begin
    n = (1 << m) - 1;
    GF = 1;
    for (i = 0; i < n; i = i + 1) begin
      GF_exp[i] = GF;
      GF_log[GF] = i;
      feedback = (GF >> (m - 1)) & 1;
      if (feedback) begin
        GF = GF ^ f;
      end
      GF = ((GF << 1) | feedback) & n;
    end
    
    for (i = 0; i < (1 << m); i = i + 1) begin
      for (j = 0; j < (1 << m); j = j + 1) begin
        if (i == 0 || j == 0)
          MUL_Table[i][j] = 0;
        else
          MUL_Table[i][j] = GF_exp[(GF_log[i] + GF_log[j]) % n];
      end
    end
  end
  
  always @(posedge clk) begin
    Y = MUL_Table[A][B];
  end
  
endmodule

Да, тут лучше сделать конвейерную схему, но пока хочется сделать так.

Или стоит все это сделать совсем по другому?

Изменено пользователем shn

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


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

Quartus 8.1, ПЛИС FLEX10KE (5576ХС4Т)

Ожидал, что синтезируется на блочной памяти, но нет...

Ква старый, может не понимать многомерные ROM, сделайте одномерную. Если не поможет, то классически. Через предварительный расчет таблиц.

 

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


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

Одномерный массив не помогает.

Попробовал сделать умножитель на константу Y = MUL_Table[A][константа]; (для кодера Рида-Соломона). Результат синтеза неплохой, но при 7-ой степени многочлена квартус очень долго это синтезирует, а с 8-ой степенью не дождался результата.

При этом никакой избыточности, задержки везде маленькие ~15 нс. Обидно. Что он так долго может считать? Modelsim этот массив считает мгновенно.

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


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

Одномерный массив не помогает.

Попробовал сделать умножитель на константу Y = MUL_Table[A][константа]; (для кодера Рида-Соломона). Результат синтеза неплохой, но при 7-ой степени многочлена квартус очень долго это синтезирует, а с 8-ой степенью не дождался результата.

При этом никакой избыточности, задержки везде маленькие ~15 нс. Обидно. Что он так долго может считать? Modelsim этот массив считает мгновенно.

Я сталкивался с тем, что Квартус очень долго синтезирует inferred ROM в блочной памяти, даже если считать ничего не надо - ROM была описана одним битовым вектором. Так что пришлось использовать мегафункцию и генерировать HEX файл для инициализации специальным скриптом.

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


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

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

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

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

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

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

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

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

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

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