1 - سطح گیت
جلسه اول (ماژول ها) جلسه دوم (گیت ها) جلسه سوم (نوع سیگنال) جلسه چهارم (پایان فصل)2 - مقداردهی مداوم
جلسه پنجم (اُپراتور ها) جلسه ششم (آرایه ها) جلسه هفتم (شرط ها) جلسه هشتم (فراخوانی ماژول) جلسه نهم (تست بنچ) جلسه دهم (نگاشت حافظه)3 - سطح رفتاری (ترکیبی)
جلسه یازدهم (بلاک Always) جلسه دوازدهم (ابزار ها) جلسه سیزدهم (نوع پردازش) جلسه چهاردهم (نکات تکمیلی) جلسه پانزدهم (پایان فصل)4 - سطح رفتاری (ترتیبی)
جلسه شانزدهم (لبه ها) جلسه هفدهم (تست بنچ 2) جلسه هجدهم (شمارنده ها) جلسه نوزدهم (ضرب و شیفت) جلسه بیستم (استیت ماشین) جلسه بیست و یکم (کشف رشته) جلسه بیست و دوم (فرکانس) جلسه بیست و سوم (نان بلاک) جلسه بیست و چهارم (پایان)5 - جلسات تمرینی
جلسه تمرین اول (تاخیر ها) جلسه تمرین دوم (الحاق-منطق) جلسه تمرین سوم (شیفت ها) جلسه تمرین چهارم (استیت)6 - مثال های پروژه محور
پروژه طراحی پردازنده RTL پروژه پردازنده Maano پروژه پردازنده MIPS7 - ارتباط و گفتگو
ارتباط با نویسنده گروه تلگرام تبلیغات و آگهیآموزش وریلاگ آموزش Verilog
ابتدا در مورد الحاق صحبت میکنم و بعدش میرسیم به منطق ! ببینید الحاق یعنی بصورت موقتی چند تا سیگنال رو کنار هم بذاریم و ازشون یه استفاده ای کنیم و بعد رها شون کنیم به حالت اول خودشون . مثلا ممکنه چند تا چیز رو الحاق کنیم کنار هم ، بعد از مقدار شون استفاده کنیم برای جای دیگه ای سپس اینایی که الحاق شدن رو ولشون کنیم . یا مثلا چند تا سیگنال رو الحاق میکنیم و بصورت یکجا بهشون مقدار میدیم و بعد هر کدوم رو ول میکنیم به حال خودشون . خلاصه که در الحاق ، سیگنال ها برای لحظه ای کنار هم قرار میگیرند تا ما یه کاری رو انجام بدیم .
1- 2- 3- 4- 5- 6- 7- 8- 9- 10- 11-
module Test( input [3:0] A, input [3:0] B, output [7:0] F ); assign F={A,B}; //A=0010 , B=1111 ~> F=00101111 endmodule
به کد بالا نگاه کنین ، میخوایم خروجی F ، چهار بیت بالاش مقدار A باشه و چهار بیت پایینش مقدار B باشه ، برای اینکار راه های زیادی هست اما یه راه الحاق هست ، مقدار A رو در کنار مقدار B گذاشتم (الحاق کردم) و دادمش به F . حالا بعدش دیگه A مقدار اولی خودشُ داره B هم همون مقدار اولی خودشُ داره ولی این وسط F یه مقدار جدید پیدا کرده ترکیبی از A و B . توی کامنت خط 9 یه نمونه مثال زدم با خط سبز رنگ .
1- 2- 3- 4- 5- 6- 7- 8- 9- 10-
module Test( output [5:0] F, output [5:0] G ); assign {F,G}=12'b0; //{F,G}=000000000000 ~> F=000000 , G=000000 endmodule
یا توی کد بالا ببینید ، میخوام خروجی F و G رو برابر با صفر قرار بدم . خیلی راحت میتونستم بصورت جداگونه توی 2 خط مقدار هر کدوم رو صفر کنم اما یه راه دیگه استفاده از روش الحاق هستش . یه لحظه F و G رو کنار هم گذاشتم و 12 تا صفر ریختم توشون که 6 تا ازین صفر ها میرسه به F و 6 تا دیگه میرسه به G ، به همین راحتی .
1- 2- 3- 4- 5- 6- 7- 8- 9- 10- 11- 12- 13- 14- 15-
module Test( input [3:0] A, input [3:0] B, output F, output G, output K, output D, ); assign {F,G,K,D}=A+B; //A=0010 , B=0011 ~> A+B=0101 //{F,G,K,D}=0101 ~> F=0,G=1,K=0,D=1 endmodule
توی کد بالا دقیقا مشابه با کد قبلی عمل کردیم ، عدد A و B رو باهم جمع کردیم که حاصل چهاربیتی خواهد بود . حالا گفتیم این چهاربیت ریخته بشه توی F و G و K و ِD که هر کدوم تک بیتی هستن و F بزرگترین بیتِ حاصل جمع و D کوچکترین بیتِ حاصل جمع رو خواهد گرفت .
1- 2- 3- 4- 5- 6- 7- 8- 9- 10- 11- 12-
module Test( input [2:0] A, input B, output F ); if({A,B}==4'b0011) F=1; //if (A=3'b001 && B==1) ~> F=1; endmodule
توی کد بالا میخوام شرط بذارم که اگر A=001 و B=1 بود ، خروجی یک بشه . برای اینکار میتونم دوتا شرط بذارم ولی یه راه دیگه مثل استفاده از الحاق داریم . کافیه بگم A,B=0011 که در اینصورت دقیقا همون کار رو برای ما انجام میده . البته میتونستم اینجوری هم بنویسم B,A=1001 که باز هم یعنی B=1 و A=001 . از الحاق ها جاهای مختلفی استفاده میکنیم و نمک برنامه نویسی هستند که باعث میشن گاهی وقتا با نیم خط الحاق ، کار معادل با چند خط برنامه انجام بشه .
توجه : مطالب زیر ممکنه یکم واستون سنگین باشه ، اگه متوجه شدید چه بهتر ، اگه نشدید سعی کنید ویدئو جلسه هفتم رو رایگان دانلود کنید و تماشا کنید ، اگه با ویدئو هم متوجه مطالب زیر نشدید هیچ عیبی نداره ، از این مطالب عبور کنید الان زیاد واجب نیست بلد باشید اینارو . برید تا جلسه 24 وریلاگ ، بعدا برگردید دوباره همینجا و این مباحث رو بخونید .
حالا میخوام درباره اپراتور های Logical و Bitwise صحبت کنم اما قبلش باید یه مقدمه از منطق بگم پس حوصله کنید . ببینید در دیجیتال از نظر منطق یا یچیزی 1 هست ، یا 0 هست که بهش میگیم ارزش منطقی . بنابراین اعداد هرچند بیت که میخوان باشن از یک بیت تا صد بیت ، یه ارزش مقداری دارند و یه ارزش منطقی . ارزش مقداری که مشخصه مثلا عدد 0011 ارزش مقداری 3 رو داره . اما ارزش منطقی چیه ؟ تمامی اعداد بجز صفر ارزش منطقی 1 دارند و عدد صفر ارزش منطقی 0 رو داره . بنابراین عدد 0011 ارزش مقداری 3 و ارزش منطقی 1 رو داره و عدد 0000 ارزش مقداری 0 و ارزش منطقی 0 رو داره . خب حالا اینو چرا گفتم ؟ ببینید ما یه سری اُپراتور داریم که روی ارزش مقداری اعداد عمل میکنند (Bitwise) و یه سری اُپراتور دیگه داریم که روی ارزش منطقی اعداد عمل میکنند (Logical) . اپراتور & یکی از اپراتور هایی هست که روی ارزش مقداری و بصورت Bitwise عمل میکنه :
1- 2- 3- 4- 5- 6- 7- 8- 9- 10- 11- 12- 13- 14- 15- 16- 17- 18- 19- 20- 21- 22- 23- 24- 25- 26- 27- 28- 29-
module Test( input [3:0] A, input [3:0] B, input C, input D, output [3:0] F output [3:0] H output G ); assign F=A&B; //A=0010 , B=1111 ~> F=0010 assign G=C&D; //C=1 , D=1 ~> G=1 assign H=C&D; //C=1 , D=1 ~> H=0001 if(A) //A=0110 = if(1) //A=1111 = if(1) //A=0000 = if(0) if(A&B) //A=0010 , B=1111 ~> if(0010) = if(1) //A=0010 , B=1000 ~> if(0000) = if(0) endmodule
همونطور که توی خط 12 میبینید اگه A=0010 و B=1111 باشه ، اپراتور & میاد بصورت بیت به بیت ، نظیر به نظیر بیت هارو باهم دیگه and میکنه و یه چهاربیتی به ما پس میده . مثلا توی خط 15 دو تا عدد تک بیتی باهم and میشن و حاصل توی یه عدد تک بیتی جا میگیره . یا مثلا توی خط 18 دوتا عدد تک بیتی باهم and میشن و حاصل یک بیت 1 خواهد بود حالا اگه این 1 رو بخوایم توی یه عدد 4 بیتی بریزیم میشه 0001 . خط 20 با یک اپراتور if سر و کار داریم ، اپراتور if با مقدار کاری نداره بلکه با ارزش منطقی عبارت داخل پرانتزش کار داره ، اگه توی if یه عدد مثلا 0110 بذاریم ارزش منطقی اون 1 هست و if اجرا میشه (البته در این مثال دستوری برای if ننوشتیم تا در صورت صحیح بودن شرط بخواد اجرا بشه) خط 25 ابتدا یک اپراتور Bitwise داریم ، دو عدد رو میگیره با هم بیت به بیت and میکنه سپس حاصل شو به if میسپاره ، اگه ارزش منطقیش 1 باشه if اجرا میشه و اگه ارزش منطقیش 0 باشه if اجرا نمیشه .
1- 2- 3- 4- 5- 6- 7- 8- 9- 10- 11- 12- 13- 14- 15- 16- 17- 18- 19- 20- 21- 22- 23- 24-
module Test( input [3:0] A, input [3:0] B, input C, input D, output [3:0] F output [3:0] H output G ); assign F=A&&B; //A=0010 , B=1111 ~> F=0001 assign G=C&&D; //C=1 , D=1 ~> G=1 assign H=C&&D; //C=1 , D=1 ~> H=0001 if(A&&B) //A=0010 , B=1111 ~> if(1) //A=0010 , B=1000 ~> if(1) endmodule
توی کد بالا از اپراتور && استفاده کردیم که یک اپراتور منطقی است و اصلا با مقادیر و بیت ها کاری نداره . توی خط 12 ببینید ، ارزش منطقی A چند هست ؟ 1 ارزش منطقی B چند هست ؟ 1 بنابراین میاد ارزش منطقی دو عدد رو باهم and میکنه که حاصل 1 بیت یک خواهد بود که اگه بریزیم توی یه عدد چهاربیتی میشه 0001 . در خط 15 و 18 نیز به همین صورت . خط 21 و 22 ابتدا ارزش های منطقی دو عدد باهم and شده سپس به if داده می شود . که هر چهار عدد مثال زده شده ارزش منطقی 1 را دارند . لطفا خط 22 این مثال رو با خط 27 مثال قبلی مقایسه کنید تا متوجه تفاوت ها بشید .
1- 2- 3- 4- 5- 6- 7- 8- 9- 10- 11- 12- 13- 14- 15- 16- 17- 18- 19- 20- 21- 22- 23-
module Test( input [3:0] A, input [3:0] B, input C, input D, output [3:0] F output [3:0] H output G ); assign F=A|B; //A=0010 , B=0011 ~> F=0011 assign G=C|D; //C=0 , D=1 ~> G=1 assign H=C|D; //C=0 , D=1 ~> H=0001 if(A|B) //A=0010 , B=0011 ~> if(0011) = if(1) endmodule
اپراتور | مشابه اپراتور & از نوع Bitwise بوده و عمل or رو روی تک تک بیت ها نظیر به نظیر انجام میده و چون عملکردش مشابه & هست من توضیحی نمیدم . در همین حد بگم که عمل or رو روی تک تک بیت ها انجام میده و کاری با ارزش منطقی اعداد نداره .
1- 2- 3- 4- 5- 6- 7- 8- 9- 10- 11- 12- 13- 14- 15- 16- 17- 18- 19- 20- 21- 22- 23-
module Test( input [3:0] A, input [3:0] B, input C, input D, output [3:0] F output [3:0] H output G ); assign F=A||B; //A=0010 , B=0011 ~> F=0001 assign G=C||D; //C=0 , D=1 ~> G=1 assign H=C||D; //C=0 , D=1 ~> H=0001 if(A||B) //A=0010 , B=0011 ~> if(1) endmodule
و اما اپراتور منطقی || که ارزش منطقی اعداد رو باهم or میکنه . خط 12 رو ببینید ارزش منطقی A یک هست و ارزش منطقی B یک هست که این دوتا بیت اگه باهم or بشن حاصل یک بیت 1 خواهد بود که اگه 1 رو بریزیم توی 4 بیت ، میشه 0001 و بقیه موارد هم خودتون باید استاد شده باشید دیگه من نگم . نکته اینکه وقتی دوتا عدد چهاربیتی رو باهم & یا | می کنید حاصل کار چهار بیت خواهد شد اما اگه دو عدد چهاربیتی رو باهم && یا || کنیم حاصل یک بیت خواهد بود یا 0 یا 1 .
1- 2- 3- 4- 5- 6- 7- 8- 9- 10- 11- 12- 13- 14- 15- 16- 17- 18- 19- 20- 21- 22- 23- 24- 25- 26-
module Test( input [3:0] A, input C, output [3:0] F output [3:0] H output G ); assign F=~A; //A=0011 ~> F=1100 assign G=~C; //C=0 ~> G=1 assign H=~C; //C=0 ~> H=0001 if(~A) //A=0011 ~> if(1100) = if(1) //A=1111 ~> if(0000) = if(0) if(~C) //C=0 ~> if(1) //C=1 ~> if(0) endmodule
اپراتور بعدی ~ هست که بصورت Bitwise عمل نات رو روی بیت های یک عدد اعمال میکنه . بنظرم توضیح خاصی نیاز نیست ، خطوط سبز کامنت رو بخونید متوجه میشید .
1- 2- 3- 4- 5- 6- 7- 8- 9- 10- 11- 12- 13- 14- 15- 16- 17- 18- 19- 20- 21- 22- 23- 24- 25- 26- 27- 28-
module Test( input [3:0] A, input C, output [3:0] F output [3:0] H output G ); assign F=!A; //A=0011 ~> F=0000 //A=0000 ~> F=0001 assign G=!C; //C=0 ~> G=1 assign H=!C; //C=0 ~> H=0001 if(!A) //A=0011 ~> if(0) //A=1111 ~> if(0) //A=0000 ~> if(1) if(!C) //C=0 ~> if(1) //C=1 ~> if(0) endmodule
آخرین اُپراتوری که در این جلسه می خونیم ، اپراتور معکوس کننده منطق هست که با ! نشون میدیم . این اپراتور ارزش منطقی هر عدد رو معکوس میکنه . خط 10 رو ببینید ، ارزش منطقی A یک هست که معکوس کنیم میشه صفر و در خط بعدی ارزش منطقی A صفر هست که معکوس کنیم میشه 1 و وقتی توی 4 بیت ریخته بشه ، میشه 0001 . بقیه خطوط رو هم خودتون مطالعه کنید چیز زیاد سختی نیست . خط 20 این مثال رو با خط 19 مثال قبلی مقایسه کنید تا متوجه تفاوت ها بشید . نکته اینکه اپراتور ~ و ! روی اعداد تک بیتی عملکردی مشابه دارند اما روی اعداد چندبیتی عملکردشون متفاوته که توی مثال های بالا به خوبی مشاهده کردید . باز هم میگم اگه حس میکنید مباحث مطرح شده در این جلسه واستون سنگین هستش اولا سعی کنید ویدئو جلسه 7 رو دانلود کنید تا بصورت فیلم محتوای این مباحث رو مشاهده کنید ، دوما اگه با فیلم هم متوجه نمیشید عیبی نداره ، آموزش وریلاگ رو ادامه بدید و تا جلسه 24 پیش برید بعدش برگردید به این جلسه تمرین 2 و مجددا این جلسه رو بخونید چون محتوای این جلسه فعلا زیاد واجب نیست .
رفتن به جلسه بعد ...