Шукати в цьому блозі

четвер, 13 вересня 2012 р.

Simple HDD motor controller on CPLD


Простий контроллер для HDD двигуна.

Download project file ver. 1.1 --->  HDD_motor_controller.rar

В продовженні теми проектування різноманітних схем на основі плати NM9221 була написана дана статя. Схема вийшла достатньо простою і в CPLD MAX3064 вона зайняла всього 8 МС (мікрокомірок), живлення для схеми використовувалось +5В для плати NM9221  і  LM555  для генерації вхідних синхронізуючих сигналів по схемі "clk", а також +12В для подачі живлення на обмотки HDD двигуна через підсилюючі ключі Дарлінгтона на основі мікросхеми UNL2003. 
Рис.1
На рис.2 і рис.3 наведена логіка роботи контроллера в чотирьох варіантах. Схема за логікою ver.1.1. як на рис.2 зкомпільована і протестована на роботоздатність, на відеоб що вкінці статті можна подивитись на результат тестування. В файлах проекту при зміні елементу hdd_conct на елемент  hdd_const_ver_2 схема буде працювати за логікою ver.1.2 рис.2.


Рис.2

На рис.3 схема роботи контроллера не ралізована а наведенна, як ще один варіант роботи схеми. При реалізаціїї схеми сигнали на фази А, В, С будуть подаватися  півперіоди синусойд які будуть згенеровані ШИМ ( PWM ) - модуляцією, цей метод також називається microstepping . 


Рис.3
На рис.4  наведена схема яка розроблена в графічному редакторі Max+plusII. На рис.5 показано розташування пінів для CPLD MAX3064 після компіляції проекту в середовищі розробки.  На рисунку також показано відповідність пінів до фаз для HDD двигуна. Але сигнали одразу не поступають на фази двигуна а йдуть на підсилючі каскади мікросхеми UNL2003 як на рис.6.

Рис.4


Рис.5

Серед десятка протестованих мікросхем UNL2003AN, та UNL2003APG було зроблено вибір в сторону останніх оскільки вони точно виковували свою функцію і не нагрівалиль в порівнянні із UNL2003AN. Також слід зауважити що при живленні HDD двигуна від живлення +12В(заміряний струм 3А) , двигун за одну - дві хвилини нагрівався але при цьому мав досить пристойний момент в порівнянні із +5В(заміряний струм 1,5А) живленням при якому двигун не нагрівався. Вхідна частота з генератора була 100Гц, також двигун був тестований для інших частот як 1000Гц, але при цьому двигун потрібно було попередньо розкрутити, бо запуститись самостійно він неміг.
Рис.6

Дивимось на результати тестування схеми. 


І на завершення хотів би сказати, що в планах є розширення теми і розробка схеми із PWM модуляцією тобто режимом microstepping..

пʼятниця, 3 серпня 2012 р.

PDM ( Pulse density modulation ) controller, besed on error diffusion algorithm ( Part II ).


 PDM контроллер на основі алгоритму дефузії помилки.

[1] http://www.icct.ru/Practicality/Papers/01-11-2010/Invertor-03.php

Модуляція щільності  іимпульсів (PDM – Pulse Density Modulation)

Проект розроблено в Altera MAX+plusII. 
Download project  -->  PDM_error_diffusion.rar

Схему принципову PDM модулятора на основі алгоритма дефузії помилки було розроблено на основі інформації [1]. Де алгоритм роботи дуже детально описаний. Цей алгоритм був реалізований в статті на базі мікроконтроллера. Тому в цій статті буде запропонована схема рис.1 реалізації алгоритму для CPLD/FPGA фирми Аltera. Запропонована реалізація схеми вийшла достатньо компактною тому для  синтезу схеми в конкретну CPLD достатньо серії MAX3064


