Professional Documents
Culture Documents
Slide 4 Behavioral
Slide 4 Behavioral
Slide 4 Behavioral
فلیپ فالپ حساس به لبه باالرونده فلیپ فالپ حساس به لبه پایین رونده
طراحی مدارات ترتیبی در وریالگ
توصیف رفتاری با استفاده از طراحی ( proceduralساخت یافته)
عبارت کلیدی در این طراحی
یا )سیگنال عامل تغییر always @ (posedge
)سیگنال عامل تغییر always @ (negedge
است.
طراحی مدارات ترتیبی در وریالگ
استفاده از طراحی ( proceduralساخت یافته)
عبارت کلیدی در این طراحی
یا )سیگنال عامل تغییر always @ (posedge
)سیگنال عامل تغییر always @ (negedge
است.
ساختار alwaysدر مورد مدارات ترتیبی
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
قبل از شبیه سازی
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
مقدار دهی اولیه به رجیسترها در وریالگ
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استفاده نمود.
اگر عبارت داخل 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
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به
𝑵
𝟏𝟐 − > 𝑴
در مثال ،11با در نظر گرفتن 25بیت برای متغیر Qحداکثر مقدار مفروض برای
پارامتر Mمقداری در حدود 32میلیون است و لذا محدوده وسیعی از مقادیر را در
بر میگیرد ،ولی بهتر است تعداد بیتهای Qبا توجه به مقدار Mتنظیم شود ،تا
مینیمم حجم از سخت افزار گرفته شود ،یعنی مینیمم گیت ممکن برای پیاده سازی
مدار استفاده گردد .در این مثال ،با توجه به مقدار M=6000000تعداد 23بیت
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بیت
𝟎𝟎𝟎𝟎𝟎𝟎𝟎𝟓
= 𝟎𝟎𝟎𝟐 => M=12500
𝑴𝟐
) (clklfمیباشد.
𝟏
= زمان اسکن سطرها = 𝒇𝒍𝒌𝒍𝒄𝑻
𝒇𝒍𝒌𝒍𝒄𝒇
𝒌𝒍𝒄𝒇
= 𝒇𝒍𝒌𝒍𝒄𝒇
𝑴𝟐
مثال :زمان اسکن سطرها را در مثال 13با توجه به کالک ورودی با فرکانس
12 MHzو پارامتر M=3000داده شده بیابید.
𝟎𝟎𝟎𝟎𝟎𝟎𝟐𝟏 𝒌𝒍𝒄𝒇
= 𝒇𝒍𝒌𝒍𝒄𝒇 = 2000
𝟎𝟎𝟎𝟑∗ 𝟐 𝑴𝟐
مگاهرتز بیابید.
𝟎𝟎𝟎𝟎𝟎𝟎𝟐𝟏
=𝟎𝟓 𝟎𝟎𝟎𝟎𝟐𝟏 = 𝑴 ⇒
𝑴∗ 𝟐
:دو پارامتر مهم در طراحی
مشخص میشود؛ مثال برای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;
مثال :سیستمی را در وریالگ توصیف کنید که در نمایشگر
دهد.
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لحاظ میکنند .به عنوان مثال :
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 مثال
)متغیر( 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
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