VHDL زبان توصیف سخت افزاری برای طراحی مدارات دیجیتال می باشد.
و مانند سایر زبانهای برنامه نویسی دارای دستورات خاص خود می باشد.
برای یادگیری زبان VHDL دانستن جبر بول و آشنایی با مدارات منطقی ضروری است.
لذا ما فرض می کنیم که دوستان با دو مقوله فوق آشنایی کافی دارند.
و اما یادگیری VHDL چه مزایایی دارد.
قبل از هرچیز باید گفت که هدف از یادگیری VHDL خصوصاْ در ایران طراحی مدارات دیجیتال و پیاده سازی در FPGA می باشد هرچند مدار طراحی شده را بصورت ASIC (آی سی خاص) نیز می توان پیاده سازی نمود اما غالباْ مدارات دیجیتال با هدف پیاده سازی در FPGA طراحی می شوند.
برای یادگیری VHDL در این مقطع نیاز به نرم افزاری برای شبیه سازی مدارات طراحی شده خواهیم داشت.
نرم افزارهای زیادی برای این منظور وجود دارند اما بهترین و آسانترین انها Active-HDL می باشد که نتایج شبیه سازی را بصورت شکل موجهای گرافیکی نمایش می دهد.
و در عین حال کار کردی آسان دارد.
تاریخچه
نام VHDL شامل دو بخش V و HDL به معنیVHSIC : Very High Speed Integrated Circuits
HDL : Hardware Description Language
استاندارد IEEE 1076-1987
استاندارد IEEE 1076-1993
Verilog و ABEL (Advanced Boolean Equation Language )
ویژگی ها
HDLها ذاتا موازی (همروند) هستند
ترتیب دستورات مهم نیست
مبتنی بر رخداد
امکان استفاده از دستورات ترتیبی را نیز دارد
اهداف اساسی
مستند سازی : نگهداری، ارائه، تبادل، استفاده مجدد
شبیه سازی : بررسی نتایج و ارزیابی
سنتز : با هدف پیاده سازی در FPGA یا بصورت ASIC
اجرا= شبیه سازی
نیازمندی ها
حداقل نیازمندی ها برای یادگیری زبان VHDL
دانستن جبر بول و آشنایی با مدارات منطقی
داشتن ابزار CAD مناسب
توصیف رفتاری و ساختاری
سه حوزه رفتاری، ساختاری و هندسی (فیزیکی) داریم
VHDL : امکان توصیف طرح بصورت رفتاری و ساختاری
نکته: توصیف رفتاری نسبت به توصیف ساختاری از سطح انتزاع بالاتری برخوردار است
توصیف رفتاری :
رفتار سیستم چیست؟
رابطه بین سیگنال های ورودی و خروجی
توصیف رفتاری :
انتقال ثبات یا Data Flow (معمولا بر اساس جملات همروند)
الگوریتمی Algorithmic(با استفاده از دستورات ترتیبی)
مثال ساده
مدار هشدار باز بودن کمربند و درب خودرو
Warning = Ignition_on AND (Door_open OR Seatbelt_off)
Ignition_on : سویچ در جایش قرار گرفته
Door_open : باز بودن درب خودرو
Seatbelt_off : کمربند بسته نشده
Warning : خروجی هشدار به سرنشین خودرو
توصیف ساختاری :
مجموعه ای از مولفه ها (دروازه ها)
و اتصالات بین آنها
توصیف ساختاری :
مشابه شماتیک
نزدیک به تحقق فیزیکی سیستم
ساختار کلی یک فایل VHDL
یک توصیف VHDL شامل
Entity declaration
Architecture body
تعریف entity در حقیقت معرفی سیگنالهای ورودی و خروجی است
architecture رابطه بین سیگنالهای ورودی و خروجی است
(عملکرد/ساختار)
بخش Entity
NAME_OF_ENTITY : یک شناسه اختیاری
signal_names : سیگنالهای ورودی یا خروجی
mode :یکی از موارد (in،out ،buffer ، Inout )
mode
In :سیگنال ورودی
out : سیگنال خروجی (فقط توسط یک entity دیگر قابل استفاده)
buffer : خروجی که می تواند در داخل entity نیز استفاده شود
Inout : سیگنا ل دوطرفه (ورودی / خروجی)
Type
نوع سیگنال را مشخص می کند ( استاندارد یا User Defined)
Bit : می تواند مقدار صفر یا یک داشته باشد
Bit_vector : برداری از مقادیر بیتی است
Boolean : می تواند مقدار true یا false بگیرد.
Integer : عدد صحیح
Real : عدد حقیقی
Character : هرکاراکتر قابل چاپ
Time : برا ی نمایش زمان بکار می رود.
Time : برا ی نمایش زمان بکار می رود.
مثال Entity تعریف entity برای یک نیم جمع کننده بخش Architecture توصیف سیستم بصورت رفتاری یا ساختاری است قالب کلی تعریف Architecture به شکل زیر است مدل رفتاری (Behavioral model) مستقل از ساختار داخلی ارتباط بین ورودی ها و خروجی ها بصورت عملیاتی توصیف می شود .
مثال(1): AND دو ورودی مدل رفتاری (Behavioral model) مثال(1): XOR دو ورودی هم روندی یکی از خصوصیات زبانهای توصیف سخت افزار دستورالعملهای انتساب سیگنال ( وقتی اجرا می شود که یک سیگنال در سمت راست جمله مقدارش تغییرکند تغییر در مقدار یک سیگنال را یک رخداد می نامیم VHDL یک زبان مبتنی بر رخداد در مثال(2) ترتیب نوشتن جملات مهم نیست.
یعنی می توان جملات x و y و z را بترتیب دلخواه جابجا کرد.
زمانبندی رخداد ها مکانیزم ایجاد تاخیر در انتساب مقدار جدید به سیگنال سمت چپ با استفاده از کلمه کلیدی after مدل کردن تاخیر های یک مدار واقعی را مدل این قابلیت شبیه سازی مدار را به واقعیت نزدیک تر می کند مثال توصیف رفتاری مدار Half Adder طراحی سلسله مراتبی در مدلسازی ساختاری هر Entity می تواند بعنوان یک مولفه در توصیف Entity دیگر بکار رود این امر می تواند در سطوح مختلف تکرار شود طراحی سلسله مراتبی موجب کاهش پیچیدگی در طراحی مدارات بزرگ می شود معمولا در طرح هایی که با تکرار قابل گسترش اند کاربرد دارد جمع کننده چهار بیتی sum = (A B) C carry = AB + C(A B) چند نکته استفاده از نام پورت مشترک برای Entity های متداخل مجاز است چون Cout بصورت خروجی تعریف شده نمیتواند بعنوان ورودی استفاده شود چون c(4) یک سیگنال داخلی است میتواند بعنوان ورودی استفاده شود.
میتواند بخشی از توصیف طرح ساختاری و بخشی رفتاری باشد مانند Cout و V در مثال قبل کتابخانه و بسته ها کتابخانه امکان استفاده مشترک از موارد از پیش تعریف شده را فراهم می کند.
مانند data type component Function Procedure هر کتابخانه شامل تعدادی بسته است نوع std_logic در بسته ieee.std_logic_1164 در کتابخانه ieee تعریف شده است library ieee; use ieee.std_logic_1164.all; عناصر گرامری زبان VHDL شناسه ها کلمات کلیدی (رزرو شده) اعداد کاراکترها رشته ها و رشته های بیتی شناسه ها کلماتی برای نام گذاری مولفه های مختلف مدل VHDL نام سیگنال های ورودی نام سیگنال های خروجی نام entity نامarchitecture قوانین نامگذاری شناسه های اصلی نام شناسه اختیاری است فقط شامل حروف الفبا و ارقام (A..Z و a..z و0..9) و کاراکتر '_' اولین کاراکتر حتما باید از حروف الفبا باشد آخرین کاراکتر نباید '_' باشد دو کاراکتر '_' دنبال هم غیر مجاز به حروف بزرگ و کوچک حساس نیست And2) =AND2 = and2) یک شناسه هر طولی می تواند داشته باشد مثال شناسه صحیح:X10 ، x_10 ، My_gate1 مثال شناسه غلط: _X10 ، my_gate@input، gate-input قوانین گسترش یافته تعریف شناسه های بین دو عدد '\' قرار می گیرند به حروف بزرگ و کوچک حساس کلمات رزرو شده و شناسه های اصلی در شناسه های گسترش مجاز و بعنوان یک شناسه متفاوت در نظر گرفته می شود بین هر دو '\' استفاده از هر کاراکتری و با هر ترتیبی مجاز است شناسه ای بنام BUS:\data را باید بنویسیم \BUS:\\data\ درنسخه VHDL-93 تعریف شده است ولی درنسخه VHDL-87 شناخته شده نیست مثال صحیح: Input، \Input\ ، \input#1\ ، \Rst\\as\ کلمات کلیدی (رزرو شده) شناسه های که بوسیله سیستم برای کار خاص استفاده می شود مثل in، out، or، and، port، map، end و غیره در شناسه توسعه یافته مجاز است(\end\) مراجعه کنید به جدول 4-1 (کلیه کلمات رزرو شده VHDL ) اعداد اعداد صحیح : 12 10 256E3 12e+6 اعداد حقیقی: 1.2 256.24 3.14E-2 پیش فرض مبنای 10 است وگرنه به صورت base#number# مثال: معادل عدد 18 در مبنای 2: 2#10010# در مبنای 16: 16#12# در مبنای 8: 8#22# بمنظور خوانایی 2#1001_1101_1100_0010# 215_123 کاراکترها رشته ها و رشته های بیتی کاراکترها (داخل یک جفت گیومه تکی ) 'a' 'B' ',‘ رشته ( داخل یک جفت گیومه دوتایی ( "This is a string“ هر کاراکتر قابل چاپ مجاز است (حتی خود" ) "This is a ""String""." رشته بیتی یک رشته بیتی یک توالی از بیتها است بمنظور تمایز از رشته کاراکتری در ابتدای آن B می گذارند B”1001” رشته بیتی در مبنای 16 یا 8 هم نوشته می شود Binary: B”1100_1001”, b”1001011” Hexagonal: X”C9”, X”4b” Octal: O”311”, o”113” توجه کنید دو مقدار با طول نامساوی نامساویند b”1001011” ≠ X”4b” O”113” ≠ X”4b” اشیاء داده ای Data objects سیگنالها (توصیف سیم های ارتباطی مدار) ثابت ها متغیرها فایل ثابت (constant) با توجه به نوع مقدار میگیرد و در طول شبیه سازی مقدارش عوض نمی شود constant list_of_name_of_constant: type [:=initial value]; ثابت در ابتدای architecture تعریف شده و در داخل آن استفاده می شود.
یک ثابت که در داخل یک پردازه تعریف می شود فقط در همان پردازه نیز می تواند استفاده شود.
constant RISE_FALL_TME: time := 2 ns; constant DELAY1: time := 4 ns; constant RISE_TIME, FALL_TIME: time:= 1 ns; constant DATA_BUS: integer:= 16; تعریف ثابت درهر یک از Entity یا Architecture یا Process Declaring Constants entity ent1 is generic (...); port (...); constant loop_number:positive:=4; begin ...
end entity ent1; متغیر(Variable) مقدارش می تواند با استفاده از جملات انتساب تغییر کند تغییر به محض اجرای دستور انتساب بدون تاخیر انجام می شود داخل یک پردازه تعریف می شود variable list_of_variable_names: type [:= initial value]; variable CNTR_BIT: bit :=0; variable VAR1: boolean :=FALSE; variable SUM: integer range 0 to 256 :=16; variable STS_BIT: bit_vector (7 downto 0); دستور انتساب برای متغیرها Variable_name := expression; سیگنال (Signal) signal list_of_signal_names: type [ := initial value]; signal SUM, CARRY: std_logic; signal CLOCK: bit; signal TRIGGER: integer :=0; signal DATA_BUS: bit_vector (0 to 7); signal VALUE: integer range 0 to 100; با یک تاخیر مشخص پس از اجرای دستور انتساب به روز می شوند SUM میتوان با یک توالی از مقادیر، یک شکل موج دلخواه ایجاد کرد signal wavefrm : std_logic; wavefrm تفاوت متغیر و سیگنال انتساب متغیر با ':=' و انتساب سیگنال با' انتساب متغیر بدون تاخیر ولی انتساب سیگنال با تاخیر(دلتا) انتساب متغیر ترتیبی و انتساب سیگنال همروند دستور انتساب سیگنال همروند ساده Target_signal انتساب موقع وقوع یک رخداد در یکی از سیگنالها عبارت نوع target_signal باید با نوع عبارت یکسان باشد دستور انتساب سیگنال شرطی Target_signal expression when Boolean_condition else : expression when Boolean_condition else expression; مقدار اولین عبارتی که شرط آن درست است انتساب داده می شود وقوع یک رخداد در یکی از سیگنالهای موجود در عبارات یا شرط ها باعث ارزشیابی مجدد شده و انتساب انجام می شود دستور انتساب سیگنال انتخابی with choice_expression select target_name target_name : target_name target_name target یکی از مقادیر expression را دریافت می کند بر حسب اینکه عبارت choice_expression با کدام یک از choice ها برابر است اولین choice که برابر باشد حساب است Choice می تواند یک عبارت یا یک بازه باشد (مثل 4 to 9) Choice ها نباید همپوشانی داشته باشند تمام حالات choice_expression باید پوشش داده شود.
مگر اینکه others داشته باشیم توجه شود که others باید آخرین انتخاب باشد مدلسازی رفتاری : دستورات ترتیبی جملات همروند : مدل سازی جریان داده(data flow) جملات ترتیبی : مدل سازی الگوریتمی پردازه (process) یک ساختار )امکان استفاده از جملات ترتیبی( امکان مدلسازی سیستم های پیچیده داخل architecture معادل یک دستور همروند محسوب می شود جملات داخل آن بصورت ترتیبی اجرا می شوند اصولا برای توصیف مدارات ترتیبی گرچه می توان برای مدارات ترکیبی نیز استفاده نمود دستورIF دستور IF ترتیب اجرای دستورات ترتیبی را بر اساس شرط معین می کند if condition then sequential statements [elsif condition then sequential statements ] [else sequential statements ] end if; جمله elsif می تواند به تعداد بیشتری تکرار شود دستور مربوطه به اولین شرط درست اجرا می شود دستور IF را بصورت لانه ای (تودرتو) نیز می توان نوشت.
entity MUX_4_1a is port (S1, S0, A, B, C, D: in std_logic; Z: out std_logic); end MUX_4_1a; architecture behav_MUX41a of MUX_4_1a is begin P1: process (S1, S0, A, B, C, D) begin if (( not S1 and not S0 )= ’1’) then Z elsif (( not S1 and S0) = ‘1’) then Z elsif ((S1 and not S0) = ’1’) then Z else Z end if; end process P1; end behav_MUX41a; entity MUX_4_1a is port (S1, S0, A, B, C, D: in std_logic; Z: out std_logic); end MUX_4_1a; architecture behav_MUX41a of MUX_4_1a is begin P1: process (S1, S0, A, B, C, D) begin if S1=’0’ and S0=’0’ then Z elsif S1=’0’ and S0=’1’ then Z elsif S1=’1’ and S0=’0’ then Z elsif S1=’1’ and S0=’1’ then Z end if;end process P1; end behav_MUX41a; انواع عملگرها اولویت از پایین به بالا و از راست به چپ مگر اینکه از پرانتز استفاده شود دستور Case case expression is when choices => sequential statements when choices => sequential statements -- branches are allowed [when others => sequential statements ] end case; دو انتخاب(choice) نباید با هم همپوشانی داشته باشند.
اگر “when others” ذکر نمی شود تمام مقادیر ممکن برای عبارت باید بوسیله مجموعه انتخابها پوشش داده شود.
مثال : مالتی پلکسر 4 به 1 entity MUX_4_1 is port ( SEL: in std_logic_vector(2 downto 1); A, B, C, D: in std_logic; Z: out std_logic); end MUX_4_1; architecture behav_MUX41 of MUX_4_1 is begin PR_MUX: process (SEL, A, B, C, D) begin case SEL is when “00” => Z when “01” => Z when “10” => Z when “11” => Z when others => Z end case; end process PR_MUX; end behav_MUX41; طراحی مدارات ترتیبی و ماشین حالت مدارات ترتیبی شامل: سیگنالهای ورودی سیگنالهای خروجی سیگنال کلاک احیانا یکسری سیگنالهای کنترولی دیگر (مانند reset ) سیگنالهای کنترلی می توانند فعال صفر یا یک باشند انتقال از یک وضعیت به وضعیت دیگر لبه سیگنال کلاک (clock'event and clock='1') (clock'event and clock=‘0') مثال) آشکارساز توالی بیت (ماشین مور) توصیف رفتاری یک ماشین حالت از نوع مور هدف: تشخیص رشته ی بیتی “1110101101” است هر آشکار ساز توالی n بیتی به روش مور n+1 حالت مورد نیاز دارد چون 10 بیت داریم 11 حالت درنظر می گیریم ENTITY seqdetector IS PORT (clk, reset :IN STD_LOGIC; input :IN STD_LOGIC; output :OUT STD_LOGIC ); END seqdetector ; ARCHITECTURE stat OF seqdetector IS TYPE STATE_TYPE IS (s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10); SIGNAL state, next_state : STATE_TYPE; BEGIN state_register: PROCESS (clk, reset) BEGIN IF reset = '0' THEN state output ELSIF clk'EVENT AND clk = '1' THEN state END IF; END PROCESS state_register;