Рис.1 Схема принципова модулятора PDM на основі алгоритму дифузії помилки

 Як і в [1] попередній розрахунок було проведено в Excel, файл error_diffusion.xls проекту доданий в архів. На рис. 2  наведено алгоритм роботи і часова діаграма симуляції проекту, з якого видно що при вхідному значенні 60 в комірці С4, бітова комбінація на виході модулятора стовпчик G ( позначено 4) співпадає з результатами часової діагарми, яка наведена під таблицею.


Рис.2 Таблиця із роботою алгоритма і часовою діаграмою.

 Для синхронізації елементів схеми , алгоритм роботи  було розбито на 4 кроки, відповідно в схемі було введено елемент лічильник prog_counter як мікропрограмний автомат, який синхронізує всі елементи схеми. При цьому вихідна частота модулятора в чотири рази менша  в порівнянні із вхідною частотою. Тобто на один вихідний імпульс витрачається чотири вхідних.

Алгоритм роботи (псевдокод):
Крок1. Додаєм вхідне значення із значенням яке записане в регістрі помилки(dff_pdm елемент схеми), якщо  в регістрі значення <149 . Якщо значення в регістрі >149 тобто записане відємне число, тоді віднімаєм від вхідного значення ,  яке записане в регістр помилки, але при цьому число інвертується і додається 1.
Крок2-3. Первірка якщо результат після Кроку1, >50 тоді відняти 100 , якщо <50 і >149 тоді відняти 0.
Крок4. Запис результату в регістр помилки після Кроку2-3.


Simple PDM ( Pulse Density Modulation ) controller on CPLD ( Part I ).



Простий PDM (Модуляція щільності імпульсів) контроллер на CPLD MAX3000 Altera.

[1] http://www.icct.ru/Practicality/Papers/01-11-2010/Invertor-03.php
Модуляція щільності імпульсів (PDM – Pulse Density Modulation)

Проект розроблено в Altera MAX+plusII. 
Download project  -->  PDM.rar

В [1] описано дуже детально принцип функціонування PDM і реалізація модулятора на базі мікроконтроллера. В даній статті приведена розроблена схема простого PDM модулятора на основі CPLD Altera  із довжиною кадра в 127 імпульсів. Принципова схема приведена на рис.1. 

Рис. 1 

Основний принцип роботи PDM це рівномірний розподіл вказаної кількості імпульсів по всій довжині кадру. Тому самий простий алгортм роботи пристрою буде, полягати у визначенні кількості кроків - імпульсів "0" між імпульсами "1". Розрахунок було проведено в програмі Excel  файл  проекту pulse_density_moduletion.xls в архіві pdm.rar. На рис.2 зображена таблиця розрахунку і відповідна часова діаграма роботи пристрою. Із за округлення значень  стовпчика D і запису результату в стовпчик F , відповідно в стовпчику G приведеныі значення похибок які потім і  впливають на нерівномірність розподілу. Це видно із результату обчислення і наведеної часвої діаграми для вхідного значення 16 модулятора  PDM. 127/16= 7,9375, після округлення крок між сусідніми імпульсами буде 7 імпульсів, при цьому після 16 імпульсів із значенням "1", буде додано ще 15 "0"-их імпульсів. 

Рис. 2
Схема розроблена так, що вхідні значення відповідають відповідним значенням кроків між імпульсами і записані в таблицю, елемент проекту input_table. При цьому нам потрібно тільки значення першої половини таблиці тобто для довжини кадру в 127 імпульсів нам потрібно від 0 до 63 елементу. Іншу частину результатів можна отримати інвертувавши результат, і  перепризначивши другу половини вхідних значень до першої на рис.2 це стовпчик A і B за це відповідає елемент схеми input_table_inv. Переконатись що такий метод дієвий і працює можна із результатів симуляції схеми на наведених нижче рисунках часових діаграм рис.3 - рис.11. 




Рис. 3




Рис. 4




Рис. 5




Рис. 6




Рис. 7





Рис. 8





Рис. 9 




Рис. 10  



 Рис. 11



понеділок, 16 липня 2012 р.

Multi-functional Stepper Motor Controller ( Unipolar and Bipolar ) on FPGA/CPLDs


Використані матеріали:


 Download project file for Altera Max+plusII (or Quartus) -> stepper_motor_con.rar

Переваги крокових двигунів точність управління, програмне управління двигуна, а також відсутність щіток, робить крокові двигуни зручними у використанні для різних спеціалізованих пристроїв: принтери, сканери, плотери, дисководи FDD, роботи, верстати з ЧПУ і інші високоточні пристрої.
          Серед великої кількості різноманітних схем та коду на Verilog та AHDL для керування кроковими двигунами які я зміг найти в інтернеті було чимало хороших але в більшості з низ відсутня простота розуміння, деякі з них перекочували в FPGA/CPLD із старих журналів і схем розроблених на 74 серії мікросхем такий собі максимальний мінімалізм присутній для схем того часу. Тому я вирів розробити схему яка б було інтуїтивно зрозуміла по схемі та по логіці роботи і також щоб схему можна було модифікувати під тип крокового двигуна.
         Для початку розглянемо типи двигунів. Крокові двигунів діляться на два основних найбільш використовуваних типи, це однополярні (unipolar) та двополярні (bipolar) крокові двигуни. В [2] показано логіку формування вхідних сигналів для однополярних двигунів. Кожна із цих методик має свої переваги і недоліки в плані функціонування та легкості реалізації. Найкращим варіантом для однополярного двигуна є методика microstepping (мікрокрокова) але й і найскладніша в плані реалізації. Більш детальніше про методики для однополярних двигунів можна почитати в [3]. Таку кількість методик можна також пояснити з погляду конструктиву однополярного двигуна в порівнянні із двополярним (біполярним), струм через обмотку якого прямує в одному напрямку, в біполярному двигуні струм через обмотку має прямувати і в зворотньому напрямку. В даному пості я не буду розглядати підсилючий каскад(Driver, H-bridge) і який з них краще вибрати, підібрати відповідний по струму і напрузі можна із вже існуючих схем.
       Схема контроллера буде мати наступний вигляд як на рис.1. По суті це простий автомат Мура із трьома основними елементами схеми це лічильник (counter_8), мультиплексор ( mux_stepper), та елемент таблиця вихідних бітових комбінацій (bit_const_half_step,  bit_const_full_step для однополярного(unipolar) двигуна і bit_const_bipolar_2coil для біполярного (bipolar) двигуна ). Всі керуючі сигнали для двигуна зведенні до керування лічильника. На вхід clk лічильника поступає із генератора імпульсів частоту якого можна вирахувати по вже існуючих методиках і яка буде залежити від RPM двигуна тобто максимальної кількості оборотів двигуна за хвилину. По приходу кактових імпульсів лічильник буде лічити по модулю 8, тобто перебирати по черзі адреси мультиплексора який в свою чергу буде видавати на вихід схеми відповідні фазові комбінації для двигуна. 


  Рис. 1 Схема контроллера крокового двигуна.

           В такий спосіб дуже легко настроїти схему під певний тип двигуна замінивши в схемі тільки один елемент таблиці бітових комбінацій рис.2 . 



Рис.2 Таблиці бітових комбінацій.
Результати симуляції схеми для однополярного(unipolar) крокового двигуна наведені на рис.3. 

Рис.3    Результати симуляції для однополярного (unipolar) двигуна.
      Увага!!!! Для правильного підключення до обмоток двигуна потрібно використовувати наступну таблицю!!!!!
  
Output from CPLD

Unipolar coil

Bipolar coil

stepper_out[3]
A
1a
stepper_out[2]
B
1b
stepper_out[1]
C
2a
stepper_out[0]
D
2b


Результати синтезу в CPLD серії MAX3000:
 Chip/                          Input     Output    Bidir                     Shareable
