aprox 0 4 сентября, 2008 Опубликовано 4 сентября, 2008 · Жалоба Сразу ставлю в известность, что в Verilog-е я совсем не специалист, но много раз пытался использовать уже готовые модули, написанные на этом языке. В частности модули, которые генерит MegaWizard в Quartus-е. Также пробовал использовать готовые верилоговские коры c opensource.org. Результаты всякий раз оказывались неудовлетворительными по следующим причинам: -1. Верилог занимал ресурсов FPGA примерно в 1.5 раза больше, чем эквивалентная схема на AHDL. -2. Производительность(Timing Analyzer) схемы оказывалась на верилоге ниже примерно в 2раза, чем эквивалентная схема на AHDL. -3. Возникала очень несимпатичная "разбежка" фронтов на шинах данных. Поскольку я не специалист и использую модули на верилоге "as is", без вникания в их нутро, то вопрос собственно в следующем- требуют ли чужие, якобы готовые модули на верилоге какой-то особенной доработки, вставления таинственных ключевых слов и аттрибутов, чтобы заставить компилятор производить более эффективные разводки проектов, сравнимые с AHDL ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dvladim 0 4 сентября, 2008 Опубликовано 4 сентября, 2008 · Жалоба По всем трем пунктам сильно сомневаюсь. Если вы говорите, что модули эквивалентны, то результаты синтеза будут одинаковы. Т.е. п.1 отпадает сразу. Пункты 2 и 3 - работа place & route по синтезированной схеме. Соответственно если схемы одинаковы, то и P&R отработает одинаково. Для того, чтобы уложиться во времена, разбежки и т.д. необходимо обконстрейнить схему. Ну а требуют ли чужие, якобы готовые модули на верилоге какой-то особенной доработки, вставления таинственных ключевых слов и аттрибутов то для P&R нет, а для изменения функциональности - естественно да. Изменение функциональности конечно же повлияет и на результаты трассировки. Если текущей производительности не хватает, то можно ее поднять сделав балансировку критического пути - это естественно изменяя код. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 5 сентября, 2008 Опубликовано 5 сентября, 2008 · Жалоба -1. Верилог занимал ресурсов FPGA примерно в 1.5 раза больше, чем эквивалентная схема на AHDL. Не верю, пример для тестовых испытаний в студию. В отличие на ~10% я может быть еще и поверю (спасибо SM), но и то только за счет оптимизации в ручную с учетом топологии целевой фпга. Если вы утверждаете про 50% ИМХО вы просто не умеете его готовить. %) В частности модули, которые генерит MegaWizard в Quartus-е. Также пробовал использовать готовые верилоговские коры c opensource.org. Будте добры, приведите пример функционально одинаковых модулей из мега визарда и ваш на AHDL, который показывает такие результаты. Насчет корок, расчитывать на их оптимальность слишком ошибочно. В большинстве своем они пишутся, чтобы работали в симуляторе и показывали средние результаты в железе. Т.к. в первую очередь это реклама-демка идеи/подхода реализации, а уже потом продукт. Хотя некоторые авторы в следующих ревизиях точат свои корки на оптимальность. Давно не брал я в руки AHDL, жду ваши примеры. Спасибо!!! %) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Postoroniy_V 0 5 сентября, 2008 Опубликовано 5 сентября, 2008 · Жалоба +1 des00 повеяло темой "Не дурят ли нашего брата" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aprox 0 5 сентября, 2008 Опубликовано 5 сентября, 2008 · Жалоба Будте добры, приведите пример функционально одинаковых модулей из мега визарда и ваш на 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 раза выше.! И никакой "разбежки" на фронтах! С нетерпением жду ваших комментариев. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 5 сентября, 2008 Опубликовано 5 сентября, 2008 · Жалоба Насколько я понимаю в гинекологии этого дела ;) разница в том, что в верилоговском коде применяются 2 фронта (clk и rstn), а в ахдл - один. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kedin 0 5 сентября, 2008 Опубликовано 5 сентября, 2008 · Жалоба Вот из-за этой строки у вас ресурсов используется больше, в 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aprox 0 5 сентября, 2008 Опубликовано 5 сентября, 2008 · Жалоба Насколько я понимаю в гинекологии этого дела ;) разница в том, что в верилоговском коде применяются 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о осадочек остался. А желание осваивать верилог сильно поубавилось. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 5 сентября, 2008 Опубликовано 5 сентября, 2008 · Жалоба Да нет. Что просили - то и изготовил. Просто на верилоге Вы просили обрабатывать 2 фронта, а на хдл - один. Уберите фронт rstn - и все будет хорошо. PS Ну если уж быть совсем точным, то спад, а не фронт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 5 сентября, 2008 Опубликовано 5 сентября, 2008 · Жалоба Как видите, ничем не отличается даже на уровне операторов. А занимает ячеек в 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 Жду ваших комментариев %))))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 7 5 сентября, 2008 Опубликовано 5 сентября, 2008 · Жалоба У меня тоже есть версия. По количеству задействованных ресурсов 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 5 сентября, 2008 Опубликовано 5 сентября, 2008 · Жалоба 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 в квадратных скобках) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aprox 0 8 сентября, 2008 Опубликовано 8 сентября, 2008 · Жалоба в ахдл модели нет : 1. сигнала match (под который будет отведен большой OR на 32 бита) Если писать на AHDL, то этот OR будет скорей всего реализован за счет LUT Chain & Register Chain, т.е. без увеличения количества задействованных LE. Поэтому ваше замечание непринципиально. 2. сигнала сброса. Тоже непринципиально, поскольку на AHDL завести сброс на clrn триггера не составляет труда и главное, не приводит к увеличению числа задействованных LE. 3. логика поведения сигналов init и enable в ахдл варианте несколько другая. т.е. варианты не аналогичны. Делать выводы на основе непринципиальных замечаний представляется некорректным. Не совсем понял про разбежку, в обоих случаях на выходе стоит регистр. И разность путей до выхода из фпга будет зависеть от того, на какие пины идет сигнал. После испытаний того текста на верилоге, что я привел ранее, у меня закралось подозрение- а были ли вообще использованы регистры компилятором? Именно по причине дикой разности времен распространения сигнала в одноименной шине. И напоследок, я раза 3 выкладывал синтезируемый, понятный, легко изменяемый код CRC на этом форуме. Не берусь оценивать красоту вашего решения на верилоге, т.к. я не специалист в этом языке. Хочу только напомнить, что меня, как неспециалиста, интересует возможность использования готовых кусков без влезания к ним в нутро и без доработок. Потыркавшись пару раз с готовыми модулями на верилоге я каждый раз убеждался, что без влезания внутрь и без адаптации текстов под конкретный пакет разработки,- ничего путного сделать невозможно. Отсюда сразу следует, что тезис о якобы великолепной переносимости проектов, написанных на Verilog или VHDL - это академический миф. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 8 сентября, 2008 Опубликовано 8 сентября, 2008 · Жалоба Тоже непринципиально, поскольку на AHDL завести сброс на clrn триггера не составляет труда Дык clrn - это же потенциальный вход. А в коде на Verilog у вас требуется спад сигнала. Вот тут и грабли. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aprox 0 8 сентября, 2008 Опубликовано 8 сентября, 2008 · Жалоба Дык clrn - это же потенциальный вход. А в коде на Verilog у вас требуется спад сигнала. Вот тут и грабли. Вполне возможно. Однако, непонятно с практической стороны - зачем понадобилась такая схема произведения ресета? Похоже, что в синтаксисе верилога нет возможности прямо указать - заводи ресет на clrn регистров. Или есть такая возможность? Если есть, то зачем каждый раз пишут сброс по падающему фронту? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться