1 - سطح گیت
جلسه اول (ماژول ها) جلسه دوم (گیت ها) جلسه سوم (نوع سیگنال) جلسه چهارم (پایان فصل)2 - مقداردهی مداوم
جلسه پنجم (اُپراتور ها) جلسه ششم (آرایه ها) جلسه هفتم (شرط ها) جلسه هشتم (فراخوانی ماژول) جلسه نهم (تست بنچ) جلسه دهم (نگاشت حافظه)3 - سطح رفتاری (ترکیبی)
جلسه یازدهم (بلاک Always) جلسه دوازدهم (ابزار ها) جلسه سیزدهم (نوع پردازش) جلسه چهاردهم (نکات تکمیلی) جلسه پانزدهم (پایان فصل)4 - سطح رفتاری (ترتیبی)
جلسه شانزدهم (لبه ها) جلسه هفدهم (تست بنچ 2) جلسه هجدهم (شمارنده ها) جلسه نوزدهم (ضرب و شیفت) جلسه بیستم (استیت ماشین) جلسه بیست و یکم (کشف رشته) جلسه بیست و دوم (فرکانس) جلسه بیست و سوم (نان بلاک) جلسه بیست و چهارم (پایان)5 - جلسات تمرینی
جلسه تمرین اول (تاخیر ها) جلسه تمرین دوم (الحاق-منطق) جلسه تمرین سوم (شیفت ها) جلسه تمرین چهارم (استیت)6 - مثال های پروژه محور
پروژه طراحی پردازنده RTL پروژه پردازنده Maano پروژه پردازنده MIPS7 - ارتباط و گفتگو
ارتباط با نویسنده گروه تلگرام تبلیغات و آگهیآموزش وریلاگ آموزش Verilog
در جلسه آخر فصل اول هستیم ، دو تا مثال حل میکنیم و بعدش یکم باهم گپ میزنیم و آماده میشیم برای فصل بعدی که بسیار جذاب تر از این فصل خواهد بود.
تصویر بالا یک فلیپ فلاپ از نوع J-K هست که قصد داریم کد شو بنویسیم . ابتدا ورودی ، خروجی و سیگنال های واسطه رو تعریف میکنیم :
1- 2- 3- 4- 5- 6- 7- 8- 9- 10- 11-
module FlipFlop( input J, input K, input Clk, output Q, output Q_Prim ); wire S,R; endmodule
کد بالا معادل شکل زیر :
خب حالا گیت هارو اضافه می کنیم به کد برنامه مون :
1- 2- 3- 4- 5- 6- 7- 8- 9- 10- 11- 12- 13- 14- 15- 16-
module FlipFlop( input J, input K, input Clk, output Q, output Q_Prim ); wire S,R; nand(R,Q_Prim,J,Clk); //R = ~(Q' & J & Clk) nand(S,Clk,K,Q); //S = ~(Clk & K & Q) nand(Q,R,Q_Prim); //Q = ~(Q' & R) nand(Q_Prim,Q,S); //Q' = ~(Q & S) endmodule
شاید سوال پیش بیاد که برای ورودی کلاک پالس باید کار خاصی کنیم ؟ خیر ، اصلا به ما چه ربطی داره که ورودی چی میخواد باشه ؟ ما فقط وظیفه داریم ورودی و خروجی ها رو به گیت ها وصل کنیم ، همین . یا شاید بپرسید ، چرا خروجی ماژول ، وصل شده به ورودی گیت ها ، ببینید خروجی ماژول حق نداره ورودی ماژول باشه ، اما میتونه ورودی گیت های داخلی باشه ، به عبارتی دیگر شما خروجی و ورودی های ماژول رو هرجایی که دوست داشتید میتونید وارد کنید کسی هم نمی تونه جلوی شما رو بگیره . و این نکته هم بد نیست بگم ، توی خط 11 و 12 ، کلید واژه nand ما سه تا ورودی داره ، اصلا مشکلی نداره ممکنه گیت ما صد ها ورودی داشته باشه ، شما فقط کافیه خروجی رو سمت چپ بنویسید و مابقی ورودی هارو بعدش بنویسید ، مثلا فرض کنید قراره سیگنال های A,B,C,D,E,F رو اَند کنیم و حاصل رو با Z نمایش بدیم ، در این صورت کافیه بنویسیم : and (Z,A,B,C,D,E,F) به همین راحتی . خب حالا بریم سراغ مثال آخر این فصل :
فرض کنید مدار بالا ، مربوط به یک بُمب میباشد، ورودی A رو داریم به همراه خروجی های S,C ، همینطور دو سیگنال واسطه ای داریم که مقدار ثابت دارند ، یعنی یکی شون 1 منطقی یا همون 5 وُلت هست و دیگری 0 منطقی یا همون زمین هست. در روش اول سیگنال های واسطه ای رو به این صورت تعریف کنیم :
1- 2- 3- 4- 5- 6- 7- 8- 9- 10-
module Bomb( input A, output S, output C ); wire n=1'b1; //n=1 wire m=1'b0; //m=0 endmodule
حالا گیت هارو اضافه میکنیم :
1- 2- 3- 4- 5- 6- 7- 8- 9- 10- 11- 12- 13-
module Bomb( input A, output S, output C ); wire n=1'b1; //n=1 wire m=1'b0; //m=0 xor(S,A,n); //S = A ^ 1 and(C,A,m); //C = A & 0 endmodule
روش دوم اینه که بصورت مستقیم و بدون تعریف کردن wire ، مقادیر سیگنالهای واسطه رو به گیت ها بدیم :
1- 2- 3- 4- 5- 6- 7- 8- 9- 10-
module Bomb( input A, output S, output C ); xor(S,A,1'b1); //S = A ^ 1 and(C,A,1'b0); //C = A & 0 endmodule
بنظر من روش دوم خیلی بهتر و زیباتره ، احتمالا واستون سوال پیش اومده که چطور یک مقداردهی انجام میشه و عبارت n=1'b1 و m=1’b0 از کجا اومد !! ببینید اول توضیح بدم که یک متغییر یا سیگنال ، میتونه 4 مقدار داشته باشه : 0 که همون زمین یا صفر منطقی هست ، 1 که همون ولتاژ بالا یا یک منطقی هست ، Z که به معنای HZ ( های امپدانس ) هست و در جاهای خاص استفاده میکنیم ، X که به معنای مقدار نامشخص هست که این روهم در جاهای خاص استفاده می کنیم . حالا نحوه مقداردهی به این صورته که ، اول مشخص کنید سیگنال تون چند بیت داره (توی این فصل تمام سیگنال هایی که ما تعریف کردیم یک بیتی بودن ، در فصل بعدی با سیگنال های چند بیتی آشنا میشیم) ، بعدش یدونه علامت کوتیشن بذارید ، تا اینجا شد n=1’b ، حالا باید تعیین کنین فُرمت مقداردهی تون چیه ؟ باینری b ؟ دسیمال d ؟ هگز h ؟ که ما در اکثر مواقع با فُرمت باینری مقداردهی انجام میدیم که میشه فرمت b ، پس تا اینجا داریم n=1’b ، حالا باید مقدار سیگنال رو بنویسید ، اگه دوست دارید 0 منطقی باشه ، صفر رو بنویسید یعنی n=1’b0 یا اگه دوست دارید 1 منطقی باشه یک رو بنویسید n=1’b1 . البته میتونید های امپدانس n=1’bZ و یا مقدار نامشخص n=1’bX هم بهش بدید. این فصل تموم شد، حالا بیاید کمی باهم گپ بزنیم ، چه پیشنهاداتی دارید ؟ دوس دارید چه چیزهایی اضافه یا کم بشه ؟ در کامنت ها با شما خواهم بود .یک نکته هم بهتون بگم حتما سعی کنید فیلم جلسات رو دانلود کنید مخصوصا این جلسات رو که رایگان هم هست ، من توی فیلم نکات بیشتر و مباحث رو کامل تر میگم که باعث میشه حرفه ای تر بشید . دانلود فیلم جلسه
رفتن به جلسه بعد ...علی
سلام چرا به جای n=1'b1 مستقیم عدد 1 رو ندادید؟ میتونید بنویسید and=(x,a.1) چون اگر بخوایم بیت تعریف کنیم میتونیم موقع اینپوت کردن تعداد بیت رو تعیین کرد
سید محسن
متوجه حرف ات نشدم . من یه عدد یه بیتی میخاستم چون یه سیم بیشتر نبود و توی دنیای مدارمنطقی یدونه سیم برق یعنی یه بیت داده .