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


آموزش وریلاگ - جلسه 23 :

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

دانلود فیلم مربوط به (جلسه بیست و سوم)

در این جلسه به دو مبحث نان بلاکینگ و طراحی در سطح RTL میپردازیم . نان بلاکینگ فقط در جاهایی مطرح میشه که از بلاک always استفاده کردیم و حتما توی لیست حساسیت ، لبه یک سیگنال رو (مثل کلاک) نوشتیم . بنابراین در گیت ها یا assign ها و یا (*)@always ها خبری از نان بلاکینگ نیست .
حالا قضیه نان بلاکینگ چیه ؟ توصیه شده در توصیف مدارات ترتیبی که با لبه یک کلاک یا لبه یک سیگنالی کار میکنند ، بجای = از => استفاده بشه . به کد زیر نگاه کنید ، این کد بلاکینگ نوشته شده :

ISE Project - VerilogCode.ir : \ Box23-1.v
 1-
 2-
 3-
 4-
 5-
 6-
 7- 
 8-
 9-
10-
11-
12-
13-
14-
15-
16-
17-
18-
19-
20- 
module Example(
    input   X,
    input   Y,
    input   K,
    input   P,
    input   Clk,
    output reg F,
    output reg G,
    output reg H
    );  
	
    always @(posedge Clk)
	begin
	    F = X+Y;
	    G = K-P;
	    if (K==1)
		H = 2*P;
	end
	
endmodule

اما به ما توصیه شده بود که نان بلاکینگ بنویسیم ، پس = هارو تبدیل به => میکنیم :

ISE Project - VerilogCode.ir : \ Box23-2.v
 1-
 2-
 3-
 4-
 5-
 6-
 7- 
 8-
 9-
10-
11-
12-
13-
14-
15-
16-
17-
18-
19-
20- 
module Example(
    input   X,
    input   Y,
    input   K,
    input   P,
    input   Clk,
    output reg F,
    output reg G,
    output reg H
    );  
	
    always @(posedge Clk)
	begin
	    F <= X+Y;
	    G <= K-P;
	    if (K==1)
		H <= 2*P;
	end
	
endmodule

خب حالا دوتا سوال پیش میاد ، اول اینکه چه فرقی کرد ؟ دوم اینکه چرا این توصیه به ما شده ؟ برای پاسخ به سوال اول به کد زیر نگاه کنید :

ISE Project - VerilogCode.ir : \ Box23-3.v
 1-
 2-
 3-
 4-
 5-
 6-
 7- 
 8-
 9-
10-
11-
12-
13-
14-
15-
16-
17-
18-
19-
module Example(
    input Clk,
    output reg [7:0] A,
    output reg [7:0] B
    );  
	
    initial 
	begin
	    A = 6;
	    B = 8;
	end
	
    always @(posedge Clk)
	begin
	    A = B;
	    B = A;
	end	
	
endmodule

در خط 8 مقدار اولیه A رو 6 و مقدار اولیه B رو 8 قراردادیم . حالا وقتی برای اولین بار لبه کلاک بیاد A=B خواهد شد ، یعنی A=8 میشه پس دیگه A شیش نیست، سپس در خط بعدی B=A میشه یعنی چند ؟ (B=A=8) بنابراین A و B هر دو مقدار 8 رو خواهند داشت . به این میگن مقداردهی به صورت بلاکینگ که مقدار هر متغییر توی هر خط تعیین میشه . اما بریم سراغ مقداردهی نان بلاکینگ :

ISE Project - VerilogCode.ir : \ Box23-4.v
 1-
 2-
 3-
 4-
 5-
 6-
 7- 
 8-
 9-
10-
11-
12-
13-
14-
15-
16-
17-
18-
19-
module Example(
    input Clk,
    output reg [7:0] A,
    output reg [7:0] B
    );  
	
    initial 
	begin
	    A = 6;
	    B = 8;
	end
	
    always @(posedge Clk)
	begin
	    A <= B;
	    B <= A;
	end	
	
endmodule

در خط 8 مقدار اولیه A و B شش و هشت شد . حالا وقتی برای اولین بار لبه کلاک بیاد ابتدا A<=B رو داریم ، آیا مقدار A هشت میشه ؟ خیر ، الان نمیشه ان شاالله بعدا خواهد شد ، بعدا یعنی کی ؟ یعنی وقتی تمام خطوط بلاک always انجام که شد .
پس نان بلاکینگ یعنی مقدار هر سیگنال در هر خط مشخص میشه اما اون مقدار رو اون لحظه نمیگیره بلکه در آخر میگیره ، پس فعلا مقدار A همون مقدار قبلی خودش می مونه تا خطوط بعدی خونده بشه ، وقتی خطوط بعدی خونده شد در آخر مقدار A هشت خواهد شد . در خط بعدی داریم B<=A خب حالا B باید چه مقداری بشه ؟ مقدار A ، مقدار A چنده ؟ شش ، هنوز هشت نشده پس مقدار B ان شاالله شش خواهد شد . خب حالا همه خطوط این بلاک خونده شد ، مقدار A و B برابر با مقادیری میشه که گفتیم ان شالله خواهد شد ، یعنی A هشت و B شش میشه . در صورتی که توی ساختار بلاکینگ مقدار هر دو سیگنال هشت میشد .

پس باید حواس مون رو جمع کنیم ، وقتی از => به جای = استفاده میکنیم ، ممکنه محاسبات مون تغییر کنه . پس سعی کنید وقتی نان بلاکینگ کدنویسی میکنید به این نکته توجه کنید که مقادیر سیگنال های سمت چپ ، به ترتیب داده نمیشه بلکه در آخر یکجا داده میشه . به مثال زیر دقت کنید :

ISE Project - VerilogCode.ir : \ Box23-5.v
 1-
 2-
 3-
 4-
 5-
 6-
 7- 
 8-
 9-
10-
11-
12-
13-
14-
15-
16-
17-
module Example(
    input Clk,
    output reg X
    );  
	
    reg [7:0] Counter; 
    initial 
        Counter = 0;
	
    always @(posedge Clk)
	begin
	    Counter = Counter+1;
	    if (Counter == 5)
		X = 1;
	end	
	
endmodule

بعد از اومدن پنج تا لبه کلاک ، مقدار کانتر ما 5 خواهد شد سپس شرط مذکور برقرار شده و سیگنال X=1 خواهد شد ، پس در این ساختار بلاکینگ مقدار سیگنال X بعد از 5 کلاک ، یک خواهد شد . اما در مثال زیر :

ISE Project - VerilogCode.ir : \ Box23-6.v
 1-
 2-
 3-
 4-
 5-
 6-
 7- 
 8-
 9-
10-
11-
12-
13-
14-
15-
16-
17-
module Example(
    input Clk,
    output reg X
    );  
	
    reg [7:0] Counter; 
    initial 
        Counter = 0;
	
    always @(posedge Clk)
	begin
	    Counter <= Counter+1;
	    if (Counter == 5)
		X <= 1;
	end	
	
endmodule

این ساختار نان بلاکینگ است ، بعد از اومدن پنج کلاک مقدار کانتر در کلاکه پنجم ، 5 نخواهد شد ، بلکه ان شالله 5 خواهد شد ، پس وقتی به شرط میرسیم هنوز مقدار کانتر 5 نشده و X=1 نمیشه ، وقتی که از شرط عبور میکنیم به انتهای بلاک رسیدیم حالا کانتر پنج میشه ، در کلاک ششم مقدار کانتر ان شاالله شش خواهد شد ، به شرط میرسیم مقدار کانتر چند هست ؟ 5 ، پس X=1 میشه ، پس در اینجا میبینیم بعد از طی شدن 6 کلاک ، مقدار X=1 شد .

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

مبحث بعدی که قرار بود در این جلسه بهش بپردازیم ، بحث توصیف در سطح RTL هستش . ما می تونیم انواع مدارات رو در سطح گیت ، رفتاری و ... توصیف کنیم اما استاندارد ترین نوع توصیف ، توصیف RTL هست که مهم ترین ویژگی این توصیف اینه که معمولا مدار به دو بخش دیتاپس و کنترل یونیت تقسیم میشه . این بحث یک مسئله کاربردی و مهمه که در قالب نوشتار نمیشه توضیحش داد بنابراین سعی کنید مثال پروژه محور "طراحی پردازنده RTL" رو تهیه کنید تا با نحوه توصیف مدارات در سطح RTL آشنا بشید . این مبحث بسیار مهمه ، چون من توی یک پاراگراف توضیح دادم و یا اینکه آخرین مبحث دوره است دلیلی بر بی اهمیت بودن این قضیه نیست بلکه مشکل اینه توی نوشتار نمیشه این مبحث مهم رو منتقل کرد . برای تهیه این مثال پروژه محور میتونید از کد تخفیف Fer استفاده کنید . (F بزرگ)
دانلود فیلم جلسه

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

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




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


مهسا

دم شما گرم

سید محسن

چاکریم :D

یاسین عرفانی پور

یکی از بهترین دوره هایی بود که دیدم و کل دوره رو تهیه کردم، خیلی ممنون آقای باقری عزیز.

سید محسن

امیدوارم در ادامه مسیر درسی تون موفق باشید