POF Device                Pins       Pins        Pins      LCs         Expanders      % Utilized
stepper_gdf

EPM3032ALC44-4     4         4             0           7                 0                21 %

User Pins:                     4         4             0





четвер, 24 травня 2012 р.

Design and synthesis high precision oscillators DDS (Direct digital synthesis) on CPLD from Altera


Розробка та синтез високоточних DDS генераторів(Direct digital synthesis) на CPLD фірми Altera.

Використані матеріали:

Download project file ->  dds_my.rar

Рис.1 Схема DDS функціональна
        Функціональна схема DDS (генератора прямого синтеза), показана на рис.1 основні елементи схеми це “Суматор”, “Регістр”, “Пам'ять (таблиця синусів)”, “Вхідний регістр” може і не використовуватись оскільки вхідний вектор частоти може задаватися напряму через входи (джампери). Розрахуємо розрядність в бітах усіх основних елементів схеми, і почнемо з тактової частоти, нехай Fclk = 12500000 Гц або 12,5 MHz. Основний елемент схеми “Суматор” буде сумувати значення “Регістр” із кроком в “Вхідний регістр” (він же буде індикатором вихідної частоти, тобто коли на вході буде 0000 0000 0000 0000 0000 0001, то частота виходу DDS буде 1 Гц і крок буде також 1 Гц). При такій умові в схемі потрібно проводити перевірку на виході “Регістра”, при переповненні значення більше ніж на число 12 500 000, потрібно записати в “Регістр” значення всіх розрядів в “0”. Для визначення розрядності елементів схеми переведемо 12 500 000(10) = 1011 1110 1011 1100 0010 0000(2), отримаємо 24 розряди(біти). Отже елементи “Суматор” та “Регістр” будуть 24 бітними, оскільки максимальне значення для 24 біт   (1111 1111 1111 1111 1111 1111 ) в десятковому форматі буде 16 777 215(10), саме тому ми ввели функцію запис в “Регістр” всіх 24 біт в “0”. Далі в “Пам'ять (таблиці синусів)” поступає кодове значення із 8 старших бітів “Регістра” які далі виділені 1011 1110 1011 1100 0010 0000(2) перевівши із двійкового 1011 1110(2) в десятковий формат отримаємо число 190 це і буде кількість кроків в повному періоді (2p) тобто дискретність. При збільшенні кодового слова на один біт, тобто взявши 9 старших біти “Регістра” 101111101, дискретність періоду збільшиться і буде складатись із 381-го кроку за повний період (2p). При необхідності дискретність можна збільшувати і далі, але при цьому слід пам’ятати, що буде збільшуватись і “Пам'ять (таблиці синусів)”. Скориставшись інформацією в джерелах [6],[7] побудуємо таблицю синусів (8x7 - тобто вхідні кодові (дискретні) комбінації 8 бітні, а вихідні квантові 7 бітні ) в Microsoft Excel (файл DDS_table.xls доданий до архіву проекту). Результат побудови графіка показано на рис.2 в якому Ряд1- результати без округлення, Ряд2- результати з округленням.
Рис.2 Графіки таблиці синусів
Після отриманих результатів розрахунку в Excel, створимо файл проекту в AlteraHDL коді за основу взявши методику [1] і розробку дешифраторів (decoder) в AlteraHDL. Отримаємо такий код в файлі functab7x6.tdf проекту:
Провівши всі необхідні розрахунки схеми спроектуємо схему в середовищі   Max+plusII Altera в графічному середовищі файл dds.gdf. Принципова схема генератора DDS відображена на рис.3.

Рис.3 Схема принципова DDS.


Результати симуляції схеми рис.4

Рис.4 Симуляція схеми.


Із схеми видно що був доданий ще один регістр out_ddf 7 біт, типу DFF на вихід для збереження вихідних результатів із таблиці синусів functab7x6.tdf. Він потрібен для того щоб зменшити шуми які виникають в наслідок затримок в середині CPLD і виводу їх на ЦАП (DAC). Нижче буде наведена схема без регістра і результати симуляції рис.5 схема без вихідного регістра, рис. 6 результати симуляції схеми.


