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

Сразу ставлю в известность, что в Verilog-е я совсем не специалист, но много раз пытался использовать уже готовые модули, написанные на этом языке. В частности модули, которые генерит MegaWizard в Quartus-е. Также пробовал использовать готовые верилоговские коры c opensource.org. Результаты всякий раз оказывались неудовлетворительными по следующим причинам:

 

-1. Верилог занимал ресурсов FPGA примерно в 1.5 раза больше, чем эквивалентная схема на AHDL.

-2. Производительность(Timing Analyzer) схемы оказывалась на верилоге ниже примерно в 2раза, чем эквивалентная схема на AHDL.

-3. Возникала очень несимпатичная "разбежка" фронтов на шинах данных.

 

Поскольку я не специалист и использую модули на верилоге "as is", без вникания в их нутро, то вопрос собственно в следующем- требуют ли чужие, якобы готовые модули на верилоге какой-то особенной доработки, вставления таинственных ключевых слов и аттрибутов, чтобы заставить компилятор производить более эффективные разводки проектов, сравнимые с AHDL ?

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


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

По всем трем пунктам сильно сомневаюсь.

Если вы говорите, что модули эквивалентны, то результаты синтеза будут одинаковы.

Т.е. п.1 отпадает сразу.

 

Пункты 2 и 3 - работа place & route по синтезированной схеме. Соответственно если схемы одинаковы, то и P&R отработает одинаково.

 

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

 

Ну а

требуют ли чужие, якобы готовые модули на верилоге какой-то особенной доработки, вставления таинственных ключевых слов и аттрибутов
то для P&R нет, а для изменения функциональности - естественно да.

Изменение функциональности конечно же повлияет и на результаты трассировки.

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

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


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

-1. Верилог занимал ресурсов FPGA примерно в 1.5 раза больше, чем эквивалентная схема на AHDL.

 

Не верю, пример для тестовых испытаний в студию. В отличие на ~10% я может быть еще и поверю (спасибо SM), но и то только за счет оптимизации в ручную с учетом топологии целевой фпга.

 

Если вы утверждаете про 50% ИМХО вы просто не умеете его готовить. %)

 

В частности модули, которые генерит MegaWizard в Quartus-е. Также пробовал использовать готовые верилоговские коры c opensource.org.

 

Будте добры, приведите пример функционально одинаковых модулей из мега визарда и ваш на AHDL, который показывает такие результаты.

 

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

Т.к. в первую очередь это реклама-демка идеи/подхода реализации, а уже потом продукт. Хотя некоторые авторы в следующих ревизиях точат свои корки на оптимальность.

 

 

Давно не брал я в руки AHDL, жду ваши примеры. Спасибо!!! %)

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


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

Будте добры, приведите пример функционально одинаковых модулей из мега визарда и ваш на AHDL, который показывает такие результаты.

Из Wizzard-а исходники на верилоге не могу, т.к. исходники OpenCore зашифрованы. Однако, точно известно, что они сгенерились на верилоге. Например, простейшая мегафункция вычисления CRC32 из под Альтеровского визарда после компиляции и разводки дает примерно в 2 раза больше используемых Ljgic Element, чем свой эквивалентно функциональный модуль на AHDL вычисления той же самой CRC32. Про быстродействие вообще атас! У верилоговского варианта задержка результата в 4 клока, а в AHDL- результат непосредственно на следующем клоке.

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

Т.к. в первую очередь это реклама-демка идеи/подхода реализации, а уже потом продукт. Хотя некоторые авторы в следующих ревизиях точат свои корки на оптимальность.

Давно не брал я в руки AHDL, жду ваши примеры. Спасибо!!! %)

Безуспешная возня с альтеровской коркой CRC на верилоге обратила меня к другим готовым решениям. Я нашел генератор функций CRC и сгенерил себе нужный модуль на верилоге. Вот он:

module CRC32_data8 (
                                  clk,
                                  rstn,
                                  enable,
                                  init,
                                  
                                  D,         //DataIn
                                  CRC,       //CRC
                                  match      //set if CRC=0
                                  );

