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


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

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

توی جلسه نوزدهم یه ضرب کننده نوشتیم ، اون موقع هنوز با استراتژی حل استیت ماشین ها آشنا نشده بودیم اما حالا که آشنا شدیم قصد دارم توی این جلسه تمرینی بهتون بگم چطور میشه با استراتژی استیت ماشین این ضرب کننده ترتیبی رو پیاده سازی کرد .
اینکه استیت ماشین مون رو چطور رسم کنیم وحی منزل نیست ، هرکسی میتونه تعداد استیت ها و نحوه قرارگیری شون رو به سلیقه خودش و باتوجه به ماهیت مسئله رسم کنه .

آموزش وریلاگ

شکل بالا رو ببینید ، من از پنج استیت استفاده کردم ، استیت اول ریست هست و تا زمانی که سیگنال Rst من صفر باشه در همین استیت می مونیم . در صورتی که Rst یک بشه به استیت بعدی میریم که وظیفه داره یک شرط رو بررسی کنه (یک بودن کوچکترین بیتِ B) و در صورت برقراری شرط F=F+A رو انجام بده و سپس به استیت بعدی بره . در این استیت قراره A و B رو شیفت بعدی و بعدش به استیت بعدی بریم ، در این استیت یه واحد به N اضافه میکنیم و اگه حاصل از 8 کوچکتر شد به استیت SumF و درغیر اینصورت به استیت نهایی یعنی End خواهیم رفت .
کد وریلاگ زیر برنامه این استیت ماشین هست البته زیاد جدی نگیرید تا خط 35 فقط تعاریف اولیه است و چیزی نداره ، از خط 35 تا 70 هم بخش اصلی برنامه است .

ISE Project - VerilogCode.ir : \ BoxT4-1.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-
30-
31-
32-
33-
34-
35-
36-
37-
38-
39-
40-
41-
42-
43-
44-
45-
46-
47-
48-
49-
50-
51-
52-
53-
54-
55-
56-
57-
58-
59-
60-
61-
62-
63-
64-
65-
66-
67-
68-
69-
70-
71-
72-
73-
74-
75-
76-
77-
module Zarb_State(
    input Clk,
    input Rst,
    input [7:0] A,
    input [7:0] B,
    output reg [15:0] F,
    output reg DONE
    ); 
	
parameter Reset=3'b000;
parameter SumF=3'b001;
parameter Shift=3'b010;
parameter SumN=3'b011;
parameter End=3'b100;

reg [15:0] Copy_A;
reg [7:0] Copy_B;
reg [7:0] N;
reg [2:0] State;

	
always @(posedge Clk or negedge Rst)
begin

if(~Rst)
begin
    F=0;
    N=0;
    Copy_A={8'b0,A};
    Copy_B=B;
    DONE=0;
    State=Reset;
end

else
begin

    case(State)
	
	Reset : begin
                State=SumF;
                end				

	SumF  : begin
                if(Copy_B[0])
                    F=F+Copy_A;
					
                State=Shift;
                end				

	Shift : begin
                Copy_A=Copy_A<<1;
                Copy_B=Copy_B>>1;
                State=SumN;
                end				

	SumN  : begin
                N=N+1;
                if(N==8)
                    State=End;
                else
                    State=SumF;
                end				

	End   : begin
                DONE=1;
                State=End;
                end				
			
    endcase
	
end


end

endmodule

تا خط 7 ورودی ها و خروجی هارو تعریف کردیم و خط 10 تا 14 به کمک پارامتر ها برای استیت هامون اسم انتخاب کردیم . خط 16 تا 19 هم متغییر های کمکی مون رو تعریف کردیم تا مقدار A , B و مقدار استیت و شمارنده N مون رو توشون ذخیره کنیم .
ابتدا مشخص کردیم اگه سیگنال ریست فعال بود مقدار سیگنال هایی که تعریف کردیم چند باشه و همچنین استیت رو در حالت Reset قرار دادیم . در غیر اینصورت اگه سیگنال ریست فعال نبود با توجه به اینکه در چه استیتی هستیم ، مشخص کردیم به چه استیتی بریم و چه کارهایی انجام بشه .بنابراین یه کیس روی استیت زدیم و سپس مشخص کردیم که توی هر استیت چه اتفاقاتی رقم بخوره . (اگه مراحل ضرب کننده ترتیبی رو فراموش کردید به جلسه 19 مراجعه کنید).

آموزش وریلاگ

استیت ماشین بالا یک تعریف دیگه از ضرب کننده ترتیبی هست ، خواستم بهتون نشون بدم برای یک مسئله میشه چندین استیت ماشین رسم کرد و جواب ها یکتا نیست . در استیت ماشین بالا سه استیت داریم که در استیت اول ضرب کننده ریست هست ، در استیت بعدی عمل F=F+A و شیفت A ,B و اضافه شدن N همزمان انجام می شود و اگر N هشت شده بود به استیت انتهایی خواهیم رفت در غیر اینصورت در استیت Task باقی می مونیم و مجددا عمل جمع و شیفت رو انجام میدیم .

ISE Project - VerilogCode.ir : \ BoxT4-2.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-
30-
31-
32-
33-
34-
35-
36-
37-
38-
39-
40-
41-
42-
43-
44-
45-
46-
47-
48-
49-
50-
51-
52-
53-
54-
55-
56-
57-
58-
59-
60-
61-
62-
63-
64-
65-
66-
67-
68-
module Zarb_State(
    input Clk,
    input Rst,
    input [7:0] A,
    input [7:0] B,
    output reg [15:0] F,
    output reg DONE
    ); 
	
parameter Reset=2'b00;
parameter Task=2'b01;
parameter End=2'b10;

reg [15:0] Copy_A;
reg [7:0] Copy_B;
reg [7:0] N;
reg [1:0] State;

	
always @(posedge Clk or negedge Rst)
begin

if(~Rst)
begin
    F=0;
    N=0;
    Copy_A={8'b0,A};
    Copy_B=B;
    DONE=0;
    State=Reset;
end

else
begin

    case(State)
	
	Reset : begin
                State=Task;
                end				

	Task  : begin
                if(Copy_B[0])
                    F=F+Copy_A;
					
                Copy_A=Copy_A<<1;
                Copy_B=Copy_B>>1;
                N=N+1;
				
                if (N==8)
                    State=End;
                else
                    State=Task;		
                end					

	End   : begin
                DONE=1;
                State=End;
                end				
			
    endcase
	
end


end

endmodule

کد وریلاگ این استیت ماشین مشابه بخش قبلی است بنابراین من توضیح خاصی نمیدم و میذارم تماشاگر باشید .

به یک نکته دقت کنید که توی جلسه 19 ، ضرب دو عدد 8 بیتی توی 8 کلاک انجام میشد در واقع توی هر یک کلاک ، عمل ضرب و جمع و افزودن N انجام میشد ، اما توی استیت ماشین اول انجام ضرب بیش از 25 کلاک طول خواهد کشید . چون برای هربار عمل جمع و شیفت باید سه استیت اجرا بشه و هر استیت نیاز به یک کلاک داره .

البته توی استیت ماشین دومی که نوشتیم ، وضعیت بهتره و ضرب دو عدد نهایتا بین 8 تا 9 کلاک انجام میشه . حتی ما میتونستیم ضرب کننده رو بجای سه استیت ، توی یک استیت پیاده سازی کنیم اما ماهیت استراتژی استیت ماشین زیر سوال میره . هدف از استراتژی استیت ماشین این نیست که یک مسئله سریعتر عمل کنه ، بلکه هدف اینه یک مسئله به قسمت های ریز تر شکسته بشه تا از پیچیدگی اون کاسته بشه .

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

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




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