Рис.5 Схема без вихідного регістра.
Рис.6 Результати симуляції схеми.

На наступних двох рисунках показано як перехідні процеси і затримки в схемі впливають на вихідні результати в збільшеному вигляді. І як вихідних регістр фільтрує результати. Відповідно рис.7 перехідні процеси в збільшеному вигляді з вихідним регістром ; рис.8 перехідні процеси в збільшеному вигляді без вихідного регістра.

Рис.7 Перехідні процеси в збільшеному вигляді з вихідним регістром.
Рис.8 Перехідні процеси в збільшеному вигляді без вихідного регістра.
 

Інформація про результати синтезу

Chip                                      Input    Output     Bidir             Shareable
POF          Device                  Pins      Pins        Pins    LCs  Expanders  % Utilized

dds   EPM9320LC84-15            22        32           0       167          83              52 % 

User Pins:                               22        32           0                                                   




пʼятниця, 3 лютого 2012 р.

PWM controller with two tactile switch buttons "UP" and "DOWN", based on NM9221 board.

Video:



---
Проект розроблено в Max + plus II, СPLD EPM3064ALC44-10N, займає LC-28 шт.
Download --> pwm_100.rar
---
Схема:
Для збільшення зображення, відкрийти його в новому вікні.


Результати тестування в вигляді часових діаграм.
Захист від циклічності означає, що при приході на вхід сигналу DOWN, лічильник не переходить в стан "100" а залишається в стані "0". Частина вихідного сигналу при цьому буде в стані "Z".


Значення вихідного сигналу при значенні і стану лічильника "1". Тут все нормально працює.

Так само і при приході на вхід сигналу "UP", і значенні лічильника "100" спрацьовує захист від переходу в стан "0". На виході PWM_out все нормально, значення сигналу постійно логічна "1".

Ну і останнє при значенні лічильника "99", на виході все нормально.


пʼятниця, 6 січня 2012 р.

Verilog code counter by 7 mouse click. Using Quartus II and MegaWizard Plug-in Manger with LPM_COUNTER

            При проектуванні складних цифрових схем і опису їх на Verilog коді, від проектувальника вимагається не тільки хорошого знання та розуміння проектування цифрових схем а також хорошого рівня знань стандарту Verilog а також різного роду тонкощів при описі проекту. При цьому час на розробку та тестування проекту збільшується. В цій темі ми розглянемо як генерувати Verilog код використовуючи при цьому можливості  MegaWizard Plug-in Manger.





























Відкриємо згенерований файл counter_syn.v в блокноті і отримаємо код який введений нижче. Частину коду яка підкреслена фоном ми можемо викоритсовувати як код лічильника на Verilog для проектування в інших системах.
// megafunction wizard: %LPM_COUNTER%


// GENERATION: STANDARD

// VERSION: WM1.0
// MODULE: LPM_COUNTER

// ============================================================
// File Name: counter.v
// Megafunction Name(s):
// LPM_COUNTER
//
// Simulation Library Files(s):
// lpm
// ============================================================
// ************************************************************
// THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE!
//
// 11.0 Build 157 04/27/2011 SJ Web Edition
// ************************************************************


//Copyright (C) 1991-2011 Altera Corporation
//Your use of Altera Corporation's design tools, logic functions
//and other software and tools, and its AMPP partner logic
//functions, and any output files from any of the foregoing
//(including device programming or simulation files), and any
//associated documentation or information are expressly subject
//to the terms and conditions of the Altera Program License
//Subscription Agreement, Altera MegaCore Function License
//Agreement, or other applicable license agreement, including,
//without limitation, that your use is for the sole purpose of
//programming logic devices manufactured by Altera and sold by
//Altera or its authorized distributors. Please refer to the
//applicable agreement for further details.