input  clk;
input  rstn;
input  enable;
input  init;

input  [7:0] D;
output [31:0] CRC;
output  match;


wire  [31:0] C;
wire  [31:0] NewCRC;
reg   [31:0] CRC;
reg    match;


always @ (posedge clk or negedge rstn)
begin
  if(!rstn) begin
    CRC [31:0] <= {32{1'b1}};
    match   <= 1'b0;
  end
  else
    begin
      if(init) begin
           CRC [31:0] <=  {32{1'b1}};
            match <= 1'b0;
      end
      else
    if(enable)
        begin
          CRC <= NewCRC;
          if (CRC==32'd0) match<=1'b1; else match<=1'b0;
        end
        end
end


assign C = CRC;

assign NewCRC[0] = D[6] ^ D[0] ^ C[30] ^ C[24];
assign NewCRC[1] = D[7] ^ D[6] ^ D[1] ^ D[0] ^ C[31] ^ C[30] ^ C[25] ^ C[24];
assign NewCRC[2] = D[7] ^ D[6] ^ D[2] ^ D[1] ^ D[0] ^ C[31] ^ C[30] ^ C[26] ^ C[25] ^ C[24];
assign NewCRC[3] = D[7] ^ D[3] ^ D[2] ^ D[1] ^ C[31] ^ C[27] ^ C[26] ^ C[25];
assign NewCRC[4] = D[6] ^ D[4] ^ D[3] ^ D[2] ^ D[0] ^ C[30] ^ C[28] ^ C[27] ^ C[26] ^ C[24];
assign NewCRC[5] = D[7] ^ D[6] ^ D[5] ^ D[4] ^ D[3] ^ D[1] ^ D[0] ^ C[31] ^ C[30] ^ C[29] ^ C[28] ^ C[27] ^ C[25] ^ C[24];
assign NewCRC[6] = D[7] ^ D[6] ^ D[5] ^ D[4] ^ D[2] ^ D[1] ^ C[31] ^ C[30] ^ C[29] ^ C[28] ^ C[26] ^ C[25];
assign NewCRC[7] = D[7] ^ D[5] ^ D[3] ^ D[2] ^ D[0] ^ C[31] ^ C[29] ^ C[27] ^ C[26] ^ C[24];
assign NewCRC[8] = D[4] ^ D[3] ^ D[1] ^ D[0] ^ C[28] ^ C[27] ^ C[25] ^ C[24] ^ C[0];
assign NewCRC[9] = D[5] ^ D[4] ^ D[2] ^ D[1] ^ C[29] ^ C[28] ^ C[26] ^ C[25] ^ C[1];
assign NewCRC[10] = D[5] ^ D[3] ^ D[2] ^ D[0] ^ C[2] ^ C[29] ^ C[27] ^ C[26] ^ C[24];
assign NewCRC[11] = D[4] ^ D[3] ^ D[1] ^ D[0] ^ C[3] ^ C[28] ^ C[27] ^ C[25] ^ C[24];
assign NewCRC[12] = D[6] ^ D[5] ^ D[4] ^ D[2] ^ D[1] ^ D[0] ^ C[4] ^ C[30] ^ C[29] ^ C[28] ^ C[26] ^ C[25] ^ C[24];
assign NewCRC[13] = D[7] ^ D[6] ^ D[5] ^ D[3] ^ D[2] ^ D[1] ^ C[5] ^ C[31] ^ C[30] ^ C[29] ^ C[27] ^ C[26] ^ C[25];
assign NewCRC[14] = D[7] ^ D[6] ^ D[4] ^ D[3] ^ D[2] ^ C[6] ^ C[31] ^ C[30] ^ C[28] ^ C[27] ^ C[26];
assign NewCRC[15] = D[7] ^ D[5] ^ D[4] ^ D[3] ^ C[7] ^ C[31] ^ C[29] ^ C[28] ^ C[27];
assign NewCRC[16] = D[5] ^ D[4] ^ D[0] ^ C[8] ^ C[29] ^ C[28] ^ C[24];
assign NewCRC[17] = D[6] ^ D[5] ^ D[1] ^ C[9] ^ C[30] ^ C[29] ^ C[25];
assign NewCRC[18] = D[7] ^ D[6] ^ D[2] ^ C[31] ^ C[30] ^ C[26] ^ C[10];
assign NewCRC[19] = D[7] ^ D[3] ^ C[31] ^ C[27] ^ C[11];
assign NewCRC[20] = D[4] ^ C[28] ^ C[12];
assign NewCRC[21] = D[5] ^ C[29] ^ C[13];
assign NewCRC[22] = D[0] ^ C[24] ^ C[14];
assign NewCRC[23] = D[6] ^ D[1] ^ D[0] ^ C[30] ^ C[25] ^ C[24] ^ C[15];
assign NewCRC[24] = D[7] ^ D[2] ^ D[1] ^ C[31] ^ C[26] ^ C[25] ^ C[16];
assign NewCRC[25] = D[3] ^ D[2] ^ C[27] ^ C[26] ^ C[17];
assign NewCRC[26] = D[6] ^ D[4] ^ D[3] ^ D[0] ^ C[30] ^ C[28] ^ C[27] ^ C[24] ^ C[18];
assign NewCRC[27] = D[7] ^ D[5] ^ D[4] ^ D[1] ^ C[31] ^ C[29] ^ C[28] ^ C[25] ^ C[19];
assign NewCRC[28] = D[6] ^ D[5] ^ D[2] ^ C[30] ^ C[29] ^ C[26] ^ C[20];
assign NewCRC[29] = D[7] ^ D[6] ^ D[3] ^ C[31] ^ C[30] ^ C[27] ^ C[21];
assign NewCRC[30] = D[7] ^ D[4] ^ C[31] ^ C[28] ^ C[22];
assign NewCRC[31] = D[5] ^ C[29] ^ C[23];

endmodule

Quаrtus это воспринял без малейших возражений и выдал разводку, например, для Cyclone. Я стал делать тестовые прогоны одного этого модуля и увидел торможение и "разбежку" фронтов на выходе CRC32. Причину этого выяснить мне не по силам, т.к. я не специалист в верилоге и особенностях компиляции и разводки с этого языка. Поэтому я просто взял и переписал вышеприведенный текст на AHDL, получил полностью функционально эквивалентную схему. Вот она:

SUBDESIGN CRC32_data8
(    clk, D[7..0], enable, init : INPUT= GND;
    CRC[31..0]: OUTPUT;
)
VARIABLE
NewCRC[31..0]: node;
CRC[31..0]: dffe;

BEGIN
CRC[].clk=clk;
IF init THEN CRC[]=H"FFFFFFFF"; CRC[].ena=VCC;
ELSE CRC[]=NewCRC[]; CRC[].ena=enable;
END IF;

NewCRC[0] = D[6] xor D[0] xor CRC[30] xor CRC[24];
NewCRC[1] = D[7] xor D[6] xor D[1] xor D[0] xor CRC[31] xor CRC[30] xor CRC[25] xor CRC[24];
NewCRC[2] = D[7] xor D[6] xor D[2] xor D[1] xor D[0] xor CRC[31] xor CRC[30] xor CRC[26] xor CRC[25] xor CRC[24];
NewCRC[3] = D[7] xor D[3] xor D[2] xor D[1] xor CRC[31] xor CRC[27] xor CRC[26] xor CRC[25];
NewCRC[4] = D[6] xor D[4] xor D[3] xor D[2] xor D[0] xor CRC[30] xor CRC[28] xor CRC[27] xor CRC[26] xor CRC[24];
NewCRC[5] = D[7] xor D[6] xor D[5] xor D[4] xor D[3] xor D[1] xor D[0] xor CRC[31] xor CRC[30] xor CRC[29] xor CRC[28] xor CRC[27] xor CRC[25] xor CRC[24];
NewCRC[6] = D[7] xor D[6] xor D[5] xor D[4] xor D[2] xor D[1] xor CRC[31] xor CRC[30] xor CRC[29] xor CRC[28] xor CRC[26] xor CRC[25];
NewCRC[7] = D[7] xor D[5] xor D[3] xor D[2] xor D[0] xor CRC[31] xor CRC[29] xor CRC[27] xor CRC[26] xor CRC[24];
NewCRC[8] = D[4] xor D[3] xor D[1] xor D[0] xor CRC[28] xor CRC[27] xor CRC[25] xor CRC[24] xor CRC[0];
NewCRC[9] = D[5] xor D[4] xor D[2] xor D[1] xor CRC[29] xor CRC[28] xor CRC[26] xor CRC[25] xor CRC[1];
NewCRC[10] = D[5] xor D[3] xor D[2] xor D[0] xor CRC[2] xor CRC[29] xor CRC[27] xor CRC[26] xor CRC[24];
NewCRC[11] = D[4] xor D[3] xor D[1] xor D[0] xor CRC[3] xor CRC[28] xor CRC[27] xor CRC[25] xor CRC[24];
NewCRC[12] = D[6] xor D[5] xor D[4] xor D[2] xor D[1] xor D[0] xor CRC[4] xor CRC[30] xor CRC[29] xor CRC[28] xor CRC[26] xor CRC[25] xor CRC[24];
NewCRC[13] = D[7] xor D[6] xor D[5] xor D[3] xor D[2] xor D[1] xor CRC[5] xor CRC[31] xor CRC[30] xor CRC[29] xor CRC[27] xor CRC[26] xor CRC[25];
NewCRC[14] = D[7] xor D[6] xor D[4] xor D[3] xor D[2] xor CRC[6] xor CRC[31] xor CRC[30] xor CRC[28] xor CRC[27] xor CRC[26];
NewCRC[15] = D[7] xor D[5] xor D[4] xor D[3] xor CRC[7] xor CRC[31] xor CRC[29] xor CRC[28] xor CRC[27];
NewCRC[16] = D[5] xor D[4] xor D[0] xor CRC[8] xor CRC[29] xor CRC[28] xor CRC[24];
NewCRC[17] = D[6] xor D[5] xor D[1] xor CRC[9] xor CRC[30] xor CRC[29] xor CRC[25];
NewCRC[18] = D[7] xor D[6] xor D[2] xor CRC[31] xor CRC[30] xor CRC[26] xor CRC[10];
NewCRC[19] = D[7] xor D[3] xor CRC[31] xor CRC[27] xor CRC[11];
NewCRC[20] = D[4] xor CRC[28] xor CRC[12];
NewCRC[21] = D[5] xor CRC[29] xor CRC[13];
NewCRC[22] = D[0] xor CRC[24] xor CRC[14];
NewCRC[23] = D[6] xor D[1] xor D[0] xor CRC[30] xor CRC[25] xor CRC[24] xor CRC[15];
NewCRC[24] = D[7] xor D[2] xor D[1] xor CRC[31] xor CRC[26] xor CRC[25] xor CRC[16];
NewCRC[25] = D[3] xor D[2] xor CRC[27] xor CRC[26] xor CRC[17];
NewCRC[26] = D[6] xor D[4] xor D[3] xor D[0] xor CRC[30] xor CRC[28] xor CRC[27] xor CRC[24] xor CRC[18];
NewCRC[27] = D[7] xor D[5] xor D[4] xor D[1] xor CRC[31] xor CRC[29] xor CRC[28] xor CRC[25] xor CRC[19];
NewCRC[28] = D[6] xor D[5] xor D[2] xor CRC[30] xor CRC[29] xor CRC[26] xor CRC[20];
NewCRC[29] = D[7] xor D[6] xor D[3] xor CRC[31] xor CRC[30] xor CRC[27] xor CRC[21];
NewCRC[30] = D[7] xor D[4] xor CRC[31] xor CRC[28] xor CRC[22];
NewCRC[31] = D[5] xor CRC[29] xor CRC[23];

END;

Как видите, ничем не отличается даже на уровне операторов. А занимает ячеек в FPGA в 1.5 раза меньше! Быстродействие в 2 раза выше.! И никакой "разбежки" на фронтах!

С нетерпением жду ваших комментариев. :)

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


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

Насколько я понимаю в гинекологии этого дела ;) разница в том, что в верилоговском коде применяются 2 фронта (clk и rstn), а в ахдл - один.

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


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

Вот из-за этой строки у вас ресурсов используется больше, в AHDL варианте этот функционал не реализован.

А насчет разбежки фронтов поробуйте так

 

always @ (posedge clk)

begin

if((!rstn) | init)

begin

CRC [31:0] <= {32{1'b1}};

match <= 1'b0;

end

else

if(enable)

begin

CRC <= NewCRC;

if (CRC==32'd0) match<=1'b1; else match<=1'b0;

end

end

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


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

Насколько я понимаю в гинекологии этого дела ;) разница в том, что в верилоговском коде применяются 2 фронта (clk и rstn), а в ахдл - один.

У меня тоже есть версия. По количеству задействованных ресурсов FPGA, торможению вычислений и разбежке фронтов, начинаешь подозревать, что синтезатор(или компилятор?) с верилога работает слишком "в лоб", не принимая в расчет особенностей конструкции FPGA. Вполне возможно, что даже D-триггера строит на логике, а не использует готовые триггера в логических элементах матрицы. Иначе, мне кажется больше нечем обьяснить жуткий тормоз и разбежку фронтов по шине. Зато в AHDL всегда четко указывается, где используется триггер и как к нему подведен клок или ресет.

 

Вот из-за этой строки у вас ресурсов используется больше, в AHDL варианте этот функционал не реализован.

А насчет разбежки фронтов поробуйте так

 

always @ (posedge clk)

begin

if((!rstn) | init)

begin

CRC [31:0] <= {32{1'b1}};

match <= 1'b0;

end

else

if(enable)

begin

CRC <= NewCRC;

if (CRC==32'd0) match<=1'b1; else match<=1'b0;

end

end

Спасибо за совет. Hо оценить его красоту и полезность я не смогу по причине невладения языком верилога. Я уже переделал верилоговский модуль на AHDL и все прекрасно заработало. Hо осадочек остался. А желание осваивать верилог сильно поубавилось.

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


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

Да нет. Что просили - то и изготовил. Просто на верилоге Вы просили обрабатывать 2 фронта, а на хдл - один. Уберите фронт rstn - и все будет хорошо.

 

PS Ну если уж быть совсем точным, то спад, а не фронт.

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


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

Как видите, ничем не отличается даже на уровне операторов. А занимает ячеек в FPGA в 1.5 раза меньше! Быстродействие в 2 раза выше.! И никакой "разбежки" на фронтах!

С нетерпением жду ваших комментариев. :)

 

легко.

 

в ахдл модели нет :

1. сигнала match (под который будет отведен большой OR на 32 бита)

2. сигнала сброса.

3. логика поведения сигналов init и enable в ахдл варианте несколько другая.

 

т.е. варианты не аналогичны.

 

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

 

И напоследок, я раза 3 выкладывал синтезируемый, понятный, легко изменяемый код CRC на этом форуме.

 

module crc32_unit
(
  clk   ,
  reset ,
  sclr  ,
  ena   ,
  init  ,
  ibyte ,
  crc
);

  //------------------------------------------------------------------------------------------------------
  //
  //------------------------------------------------------------------------------------------------------

  input  logic          clk;
  input  logic          reset;
  input  logic          sclr;
  input  logic          ena;
  input  logic          init;
  input  logic  [7 : 0] ibyte;
  output logic [31 : 0] crc;

  //------------------------------------------------------------------------------------------------------
  //
  //------------------------------------------------------------------------------------------------------

  logic [31:0] crc_load_value;

  //------------------------------------------------------------------------------------------------------
  //
  //------------------------------------------------------------------------------------------------------

  assign crc_load_value = init ? 32'hFFFF_FFFF : crc;

  always_ff @(posedge clk or posedge reset) begin
    if (reset)
      crc <= 32'hFFFF_FFFF;
    else if (sclr)
      crc <= 32'hFFFF_FFFF;
    else if (ena)
      crc <= crc_32x8(crc_load_value, ibyte);
  end

  //------------------------------------------------------------------------------------------------------
  //
  //------------------------------------------------------------------------------------------------------
  //
  // G(x) = x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x1 + 1
  //
  function bit [31:0] crc_32x1 (input bit [31:0] crc, input bit d);
    bit msb;
  begin
    msb       = crc[31];
    crc_32x1  = crc << 1;

    crc_32x1[ 0] = d ^ msb;
    crc_32x1[ 1] = d ^ msb ^ crc[ 0];
    crc_32x1[ 2] = d ^ msb ^ crc[ 1];
    crc_32x1[ 4] = d ^ msb ^ crc[ 3];
    crc_32x1[ 5] = d ^ msb ^ crc[ 4];
    crc_32x1[ 7] = d ^ msb ^ crc[ 6];
    crc_32x1[ 8] = d ^ msb ^ crc[ 7];
    crc_32x1[10] = d ^ msb ^ crc[ 9];
    crc_32x1[11] = d ^ msb ^ crc[10];
    crc_32x1[12] = d ^ msb ^ crc[11];
    crc_32x1[16] = d ^ msb ^ crc[15];
    crc_32x1[22] = d ^ msb ^ crc[21];
    crc_32x1[23] = d ^ msb ^ crc[22];
    crc_32x1[26] = d ^ msb ^ crc[25];
  end
  endfunction
  //
  //
  //
  function bit [31:0] crc_32x8(input bit [31:0] crc, input bit [7:0] data);
    int i;
  begin
    crc_32x8 = crc;
    for (i = 8; i > 0; i--) begin
      crc_32x8 = crc_32x1 (crc_32x8, data[i-1]);
    end
  end
  endfunction

endmodule

 

 

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

 

module crc32
(
  clk   ,
  ena   ,
  init  ,
  ibyte ,
  crc
);

  input  logic          clk;
  input  logic          ena;
  input  logic          init;
  input  logic  [7 : 0] ibyte;
  output logic [31 : 0] crc;

  crc32_unit
  crc32_unit
  (
    .clk   ( clk    ) ,
    .reset ( 1'b0   ) ,
    .sclr  ( init   ) ,
    .ena   ( ena    ) ,
    .init  ( 1'b0   ) , // this is enable init, not clear init
    .ibyte ( ibyte  ) ,
    .crc   ( crc    )
  );

endmodule

 

 

теперь результат сравнения, ква 8.0

 

Top-level Entity Name : crc32

Family : Cyclone II

Total logic elements : 50

Total combinational functions : 50

Dedicated logic registers : 32

 

 

Top-level Entity Name : CRC32_data8

Family : Cyclone II

Total logic elements : 55

Total combinational functions : 55

Dedicated logic registers : 32

Total registers : 32

 

Жду ваших комментариев %)))))

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


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

У меня тоже есть версия. По количеству задействованных ресурсов FPGA, торможению вычислений и разбежке фронтов, начинаешь подозревать, что синтезатор(или компилятор?) с верилога работает слишком "в лоб", не принимая в расчет особенностей конструкции FPGA. Вполне возможно, что даже D-триггера строит на логике, а не использует готовые триггера в логических элементах матрицы. Иначе, мне кажется больше нечем обьяснить жуткий тормоз и разбежку фронтов по шине. Зато в AHDL всегда четко указывается, где используется триггер и как к нему подведен клок или ресет.

Спасибо за совет. Hо оценить его красоту и полезность я не смогу по причине невладения языком верилога. Я уже переделал верилоговский модуль на AHDL и все прекрасно заработало. Hо осадочек остался. А желание осваивать верилог сильно поубавилось.

 

Это в Вашем случае получилось в лоб. Потому что Вы прямо заказали работу на примитиве dffe.

В описание на верилоге синтезатор не увидел dffe. Реализовал это на dff и мультиплексорах, что затратно по ресурсам. Если на верилоге задействовать прямо примитив dffe, получите тоже самое по ресурсам и быстродействию.

Вся фишка в том, что надо уметь поведенчески описать так схему, чтобы синтезатор увидел в этом описании примитивы dffe. Вот и все. Что касается CRC, скачайте с сайта xilinx документ xapp209.pdf

и проекты при нем. Это качественная реализация и по ресурсам больше. Не получилось и там dffe. Но гораздо качественнее Вашего на AHDL. Переносимость проекта

перевешивает все. Если напрячься, можно минимизировать. Если время есть.

А AHDL хорош. Но на нем уже не говорят.

 

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

сумматора в квартусе.

module count

(

input clk,

input count_up,

output reg [7:0] ct

);

 

always @(posedge clk)

begin

ct <= count_up ? ct + 1'b1 : ct - 1'b1;

end

 

endmodule

 

module count

(

input clk,

input count_up,

output reg [7:0] ct

);

 

always @(posedge clk)

begin

ct <= ct + (count_up ? 1'b1 : -1'b1);

end

 

endmodule

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


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

2 sazh

 

не поверите результаты синтеза в ква 8.0, первого и второго соответственно

 

Top-level Entity Name : count

Family : Cyclone II

Total logic elements : 8

Total combinational functions : 8

Dedicated logic registers : 8

Total registers : 8

 

Top-level Entity Name : count

Family : Cyclone II

Total logic elements : 9

Total combinational functions : 9

Dedicated logic registers : 8

Total registers : 8

 

занятно %))

 

 

ЗЫ. пожалуйста научитесь использовать теги для обрамления кода (code, /code в квадратных скобках)

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


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

в ахдл модели нет :

1. сигнала match (под который будет отведен большой OR на 32 бита)

Если писать на AHDL, то этот OR будет скорей всего реализован за счет LUT Chain & Register Chain, т.е. без увеличения количества задействованных LE. Поэтому ваше замечание непринципиально.

2. сигнала сброса.

Тоже непринципиально, поскольку на AHDL завести сброс на clrn триггера не составляет труда и главное, не приводит к увеличению числа задействованных LE.

3. логика поведения сигналов init и enable в ахдл варианте несколько другая.

т.е. варианты не аналогичны.

Делать выводы на основе непринципиальных замечаний представляется некорректным.

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

После испытаний того текста на верилоге, что я привел ранее, у меня закралось подозрение- а были ли вообще использованы регистры компилятором? Именно по причине дикой разности времен распространения сигнала в одноименной шине.

И напоследок, я раза 3 выкладывал синтезируемый, понятный, легко изменяемый код CRC на этом форуме.

Не берусь оценивать красоту вашего решения на верилоге, т.к. я не специалист в этом языке. Хочу только напомнить, что меня, как неспециалиста, интересует возможность использования готовых кусков без влезания к ним в нутро и без доработок. Потыркавшись пару раз с готовыми модулями на верилоге я каждый раз убеждался, что без влезания внутрь и без адаптации текстов под конкретный пакет разработки,- ничего путного сделать невозможно. Отсюда сразу следует, что тезис о якобы великолепной переносимости проектов, написанных на Verilog или VHDL - это академический миф.

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


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

Тоже непринципиально, поскольку на AHDL завести сброс на clrn триггера не составляет труда

 

Дык clrn - это же потенциальный вход. А в коде на Verilog у вас требуется спад сигнала. Вот тут и грабли.

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


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

Дык clrn - это же потенциальный вход. А в коде на Verilog у вас требуется спад сигнала. Вот тут и грабли.

Вполне возможно. Однако, непонятно с практической стороны - зачем понадобилась такая схема произведения ресета? Похоже, что в синтаксисе верилога нет возможности прямо указать - заводи ресет на clrn регистров. Или есть такая возможность? Если есть, то зачем каждый раз пишут сброс по падающему фронту?

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


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

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

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

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

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

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

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

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

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

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