آموزش وریلاگ | پروژه وریلاگ
 گروه تلگرام 
VerilogCode.ir
آموزش وریلاگ | پروژه وریلاگ


آموزش وریلاگ - تمرین 2 :

آموزش وریلاگ آموزش Verilog

ابتدا در مورد الحاق صحبت میکنم و بعدش میرسیم به منطق ! ببینید الحاق یعنی بصورت موقتی چند تا سیگنال رو کنار هم بذاریم و ازشون یه استفاده ای کنیم و بعد رها شون کنیم به حالت اول خودشون . مثلا ممکنه چند تا چیز رو الحاق کنیم کنار هم ، بعد از مقدار شون استفاده کنیم برای جای دیگه ای سپس اینایی که الحاق شدن رو ولشون کنیم . یا مثلا چند تا سیگنال رو الحاق میکنیم و بصورت یکجا بهشون مقدار میدیم و بعد هر کدوم رو ول میکنیم به حال خودشون . خلاصه که در الحاق ، سیگنال ها برای لحظه ای کنار هم قرار میگیرند تا ما یه کاری رو انجام بدیم .

ISE Project - VerilogCode.ir : \ BoxT2-1.v
 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 یه نمونه مثال زدم با خط سبز رنگ .

ISE Project - VerilogCode.ir : \ BoxT2-2.v
 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 ، به همین راحتی .

ISE Project - VerilogCode.ir : \ BoxT2-3.v
 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 کوچکترین بیتِ حاصل جمع رو خواهد گرفت .

ISE Project - VerilogCode.ir : \ BoxT2-4.v
 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 عمل میکنه :

ISE Project - VerilogCode.ir : \ BoxT2-5.v
 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 اجرا نمیشه .

ISE Project - VerilogCode.ir : \ BoxT2-6.v
 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 مثال قبلی مقایسه کنید تا متوجه تفاوت ها بشید .

ISE Project - VerilogCode.ir : \ BoxT2-7.v
 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 رو روی تک تک بیت ها انجام میده و کاری با ارزش منطقی اعداد نداره .

ISE Project - VerilogCode.ir : \ BoxT2-8.v
 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 .

ISE Project - VerilogCode.ir : \ BoxT2-9.v
 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 عمل نات رو روی بیت های یک عدد اعمال میکنه . بنظرم توضیح خاصی نیاز نیست ، خطوط سبز کامنت رو بخونید متوجه میشید .

ISE Project - VerilogCode.ir : \ BoxT2-10.v
 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 و مجددا این جلسه رو بخونید چون محتوای این جلسه فعلا زیاد واجب نیست .

رفتن به جلسه بعد ...

مشاهده نظرات کاربران




پیام شما با موفقیت ارسال شد و به زودی در این قسمت به نمایش در خواهد آمد .
لطفا تمام فیلد های الزامی را پُر کنید .