//lpm_counter DEVICE_FAMILY="MAX3000A" lpm_modulus=13 lpm_port_updown="PORT_USED" lpm_width=4 aclr clk_en clock cnt_en q updown
//VERSION_BEGIN 11.0 cbx_cycloneii 2011:04:27:21:07:09:SJ cbx_lpm_add_sub 2011:04:27:21:07:09:SJ cbx_lpm_compare 2011:04:27:21:07:09:SJ cbx_lpm_counter 2011:04:27:21:07:09:SJ cbx_lpm_decode 2011:04:27:21:07:09:SJ cbx_mgl 2011:04:27:21:08:59:SJ cbx_stratix 2011:04:27:21:07:09:SJ cbx_stratixii 2011:04:27:21:07:09:SJ VERSION_END
// synthesis VERILOG_INPUT_VERSION VERILOG_2001
// altera message_off 10463


//synthesis_resources =
//synopsys translate_off
`timescale 1 ps / 1 ps
//synopsys translate_on
module counter_cntr
(
aclr,
clk_en,
clock,
cnt_en,
q,
updown) /* synthesis synthesis_clearbox=1 */;
input aclr;
input clk_en;
input clock;
input cnt_en;
output [3:0] q;
input updown;
`ifndef ALTERA_RESERVED_QIS
// synopsys translate_off
`endif
tri0 aclr;
tri1 clk_en;
tri1 cnt_en;
tri1 updown;
`ifndef ALTERA_RESERVED_QIS
// synopsys translate_on
`endif

reg [4:0] wire_q_int;

// synopsys translate_off
initial
wire_q_int = 0;
// synopsys translate_on
always @(posedge clock or posedge aclr)
if (aclr == 1'b1) wire_q_int <= 5'b0;
else
if ( clk_en == 1'b1)
if (cnt_en == 1'b1)
if (updown == 1'b1)
if (wire_q_int[3:0] == 4'd12)
wire_q_int <= 4'b0;
else
wire_q_int <= wire_q_int[3:0] + 1'b1;
else
if (wire_q_int[3:0] == 4'b0)
wire_q_int <= 4'd12;
else
wire_q_int <= wire_q_int[3:0] - 1'b1;
assign
q = wire_q_int[3:0];
endmodule //counter_cntr

//VALID FILE


// synopsys translate_off
`timescale 1 ps / 1 ps
// synopsys translate_on
module counter (
aclr,
clk_en,
clock,
cnt_en,
updown,
q)/* synthesis synthesis_clearbox = 1 */;

input aclr;
input clk_en;
input clock;
input cnt_en;
input updown;
output [3:0] q;

wire [3:0] sub_wire0;
wire [3:0] q = sub_wire0[3:0];

counter_cntr counter_cntr_component (
.aclr (aclr),
.clk_en (clk_en),
.clock (clock),
.cnt_en (cnt_en),
.updown (updown),
.q (sub_wire0));

endmodule

