Slide 4 Behavioral

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 115

‫مدارات ترتیبی همزمان‬

‫فلیپ فالپ حساس به لبه باالرونده‬ ‫فلیپ فالپ حساس به لبه پایین رونده‬
‫طراحی مدارات ترتیبی در وریالگ‬
‫توصیف رفتاری با استفاده از طراحی ‪( procedural‬ساخت یافته)‬
‫عبارت کلیدی در این طراحی‬
‫یا‬ ‫)سیگنال عامل تغییر ‪always @ (posedge‬‬
‫)سیگنال عامل تغییر ‪always @ (negedge‬‬
‫است‪.‬‬
‫طراحی مدارات ترتیبی در وریالگ‬
‫استفاده از طراحی ‪( procedural‬ساخت یافته)‬
‫عبارت کلیدی در این طراحی‬
‫یا‬ ‫)سیگنال عامل تغییر ‪always @ (posedge‬‬
‫)سیگنال عامل تغییر ‪always @ (negedge‬‬
‫است‪.‬‬
‫ساختار ‪ always‬در مورد مدارات ترتیبی‬

‫)سیگنال عامل تغییر مثل کالک ‪always @ (posedge/negedge‬‬


‫‪begin‬‬
‫مقدار دهی رجیسترها‬
‫‪end‬‬
‫نوع متغیرهایی که با استفاده از این الگو مقدار دهی میشوند باید‬
‫از نوع ‪ reg‬باشد‪.‬‬
‫معموال از )‪ always @ (posedge clk‬استفاده می شود‪.‬‬
‫ بیتی حساس به لبه باال رونده‬8 ‫ طراحی یک رجیستر‬:1 ‫مثال‬

module simplereg(clk,data,Q);
parameter N=8;
input clk;
input [N-1:0] data;
output reg [N-1:0] Q;
always @ (posedge clk)
begin
Q<=data;
end
endmodule
clk ‫ بیتی حساس به لبه پایین رونده‬8 ‫ طراحی یک رجیستر‬:2 ‫مثال‬
module simplereg(clk,data,Q);
parameter N=8;
input clk;
input [N-1:0] data;
output reg [N-1:0] Q;
always @ (negedge clk)
begin
Q<=data;
end
endmodule
‫قبل از شبیه سازی‬

‫بعد از شبیه سازی‬


‫فرآیند شبیه سازی به زبان ساده‪:‬‬

‫مشخص کردن‬ ‫منطق مشخص‬


‫شکل موج‬
‫شکل موج‬ ‫شده در کد‬
‫خروجی ها‬
‫ورودی ها‬ ‫وریالگ‬
‫محاسبه شده در نرم‬
‫افزار در فرآیند شبیه‬
‫سازی‬
‫وارد شده از طرف کاربر در نرم افزار‬
‫ میتوان‬،‫ فقط یک انتساب مقدار باشد‬begin end ‫ اگر عبارت داخل‬: ‫نکته‬
‫ صرف نظر نمود و لذا دو مثال قبل را به فرم زیر نیز می‬end‫ و‬begin‫از‬
:‫توان توصیف نمود‬
‫رجیستر حساس به لبه باالرونده‬ ‫رجیستر حساس به لبه پایین رونده‬
module simplereg(clk,data,Q); module simplereg(clk,data,Q);
parameter N=8; parameter N=8;
input clk; input clk;
input [N-1:0] data;
input [N-1:0] data;
output reg [N-1:0] Q;
output reg [N-1:0] Q;
always @ (posedge clk)
always @ (negedge clk)
Q<=data;
Q<=data;
endmodule
endmodule
‫ طراحی یک شمارنده باالشمار‬:3 ‫مثال‬

module upcnt(clk,Q);
parameter N=4;
input clk;
output reg [N-1:0] Q;
always @ (posedge clk)
Q<=Q+1;
endmodule
‫ طراحی یک شمارنده پایین شمار‬:4 ‫مثال‬

module downcnt(clk,Q);
parameter N=4;
input clk;
output reg [N-1:0] Q;
always @ (posedge clk)
Q<=Q-1;
endmodule
‫مقدار دهی اولیه به رجیسترها در وریالگ‬

‫با استفاده از کلمه کلیدی‬


‫‪initial‬‬
‫صورت می پذیرد‪.‬‬
9 ‫ طراحی یک شمارنده پایین شمار با مقدار اولیه‬:5 ‫مثال‬

module downcnt(clk,Q);
parameter N=4;
input clk;
output reg [N-1:0] Q;
initial Q=9;
always @ (posedge clk)
Q<=Q-1;
endmodule
‫از ساختار ‪ if‬نیز فقط میتوان در بلوک ‪ always‬استفاده نمود‪.‬‬

‫)متغیر بولی( ‪If‬‬


‫‪begin‬‬
‫مجموعه انتسابات مقدار‬
‫‪end‬‬

‫اگر عبارت داخل ‪ begin end‬فقط یک انتساب مقدار باشد‪ ،‬میتوان از‪ begin‬و‪ end‬صرف‬
‫نظر نمود ‪.‬‬
‫متغیر بولی ممکنست از یک مقایسه به دست آید‪.‬‬
count enable ‫ طراحی یک شمارنده باال شمار با ورودی‬:6 ‫مثال‬
module upcntce(clk,Q,ce);
parameter N=4;
input clk, ce;
output reg [N-1:0] Q;
always @ (posedge clk)
begin
if (ce)
Q<=Q+1;
end
endmodule
‫ صفر فعال‬count enable ‫طراحی یک شمارنده باال شمار با ورودی‬

module upcntce(clk,Q,ce);
parameter N=4;
input clk, ce;
output reg [N-1:0] Q;
always @ (posedge clk)
begin
if (!ce)
Q<=Q+1;
end
endmodule
count enable ‫با ورودی‬BCD ‫ طراحی یک شمارنده باال شمار‬:7 ‫مثال‬
module upcntce(clk,Q,ce);
parameter N=4;
input clk, ce;
output reg [N-1:0] Q;
always @ (posedge clk)
begin
if (ce)
begin
if (Q!==9) Q<=Q+1;
if (Q===9) Q<=0;
end
end
endmodule
‫ روش دوم‬:7 ‫مثال‬
module upcntce(clk,Q,ce);
parameter N=4;
input clk, ce;
output reg [N-1:0] Q;
always @ (posedge clk)
begin
if (ce)
begin
if (Q!==9) Q<=Q+1;
else Q<=0;
end
end
endmodule
‫ روش سوم‬:7 ‫مثال‬
module upcntce(clk,Q,ce);
parameter N=4;
input clk, ce;
output reg [N-1:0] Q;
always @ (posedge clk)
begin
if (ce)
begin
if (Q<9) Q<=Q+1;
else Q<=0;
end
end
endmodule
‫ روش چهارم‬:7 ‫مثال‬

module upcntce(clk,Q,ce);
parameter N=4;
input clk, ce;
output reg [N-1:0] Q;
always @ (posedge clk)
begin
if (ce)
begin
Q<=Q+1;
if (Q===9) Q<=0;
end
end
endmodule
‫بررسی اولویت در ارزیابی سطرهای کد‬
module testpriority(clk,Q);
parameter N=4;
input clk;
output reg [N-1:0] Q;
always @ (posedge clk)
begin
Q<=Q+3;
Q<=Q-1;
end
endmodule
Count Enable ‫ و ورودی‬9 ‫ طراحی یک شمارنده پایین شمار با مقدار اولیه‬:8 ‫مثال‬

module downcntce(clk,ce,Q);
parameter N=4;
input clk,ce;
output reg [N-1:0] Q;
initial Q=9;
always @ (posedge clk)
if (ce) Q<=Q-1;
endmodule
count enable ‫با ورودی‬BCD ‫ طراحی یک شمارنده پایین شمار‬:9 ‫مثال‬
module downcnt(clk,ce,Q);
parameter N=4;
input clk,ce;
output reg [N-1:0] Q;
initial Q<=4'b1001;
always @ (posedge clk)
begin
if (ce)
begin
if (Q!==0) Q<=Q-1;
if (Q===0) Q<=4'b1001;
end
end
endmodule
‫ روش دوم‬:9 ‫مثال‬
module downcnt(clk,ce,Q);
parameter N=4;
input clk,ce;
output reg [N-1:0] Q;
initial Q<=4'b1111;
always @ (posedge clk)
begin
if (ce)
begin

if ((Q===0)| (Q>9)) Q<=4'b1001;


else Q<=Q-1;
end
end
endmodule
‫ روش سوم‬:9 ‫مثال‬
module downcnt(clk,ce,Q);
parameter N=4;
input clk,ce;
output reg [N-1:0] Q;
initial Q<=4'b1001;
always @ (posedge clk)
begin
if (ce)
begin
Q<=Q-1;
if (Q===4'b0000) Q<=4'b1001;
end
end
endmodule
module freqconv(clkin,clkout); ‫ طراحی یک مبدل فرکانس‬:10 ‫مثال‬
input clkin;
output reg clkout;
reg [1:0] Q;
initial
begin
clkout=0;
Q=1;
end
always @ (posedge clkin)
begin
Q<=Q+1;
if (Q===3)//2*3 ‫ضریب تبدیل‬
begin
clkout=~clkout;
Q<=1;
end
end
endmodule
module freqconv(clkin,clkout);
input clkin;
output reg clkout;
reg [1:0] Q;
initial
begin
clkout=0;
Q=1;
end
always @ (posedge clkin)
begin
if (Q!==3) Q<=Q+1;
if (Q===3)//2*3 ‫ضریب تبدیل‬
begin
clkout=~clkout;
Q<=1;
end
end
endmodule
‫ طراحی مبدل فرکانس با نسبت تبدیل پارامتری‬:11 ‫مثال‬

module freqconvpar(clkin,clkout);
input clkin; always @ (posedge clkin)
output reg clkout; begin
reg [24:0] Q; if (Q!==M) Q<=Q+1'b1;
parameter M=6000000; if (Q===M)
initial begin
begin clkout=~clkout;
clkout=0; Q<=1;
Q=1; end
end end
endmodule
‫نکته مهم در طراحی مدار مبدل فرکانس این است که تعداد بیت متغیر ‪ Q‬به اندازه کافی‬

‫برای پوشش دهی پارارمتر ‪ M‬بزرگ باشد‪ .‬به این معنی که با فرض ‪ N‬بیت برای ‪ Q‬مقدار‬

‫ماکزیمم ‪ 2𝑁 -1‬می‌باشد‪ .‬این مقدار ماکزیمم باید از ‪ M‬بیشتر باشد تا امکان رسیدن ‪ Q‬به‬

‫مقدار ‪ M‬فراهم شود‪.‬‬

‫𝑵‬
‫𝟏‪𝟐 −‬‬ ‫>‬ ‫𝑴‬
‫در مثال ‪ ،11‬با در نظر گرفتن ‪ 25‬بیت برای متغیر ‪ Q‬حداکثر مقدار مفروض برای‬

‫پارامتر ‪ M‬مقداری در حدود ‪ 32‬میلیون است و لذا محدوده وسیعی از مقادیر را در‬

‫بر میگیرد‪ ،‬ولی بهتر است تعداد بیتهای ‪ Q‬با توجه به مقدار ‪ M‬تنظیم شود‪ ،‬تا‬

‫مینیمم حجم از سخت افزار گرفته شود‪ ،‬یعنی مینیمم گیت ممکن برای پیاده سازی‬

‫مدار استفاده گردد‪ .‬در این مثال‪ ،‬با توجه به مقدار ‪ M=6000000‬تعداد ‪ 23‬بیت‬

‫برای ‪ Q‬کفایت میکند‪.‬‬


‫مثال ‪ :11-1‬سیستمی را در وریالگ توصیف کنید که بتواند فرکانس یک مگاهرتز را به یک‬

‫هرتز تبدیل نماید‪.‬‬

‫𝑧𝐻 ‪𝑓𝑐𝑙𝑘𝑖𝑛 = 1000000‬‬ ‫⇒ 𝑧𝐻 ‪𝑓𝑐𝑙𝑘𝑜𝑢𝑡 = 1‬‬

‫‪1000000‬‬
‫=‪1‬‬ ‫>=‬ ‫‪M=500000‬‬
‫𝑀‪2‬‬
module freqconvpar(clkin,clkout);
input clkin; always @ (posedge clkin)
output reg clkout; begin
reg [24:0] Q; if (Q!==M) Q<=Q+1'b1;
parameter M=500000; if (Q===M)
initial begin
begin clkout=~clkout;
clkout=0; Q<=1;
Q=1; end
end end
endmodule
‫سیستم توصیف شده با کد قبل‪ ،‬بهینه نیست‪ ،‬زیرا برای متغیر ‪ 25 Q‬بیت در نظر‬

‫گرفته شده است‪ ،‬در حالی که برای پوشش دادن مقدار ‪ 500000‬تعداد ‪ 19‬بیت‬

‫کفایت مینماید‪ .‬لذا با اصالح زیر‪ ،‬میتوان به کد بهینه دست یافت‪:‬‬

‫;‪reg [18:0] Q‬‬


module freqconvpar(clkin,clkout);
input clkin; always @ (posedge clkin)
output reg clkout; begin
reg [18:0] Q; if (Q!==M) Q<=Q+1'b1;
parameter M=500000; if (Q===M)
initial begin
begin clkout=~clkout;
clkout=0; Q<=1;
Q=1; end
end end
endmodule
‫مثال ‪ :11-2‬سیستمی را در وریالگ توصیف کنید که بتواند فرکانس ‪ 50‬مگاهرتز را به دو‬
‫کیلوهرتز تبدیل نماید‪.‬‬

‫𝒛𝑯 𝟎𝟎𝟎𝟎𝟎𝟎𝟎𝟓 = 𝒏𝒊𝒌𝒍𝒄𝒇‬ ‫⇒ 𝒛𝑯 𝟎𝟎𝟎𝟐 = 𝒕𝒖𝒐𝒌𝒍𝒄𝒇‬

‫𝟎𝟎𝟎𝟎𝟎𝟎𝟎𝟓‬
‫= 𝟎𝟎𝟎𝟐‬ ‫‪=> M=12500‬‬
‫𝑴𝟐‬

‫برای پوشش دهی ‪ 12500‬تعداد ‪ 14‬بیت کافیست‪.‬‬


module freqconvpar(clkin,clkout);
input clkin; always @ (posedge clkin)
output reg clkout; begin
reg [13:0] Q; if (Q!==M) Q<=Q+1'b1;
parameter M=12500; if (Q===M)
initial begin
begin clkout=~clkout;
clkout=0; Q<=1;
Q=1; end
end end
endmodule
‫ دو رقمی‬BCD ‫ شمارنده‬:12 ‫مثال‬

module upcntbcd2digit(clk,Q1,Q2,ce); begin


parameter N=4; if (ce)
input clk, ce; begin
if (Q1!==9) Q1<=Q1+1;
output reg [N-1:0] Q1,Q2; else
initial begin
begin Q1<=0;
Q1=0; if (Q2!==9) Q2<=Q2+1;
Q2=0; else Q2<=0;
end end
always @ (posedge clk) end
end
endmodule
‫ دو رقمی‬BCD ‫ شمارنده‬:12 ‫مثال‬

module upcntbcd2digit(clk,Q1,Q2,ce); begin


parameter N=4; if (ce)
input clk, ce; begin
if (Q1!==9) Q1<=Q1+1;
output reg [N-1:0] Q1,Q2; else
initial begin
begin Q1<=0;
Q1=0; if (Q2!==9) Q2<=Q2+1;
Q2=0; else Q2<=0;
end end
always @ (posedge clk) end
end
endmodule
‫تلویزیون ‪LED‬‬
‫مثال کاربردی نمایشگر ‪ LED‬ماتریسی‬
‫نمایشگر ‪ LED‬ماتریسی ‪8*8‬‬
KWN-30881CVB 1.2″ 8X8 Matrix LED Display
12 MHz ‫ با فرض کالک ورودی با فرکانس‬8*8 ‫ ماتریسی‬LED ‫ مدار درایور نمایشگر‬:13 ‫مثال‬
module dotmtx(clk,column,row);
input clk;
output [7:0] column,row;
wire [7:0] column0,column1,column2,column3,column4,column5,column6,column7;
wire [2:0] Q;
wire clklf;
assign column0=8'b0111_1110;
assign column1=8'b0011_1110;
assign column2=8'b0101_1110;
assign column3=8'b0110_1110;
assign column4=8'b0111_0110;
assign column5=8'b0111_1010;
assign column6=8'b0111_1100;
assign column7=8'b0111_1110;
freqconvpar block0(clk,clklf);
//defparam block0.M=300000;
defparam block0.M=3000;
upcnt block1(clklf,Q);
defparam block1.N=3;
dec38 block2(Q,row);
mux81M
block3(column0,column1,column2,column3,column4,column5,
column6,column7,Q,column);
defparam block3.M=8;
endmodule
column
‫دو پارامتر مهم در طراحی‪:‬‬

‫‪ -1‬زمان اسکن سطرها‪ :‬زمانی است که هر سطر فعال میباشد‪:‬‬


‫همانطور که در شکل مشخص است‪ ،‬زمان اسکن سطرها برابر با دوره تناوب کالک فرکانس پایین‬

‫)‪ (clklf‬میباشد‪.‬‬

‫𝟏‬
‫= زمان اسکن سطرها‬ ‫= 𝒇𝒍𝒌𝒍𝒄𝑻‬
‫𝒇𝒍𝒌𝒍𝒄𝒇‬

‫طبق رابطه مقسم فرکانس‪:‬‬

‫𝒌𝒍𝒄𝒇‬
‫= 𝒇𝒍𝒌𝒍𝒄𝒇‬
‫𝑴𝟐‬
‫مثال‪ :‬زمان اسکن سطرها را در مثال ‪ 13‬با توجه به کالک ورودی با فرکانس‬
‫‪ 12 MHz‬و پارامتر ‪ M=3000‬داده شده بیابید‪.‬‬
‫𝟎𝟎𝟎𝟎𝟎𝟎𝟐𝟏 𝒌𝒍𝒄𝒇‬
‫= 𝒇𝒍𝒌𝒍𝒄𝒇‬ ‫‪= 2000‬‬
‫𝟎𝟎𝟎𝟑∗ 𝟐 𝑴𝟐‬

‫𝟏‬ ‫𝟏‬ ‫𝒔𝒎‬


‫= زمان اسکن سطرها‬ ‫= 𝒇𝒍𝒌𝒍𝒄𝑻‬ ‫=‬ ‫𝟓 ‪= 𝟎.‬‬
‫𝒇𝒍𝒌𝒍𝒄𝒇‬ ‫𝟎𝟎𝟎𝟐‬
‫مثال‪ :‬زمان اسکن سطرها را در مثال ‪ 13‬با توجه به کالک ورودی با فرکانس‬
‫‪ 12 MHz‬در صورت تغییر پارامتر به ‪ M=300000‬داده شده بیابید‪.‬‬
‫𝟎𝟎𝟎𝟎𝟎𝟎𝟐𝟏 𝒌𝒍𝒄𝒇‬
‫= 𝒇𝒍𝒌𝒍𝒄𝒇‬ ‫‪= 20‬‬
‫𝟎𝟎𝟎𝟎𝟎𝟑∗ 𝟐 𝑴𝟐‬

‫𝟏‬ ‫𝟏‬ ‫𝒔𝒎‬


‫= زمان اسکن سطرها‬ ‫= 𝒇𝒍𝒌𝒍𝒄𝑻‬ ‫=‬ ‫𝟎𝟓 =‬
‫𝒇𝒍𝒌𝒍𝒄𝒇‬ ‫𝟎𝟐‬
‫مثال‪ :‬پارامتر ‪ M‬را برای اسکن سطرها در زمانهای ‪ 20‬میلی ثانیه با فرض فرکانس کالک قبلی ‪12‬‬

‫مگاهرتز بیابید‪.‬‬

‫‪𝑻𝒄𝒍𝒌𝒍𝒇 =𝟎. 𝟎𝟐 ⇒ 𝒇�𝒄𝒍𝒌𝒍𝒇 = 50‬‬

‫𝟎𝟎𝟎𝟎𝟎𝟎𝟐𝟏‬
‫=𝟎𝟓‬ ‫𝟎𝟎𝟎𝟎𝟐𝟏 = 𝑴 ⇒‬
‫𝑴∗ 𝟐‬
:‫دو پارامتر مهم در طراحی‬

:‫ شکل نمایش داده شده‬-2

‫ مشخص میشود؛ مثال برای‬column7 ‫ تا‬column0 ‫با توجه به وضعیت صفرها در متغیرهای‬

: M ‫نمایش حرف‬
assign column0=8'b0111_1110;
assign column1=8'b0011_1100;
assign column2=8'b0101_1010;
assign column3=8'b0110_0110;
assign column4=8'b0111_1110;
assign column5=8'b0111_1110;
assign column6=8'b0111_1110;
assign column7=8'b0111_1110;
‫مثال ‪ :‬سیستمی را در وریالگ توصیف کنید که در نمایشگر‬

‫داده شده در مثال ‪ ،13‬حرف ‪ F‬را با زمان اسکن سطرهای ‪20‬‬

‫میلی ثانیه با فرض کالک ورودی با فرکانس ‪ 12 MHz‬نمایش‬

‫دهد‪.‬‬
module dotmtx(clk,column,row);
input clk;
output [7:0] column,row;
wire [7:0] column0,column1,column2,column3,column4,column5,column6,column7;
wire [2:0] Q;
wire clklf;
assign column0=8'b0000_0000;
assign column1=8'b0111_1111;
assign column2=8'b0111_1111;
assign column3=8'b0000_0000;
assign column4=8'b0111_1111;
assign column5=8'b0111_1111;
assign column6=8'b0111_1111;
assign column7=8'b0111_1111;
freqconvpar block0(clk,clklf);
defparam block0.M=120000;
upcnt block1(clklf,Q);
defparam block1.N=3;
dec38 block2(Q,row);
mux81M
block3(column0,column1,column2,column3,column4,column5,
column6,column7,Q,column);
defparam block3.M=8;
endmodule
‫مثال ‪ -14‬پالس شمار یا صلوات شمار دو رقمی‬

‫رونده‬
‫باالرونده‬
‫لبهباال‬
‫یکلبه‬
‫کلید‪،‬یک‬
‫فشردنکلید‪،‬‬
‫بارفشردن‬
‫هربار‬
‫باباهر‬
‫میشود‪.‬‬ ‫‪key‬ایجاد‬
‫ایجاد میشود‪.‬‬ ‫دردر ‪key‬‬
module salawatshomar(key,ce, segments1,segments2);
input key,ce;
output [6:0] segments1,segments2;
wire [3:0] Q1,Q2;
upcntbcd2digit block1(key,Q1,Q2,ce);
sevsegcc block2(Q1,segments1);
sevsegcc block3(Q2,segments2);
endmodule
‫پایین شمار‬-‫ شمارنده باال‬:15 ‫مثال‬
module updowncounter(clk,ce,up,Q);
parameter N=4;
input clk,ce,up;
output reg [N-1:0] Q;
always @ (posedge clk)
begin
if (ce)
begin
if (up==1) Q<=Q+1;// if (up)
else Q<=Q-1;
end
end
endmodule
load ‫ بیتی با ورودی‬8 ‫ طراحی یک رجیستر‬:16 ‫مثال‬
module regload(clk,load,data,Q);
parameter N=8;
input load,clk;
input [N-1:0] data;
output reg [N-1:0] Q;
always @ (posedge clk)
begin
if (load)
Q<=data;
end
endmodule
‫ورودی ‪ clear‬آسنکرون (غیر همزمان)‬
‫ورودی ‪ clear‬آسنکرون مستقل از کالک روی خروجی تاثیر میگذارد‪ ،‬یعنی به‬
‫محض فعال شدن آن‪ ،‬خروجی صفر می شود‪ .‬لذا اثر آن مشابه کالک در ‪always‬‬
‫اعمال میگردد‪ .‬اعمال دو شرط را با ‪ or‬لحاظ میکنند‪ .‬به عنوان مثال ‪:‬‬

‫)‪always @ (posedge clk or posedge clearasync‬‬


‫ آسنکرون‬clear ‫ و‬load ‫ بیتی با ورودی‬8 ‫ طراحی یک رجیستر‬:17 ‫مثال‬

module regloadclearasync(clk,load,clearasync,data,Q);
parameter N=8;
input clk,load,clearasync;
input [N-1:0] data;
output reg [N-1:0] Q;
always @ (posedge clk or posedge clearasync)
begin
if (clearasync) Q<=0;
else if (load) Q<=data;
end
endmodule
‫ آسنکرون صفر فعال‬clear ‫ و‬load ‫ بیتی با ورودی‬8 ‫ طراحی یک رجیستر‬:18 ‫مثال‬

module regloadresetasync(clk,load,clearasync,data,Q);
parameter N=8;
input clk,load,clearasync;
input [N-1:0] data;
output reg [N-1:0] Q;
always @ (posedge clk or negedge clearasync)
begin
if (!clearasync) Q<=0;
else if (load) Q<=data;
end
endmodule
‫ آسنکرون‬clear ‫ طراحی یک شمارنده باالشمار با ورودی‬:19 ‫مثال‬

module upcntceclear(clk,Q,ce,clear);
parameter N=4;
input clk, ce,clear;
output reg [N-1:0] Q;
always @ (posedge clk or posedge clear)
begin
if (clear) Q<=0;
else if (ce) Q<=Q+1;
end
endmodule
‫ آسنکرون‬clear ‫ دو رقمی با ورودی‬BCD ‫ شمارنده‬:20 ‫مثال‬

module upcntbcd2digitclearasync(clk,Q1,Q2,ce,clear); else


parameter N=4; begin
input clk, ce,clear; if (ce)
output reg [N-1:0] Q1,Q2; begin
initial if (Q1!==9) Q1<=Q1+1'b1;
begin else
Q1=0; begin
Q2=0; Q1<=0;
end if (Q2!==9) Q2<=Q2+1'b1;
always @ (posedge clk or posedge clear) else Q2<=0;
begin end
if ( clear) end
begin end
Q2<=0; end
Q1<=0; endmodule
end
‫مثال ‪ -21‬صلوات شمار دو رقمی با ورودی ‪reset‬‬
module salawatshomar(key,ce,reset, segments1,segments2);
input key,ce,reset;
output [6:0] segments1,segments2;
wire [3:0] Q1,Q2;
upcntbcd2digitclearasync block1(key,Q1,Q2,ce,reset);
sevsegcc block2(Q1,segments1);
sevsegcc block3(Q2,segments2);
endmodule
module shiftreg(clk,x,q0,q1,q2,q3,q4,q5,q6,q7);
input clk,x;
output reg q0,q1,q2,q3,q4,q5,q6,q7; ‫ شیفت رجیستر‬-22 ‫مثال‬
always @ (posedge clk)
begin ‫هشت بیتی‬
q0<=x;
q1<=q0;
q2<=q1;
q3<=q2;
‫شیفت به چپ‬
q4<=q3;
q5<=q4;
q6<=q5;
q7<=q6;
end
endmodule
module shiftreg(clk,x,q0,q1,q2,q3,q4,q5,q6,q7);
input clk,x;
output reg q0,q1,q2,q3,q4,q5,q6,q7;
‫ شیفت به راست‬-22 ‫مثال‬
always @ (posedge clk)
begin
q7<=x;
q6<=q7;
q5<=q6;
q4<=q5;
q3<=q4;
q2<=q3;
q1<=q2;
q0<=q1;
end
endmodule
module bcddowncntload(clk,load,q1,q2);
parameter [3:0] N1=4,N2=1;
‫ شمارنده پایین‬-24 ‫مثال‬
input clk,load;
output reg [3:0] q1,q2; ‫ دو رقمی‬BCD ‫شمار‬
always @ (posedge clk)
begin
if (load)
begin
q1<=N1;
q2<=N2;
end
else
begin
if (q1!==0) q1<=q1-1;
if (q1===0)
begin
q1<=4'b1001;
if (q2!==0) q2<=q2-1;
if (q2===0)
begin
// if (q1===0)
// begin
q1<=N1;
q2<=N2;
// end
end
end
end
end
endmodule
‫ساختار ‪ case‬در وریالگ‬
‫در طراحی‪ procedural‬در ساختار ‪ always‬میتوان از ساختار ‪ case‬به منظور طراحی یک‬
‫مدار ترتیبی بر مبنای یک دیاگرام حالت استفاده نمود‪.‬‬

‫)متغیر( ‪case‬‬
‫مجموعه انتسابات‪ :1‬مقدار ‪1‬‬ ‫در مجموعه انتسابات اگر یک انتساب مقدار داشته‬
‫مجموعه انتسابات‪ :2‬مقدار ‪2‬‬ ‫باشیم نیازی به ‪ begin end‬نیست ولی اگر‬
‫مجموعه انتسابات‪ :3‬مقدار ‪3‬‬
‫بیش از یک انتساب مقدار داشته باشیم مجموعه‬
‫‪.‬‬
‫انتسابات باید در ‪ begin end‬قرار بگیرند‪.‬‬
‫‪.‬‬
‫سایر انتسابات ‪default:‬‬
‫‪endcase‬‬
000

001 010

011 100

101
110

111
module statemachine(clk,Q);
input clk;
output reg [2:0] Q; ‫ پیاده سازی جدول حالت قبل‬:25 ‫مثال‬
initial Q=6;
always @ (posedge clk)
begin
case (Q)
3'b000: Q<=3'b111;
3'b001: Q<=3'b000;
3'b010: Q<=3'b000;
3'b011: Q<=3'b001;
3'b100: Q<= 3'b010;
3'b101: Q<=3'b011;
3'b110: Q<=3'b100;
3'b111: Q<=3'b101;
endcase
end
endmodule
000

001 010

011 100

101
110

111
module statemachine2(clk,odd,Q);
input clk,odd; ‫ پیاده سازی جدول‬:26 ‫مثال‬
output reg [2:0] Q;
initial Q=0; ‫حالت قبل‬
always @ (posedge clk)
begin
case (Q)
3'b000:
begin
if (odd) Q<=3'b111;
else Q<=3'b110;
end
3'b001: Q<=3'b000;
3'b010: Q<=3'b000;
3'b011: Q<=3'b001;
3'b100: Q<= 3'b010;
3'b101: Q<=3'b011;
3'b110: Q<=3'b100;
3'b111: Q<=3'b101;
endcase
end
endmodule
module statemachine2(clk,odd,S,Q);
input clk,odd,S; 3'b010: Q<=3'b000;
output reg [2:0] Q; 3'b011: Q<=3'b001;
initial Q=0; 3'b100: Q<= 3'b010;
always @ (posedge clk) 3'b101: Q<=3'b011;
begin 3'b110: begin
case (Q) if (S) Q<=3'b100;
3'b000: end
begin 3'b111:begin
if (odd) Q<=3'b111; if (S) Q<=3'b101;
else Q<=3'b110; end
end endcase
3'b001: Q<=3'b000; end
endmodule
‫طراحی مدارهای ترکیبی با استفاده از ساختار ‪always‬‬

‫با استفاده از‬


‫)*( @ ‪always‬‬
‫می توان یک یا چند تابع منطقی را با استفاده از مجموعه‬
‫انتسابات مدارهای ترتیبی توصیف کرد‪ .‬به عنوان مثال در‬
‫این ساختار این مجموعه توابع را میتوان با توجه به‬
‫جدول صحت و با استفاده از ساختار ‪ case‬بیان نمود‪.‬‬
module behavdecoder(x,d); 8 ‫ به‬3 ‫دیکدر‬: 29 ‫مثال‬
input [2:0] x;
output reg [7:0] d;
always @ (*)
begin
case (x)
3'b000: d=8'b00000001;
3'b001: d=8'b00000010;
3'b010: d=8'b00000100;
3'b011: d=8'b00001000;
3'b100: d=8'b00010000;
3'b101: d=8'b00100000;
3'b110: d=8'b01000000;
3'b111: d=8'b10000000;
endcase
end
endmodule
module behavdecoderactivelow(x,d); ‫ با‬8 ‫ به‬3 ‫دیکدر‬:30 ‫مثال‬
input [2:0] x;
output reg [7:0] d; ‫خروجی های صفر فعال‬
always @ (*)
begin
case (x)
3'b000: d=8'b11111110;
3'b001: d=8'b11111101;
3'b010: d=8'b11111011;
3'b011: d=8'b11110111;
3'b100: d=8'b11101111;
3'b101: d=8'b11011111;
3'b110: d=8'b10111111;
3'b111: d=8'b01111111;
endcase
end
endmodule
module behavbcdsevsegcc(data,segments);
input [3:0] data;
output reg [6:0] segments;
‫ به هفت‬BCD ‫ مبدل‬:31 ‫مثال‬
always @ (*)
begin ‫تکه ای کاتد مشترک‬
case (data)
0:segments=7'b0111111;
1:segments=7'b0000110;
2:segments=7'b1011011;
3:segments=7'b1001111;
4:segments=7'b1100110;
5:segments=7'b1101101;
6:segments=7'b1111101;
7:segments=7'b0000111;
8:segments=7'b1111111;
9:segments=7'b1101111;

default:segments=7'b0000000;
endcase
end
endmodule
module behavbcdsevsegca(data,segments);
input [3:0] data;
output reg [6:0] segments;
‫ به هفت‬BCD ‫ مبدل‬:32 ‫مثال‬
always @ (*)
begin ‫تکه ای آند مشترک‬
case (data)
0:segments=7'b1000000;
1:segments=7'b1111001;
2:segments=7'b0100100;
3:segments=7'b0110000;
4:segments=7'b0011001;
5:segments=7'b0010010;
6:segments=7'b0000010;
7:segments=7'b1111000;
8:segments=7'b0000000;
9:segments=7'b0010000;
default:segments=7'b1111111;
endcase
end
endmodule
module behavbcdsevsegca(data,segments);
input [3:0] data;
output reg [6:0] segments; ‫ اصالح طراحی مبدل‬:33 ‫مثال‬
always @ (*)
begin
case (data)
‫ به هفت تکه ای آند‬BCD
0:segments=7'b1000000;
1:segments=7'b1111001; ‫ به نحوی که در‬،‫مشترک‬
2:segments=7'b0100100;
3:segments=7'b0110000;
4:segments=7'b0011001; ‫صورت عدد ورودی خارج از‬
5:segments=7'b0010010;
6:segments=7'b0000010;
7:segments=7'b1111000; ‫ را نمایش‬E ‫ باشد‬9 ‫ تا‬0 ‫بازه‬
8:segments=7'b0000000;
9:segments=7'b0010000; .‫دهد‬
default:segments=7'b0000110;
endcase
end
endmodule
‫ با‬1‫ به‬2 ‫ مالتی پلکسر‬:34 ‫مثال‬
module behavmux21m(x0,x1,sel,f);
parameter N=8; ‫ بیتی و روش‬8 ‫ورودی های‬
input [N-1:0] x0,x1;
input sel; procedural ‫طراحی‬
output reg [N-1:0] f;
always @(*)
begin
if (sel==0) f=x0;
if (sel==1) f=x1;
end
endmodule
module behavmux41m(x0,x1,x2,x3,sel,f);
parameter N=8; ‫ با‬1‫ به‬4 ‫ مالتی پلکسر‬:35 ‫مثال‬
input [N-1:0] x0,x1,x2,x3;
input [1:0] sel; ‫ بیتی و روش‬8 ‫ورودی های‬
output reg [N-1:0] f;
always @(*)
procedural ‫طراحی‬
begin
case (sel)
0:f=x0;
1:f=x1;
2:f=x2;
3:f=x3;
endcase
end
endmodule

You might also like