// ============================================================
// CNX file retrieval info
// ============================================================
// Retrieval info: PRIVATE: ACLR NUMERIC "1"
// Retrieval info: PRIVATE: ALOAD NUMERIC "0"
// Retrieval info: PRIVATE: ASET NUMERIC "0"
// Retrieval info: PRIVATE: ASET_ALL1 NUMERIC "1"
// Retrieval info: PRIVATE: CLK_EN NUMERIC "1"
// Retrieval info: PRIVATE: CNT_EN NUMERIC "1"
// Retrieval info: PRIVATE: CarryIn NUMERIC "0"
// Retrieval info: PRIVATE: CarryOut NUMERIC "0"
// Retrieval info: PRIVATE: Direction NUMERIC "2"
// Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "MAX3000A"
// Retrieval info: PRIVATE: ModulusCounter NUMERIC "1"
// Retrieval info: PRIVATE: ModulusValue NUMERIC "13"
// Retrieval info: PRIVATE: SCLR NUMERIC "0"
// Retrieval info: PRIVATE: SLOAD NUMERIC "0"
// Retrieval info: PRIVATE: SSET NUMERIC "0"
// Retrieval info: PRIVATE: SSET_ALL1 NUMERIC "1"
// Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "1"
// Retrieval info: PRIVATE: nBit NUMERIC "4"
// Retrieval info: PRIVATE: new_diagram STRING "1"
// Retrieval info: LIBRARY: lpm lpm.lpm_components.all
// Retrieval info: CONSTANT: LPM_DIRECTION STRING "UNUSED"
// Retrieval info: CONSTANT: LPM_MODULUS NUMERIC "13"
// Retrieval info: CONSTANT: LPM_PORT_UPDOWN STRING "PORT_USED"
// Retrieval info: CONSTANT: LPM_TYPE STRING "LPM_COUNTER"
// Retrieval info: CONSTANT: LPM_WIDTH NUMERIC "4"
// Retrieval info: USED_PORT: aclr 0 0 0 0 INPUT NODEFVAL "aclr"
// Retrieval info: USED_PORT: clk_en 0 0 0 0 INPUT NODEFVAL "clk_en"
// Retrieval info: USED_PORT: clock 0 0 0 0 INPUT NODEFVAL "clock"
// Retrieval info: USED_PORT: cnt_en 0 0 0 0 INPUT NODEFVAL "cnt_en"
// Retrieval info: USED_PORT: q 0 0 4 0 OUTPUT NODEFVAL "q[3..0]"
// Retrieval info: USED_PORT: updown 0 0 0 0 INPUT NODEFVAL "updown"
// Retrieval info: CONNECT: @aclr 0 0 0 0 aclr 0 0 0 0
// Retrieval info: CONNECT: @clk_en 0 0 0 0 clk_en 0 0 0 0
// Retrieval info: CONNECT: @clock 0 0 0 0 clock 0 0 0 0
// Retrieval info: CONNECT: @cnt_en 0 0 0 0 cnt_en 0 0 0 0
// Retrieval info: CONNECT: @updown 0 0 0 0 updown 0 0 0 0
// Retrieval info: CONNECT: q 0 0 4 0 @q 0 0 4 0
// Retrieval info: GEN_FILE: TYPE_NORMAL counter.v TRUE
// Retrieval info: GEN_FILE: TYPE_NORMAL counter.inc FALSE
// Retrieval info: GEN_FILE: TYPE_NORMAL counter.cmp FALSE
// Retrieval info: GEN_FILE: TYPE_NORMAL counter.bsf TRUE
// Retrieval info: GEN_FILE: TYPE_NORMAL counter_inst.v TRUE
// Retrieval info: GEN_FILE: TYPE_NORMAL counter_bb.v TRUE
// Retrieval info: GEN_FILE: TYPE_NORMAL counter_syn.v TRUE
// Retrieval info: LIB_FILE: lpm

 Якщо порівняти наш згенерований код із кодом який Altera пропонує при кодингу для своїх систем на Verilog по цій ссилці

module behav_counter( d, clk, clear, load, up_down, qd);

// Port Declaration

input [7:0] d;
input clk;
input clear;
input load;
input up_down;
output [7:0] qd;

reg [7:0] cnt;


assign qd = cnt;


always @ (posedge clk)
begin
if (!clear)
cnt = 8'h00;
else if (load)
cnt = d;
else if (up_down)
cnt = cnt + 1;
else
cnt = cnt - 1;
end

endmodule

 Можемо побачити, що поведінкова частина кодів якщо не схожа то ідентична. 
Такий підхід в проектуванні схем дає певну гнучкість в проектуванні і переносі спроектованих частин схеми в інші середовища розробки які підтримують Verilog. Крім того  MegaWizard Plug-in містить дуже багато різноманітних бібліотек якими можна і генерувати код зменшуючи при цьому час до кінцевої розробки.