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

THIẾT KẾ VI MẠCH SỐ VỚI HDL

Chương 4:
Thiết kế mạch tổ hợp với
Verilog HDL

Khoa Công Nghệ Điện Tử Bộ môn Điện Tử Máy Tính


THIẾT KẾ VI MẠCH SỐ VỚI HDL
Nội dung:
Mô tả các mạch tổ hợp sau dùng Verilog HDL
• Mạch cộng (HA, FA)
• Mạch chọn kênh (MUX)
• Mạch phân kênh (DEMUX)
• Mạch giải mã (DECODER)
• Mạch mã hóa (ENCODER)
• Mạch giải mã led bảy đoạn
• Mạch so sánh
• Mạch nhân
• ALU
• Một số IC thông dụng
Khoa Công Nghệ Điện Tử Bộ môn Điện Tử Máy Tính
THIẾT KẾ VI MẠCH SỐ VỚI HDL

Các mô hình Verilog thông dụng:


Mô hình cấu trúc

Mô hình luồng dữ liệu

Mô hình hành vi

Khoa Công Nghệ Điện Tử Bộ môn Điện Tử Máy Tính


I. Mô hình cấu trúc (Structural model)

1. Đặc điểm chung:


• Mô hình cấu trúc mô tả các hệ thống dưới dạng
các cổng logic hay các khối linh kiện được kết
nối lại với nhau để thực hiện được những mạch
số mong muốn.
• Mô hình cấu trúc được mô tả một cách trực quan
thiết kế số vì mạch logic sau khi tổng hợp sẽ
giống với mạch số thông thường
• Mô hình cấu trúc thường áp dụng cho những
module nhỏ, không cần tối ưu về timing
Khoa Công Nghệ Điện Tử Bộ môn Điện Tử Máy Tính
I. Mô hình cấu trúc (Structural model)
2. Caùc hàm logic ñöôïc söû duïng trong Verilog
a. Hàm not:

cách gọi haøm: not (out,in)

Ví dụ: Mô tả cổng NOT


not (out,in) ;
hoặc not U(out,in); //U là tên cổng not
6
I. Mô hình cấu trúc (Structural model)
2. Caùc hàm logic ñöôïc söû duïng trong Verilog
b. Hàm Buf:

cách gọi haøm: buf (out,in)

Ví dụ: Mô tả cổng buf


buf (out,in)
hoặc buf U(out,in) //U là tên cổng buf

7
I. Mô hình cấu trúc (Structural model)

2. Caùc hàm logic ñöôïc söû duïng trong Verilog


c. Hàm and, nand, or, nor, xor, và xnor

Tên hàm: and, nand, or, nor, xor, xnor


I. Mô hình cấu trúc (Structural model)

Cách gọi hàm: Mô tả các cổng logic có n input, 1 output

Tên_hàm (output, input1, input2,…inputn)

Ví dụ: Mô tả cổng NAND ba ngõ vào


I. Mô hình cấu trúc (Structural model)

Ví dụ: viết chương trình verilog mô tả mạch logic sau


dùng mô hình cấu trúc
module VD (T, A,B,C);
input A,B,C;
output T ;
wire x,y;
nand (x,A,B);
nor (y,A,B);
and (T,x,y,C);
endmodule
I. Mô hình cấu trúc (Structural model)

3. Các bước mô tả mạch tổ hợp dùng mô hình cấu


trúc

 Xác định số ngõ vào/ngõ ra


 Lập bảng trạng thái
 Viết biểu thức ngõ ra
 Vẽ sơ đồ mạch logic
 Sử dụng các hàm logic có sẵn trong verilog
hoặc modul con để mô tả mạch tổ hợp
Ví dụ: viết chương trình verilog mô tả MUX2-1 dùng mô
hình cấu trúc
Biểu thức ngõ ra
Y  S D0  SD1

Sơ đồ mạch logic
Code Verilog theo mô hình cấu trúc

module BT2 (S, D0, D1, y);


input S, D0, D1;
output y;
wire a,b,c;
not (a,S);
and U1(b,a,D0);
and U2(c,S,D1);
or (y,c,b);
endmodule
Kết quả mô phỏng
Ví dụ : viết chương trình verilog mô tả mạch cộng HA dùng mô
hình cấu trúc
a. Thiết kế số HA có 2 input, 2 output
b. Viết code verilog
Bài giải:

module HA (a, b, s,c);


input a,b;
output s, c;
and (c, a, b);
xor (s, a, b);
endmodule
Bài tập 1: viết chương trình verilog mô tả mạch tổ hợp sau
dùng mô hình cấu trúc

a. Lập bảng trạng thái


b. Viết code Verilog theo mô hình cấu trúc
c. Mô phỏng và kiểm tra kết quả
Gợi ý: viết biểu thức ngõ ra  lập bảng trạng thái
I. Mô hình cấu trúc (Structural model)

Bài tập 2: viết chương trình verilog mô tả decoder 2_4


ngõ ra tích cực thấp, chân cho phép tích cực thấp.
a. Thiết kế số
b. Viết code theo mô hình cấu trúc
c. Mô phỏng và kiểm tra kết quả
I. Mô hình cấu trúc (Structural model)

Bài tập 3: viết chương trình verilog mô tả demux1-4, chân


cho phép tích cực cao
a. Thiết kế số
b. Viết code theo mô hình cấu trúc
c. Mô phỏng và kiểm tra kết quả
II. Moâ hình luoàng döõ lieäu (DataflowModel)

1. Đặc điểm chung:

•Dataflow Model mô tả luồng dữ liệu bên trong hệ


thống số giống như luồng dữ liệu giữa các thanh ghi

•Dataflow Model thường dùng để mô tả mạch tổ hợp


thông qua các phép gán liên tục và biểu thức logic

•Dataflow Model thường dùng để mô tả các mạch số


vừa và nhỏ

22
II. Moâ hình luoàng döõ lieäu (DataflowModel)
2. Pheùp gaùn lieân tuïc
• Pheùp gaùn lieân tuïc laø pheùp gaùn seõ ñöôïc thöïc thi baát cöù
khi naøo giaù trò cuûa bieåu thöùc beân phaûi thay ñoåi. Bieåu
thöùc beân traùi phaûi coù döõ lieãu kieåu net.
• Cuù phaùp:
assign bieán_wire = bieåu thöùc;
ví duï:
module and_gate(a,b,y);
input a,b;
output y;
assign y = a & b;
endmodule
Caùc toaùn töû ñöôïc söû duïng trong dataflow module
Mức độ ưu tiên của các toán tử
II. Moâ hình luoàng döõ lieäu (DataflowModel)

3. Các bước mô tả mạch tổ hợp dùng mô hình


luồng dữ liệu

 Xác định số ngõ vào/ ngõ ra


 Lập bảng trạng thái
 Viết biểu thức ngõ ra
 Sử dụng phép gán assign hoặc modul con để
mô tả mạch tổ hợp
II. Moâ hình luoàng döõ lieäu (DataflowModel)
Ví duï: viết chương trình verilog mô t m ch so sánh 1
bit
II. Moâ hình luoàng döõ lieäu (DataflowModel)
Ví duï: viết chương trình verilog mô t m ch so sánh 1
bit
module compare1bit (o1,o2,o3,a,b);
input a,b;
output o1, o2, o3;

assign o1 = ~a & b;
assign o2 = a ~^ b;
assign o3 = a & ~b;

endmodule
II. Moâ hình luoàng döõ lieäu (DataflowModel)
viết chương trình verilog

module machtohop (out, a, b, sel);


input a, b, sel;
output out;
assign out = (sel & a) | (~sel & b);
endmodule
Ví dụ: viết chương trình verilog mô tả mạch tổ hợp sau
dùng mô hình luồng dữ liệu và cấu trúc
Cách 1: mô hình cấu trúc

module vd2 (x0,x1,x2,f);


input x1,x2,x0;
output f;
wire n1,n2,n3,n4,n5;
not u1(n1,x1);
not u2(n2,x0);
and u3(n3,x2,n1,x0);
and u4(n4,x2,x1,n2);
and u5(n5,x2,x1,x0);
f = x2x1’x0+x2x1x0’+x2x1x0
or u6(f,n3,n4,n5);
Cách 2: mô hình luồng dữ liệu endmodule

module vidu_df (x2,x1,x0,f);


input x1,x2,x0;
output f;
assign f = (x2&(~x1)&x0)|(x2&(x1)&(~x0))|(x2&x1&x0);
endmodule
II. Moâ hình luoàng döõ lieäu (DataflowModel)
Ví dụ: viết chương trình verilog mô tả mạch cộng 4 bit
II. Moâ hình luoàng döõ lieäu (DataflowModel)

Ví dụ:
Viết chương trình verilog mô tả decoder 2-4 ngõ ra tích cực
thấp, chân cho phép tích cực thấp dùng mô hình luồng dữ
liệu

a. Thiết kế số
b. Viết code verilog
c. Mô phỏng để kiểm tra kết quả
II. Moâ hình luoàng döõ lieäu (DataflowModel)

// ĐÁP ÁN
// decoder 2-4 ngõ ra tích cực thấp, chân cho phép tích cực thấp
module decoder_E_df (e, x1, x0, y0, y1, y2, y3);
input e, x1, x0;
output y0, y1, y2, y3;
assign y0 = e | x1 | x0;
assign y1 = e | x1 | ~x0;
assign y2 = e | ~x1 | x0;
assign y3 = e | ~x1 | ~x0;
endmodule
II. Moâ hình luoàng döõ lieäu (DataflowModel)

Bài tập 4: viết chương trình verilog mô tả mạch tổ hợp 3


in/2 out, out1 sẽ bằng 1 nếu phát hiện ngõ vào là số nhị
phân 3 và 5. ngõ ra out2 sẽ bằng 1 nếu ngõ vào là số khác
0 và chia hết cho 3
a. Thiết kế số
b. Viết code theo mô hình cấu trúc
c. Mô phỏng và kiểm tra kết quả
II. Moâ hình luoàng döõ lieäu (DataflowModel)

Bài tập 5:
Viết code verilog mô tả mạch chuyển mã nhị phân 3 bit
sang mã quá 3, sử dụng mô hình luồng dữ liệu
II. Moâ hình luoàng döõ lieäu (DataflowModel)
Bài tập 6:
viết code Verilog mô tả IC 74LS138 dùng mô hình luồng dữ liệu
II. Moâ hình luoàng döõ lieäu (DataflowModel)
Bài tập 7:
viết code Verilog mô tả IC 74LS153 dùng mô hình luồng dữ liệu
III. Mô hình hành vi (Behavioral model)

1. Đặc điểm chung:

Mô hình hành vi mô tả hệ thống theo cách mà nó


hành xử thay vì kết nối các linh kiện ở mức thấp lại
với nhau
Mô hình hành vi mô tả mối quan hệ giữa các tín
hiệu ngõ ra với các tín hiệu ngõ vào mà không cần
quan tâm đến cấu trúc phần cứng bên trong nó
Mức trừu tượng cao hơn và thường để mô tả các
mạch số lớn
III. Mô hình hành vi (Behavioral model)

2. Các bước mô tả mạch tổ hợp dùng mô hình hành vi


 Xác định số ngõ vào/ ngõ ra
 Nắm rõ nguyên lý hoạt động hoặc bảng trạng thái của
mạch tổ hợp
 Sử dụng cấu trúc always, if, case, … để mô tả hoạt
động của mạch tổ hợp
 Trong một modul có thể dùng một hoặc nhiều khối
always

Lưu ý khi dùng always:


- Các biến nhạy thường là ngõ vào của mạch tổ hợp
- Các biến phải khai báo dạng reg
III. Mô hình hành vi (Behavioral model)
Ví dụ:
Viết chương trình verilog moâ taû decoder 3 to 8, ngoõ ra
tích cöïc th p, chaân cho pheùp (e) tích cöïc thaáp duøng mô
hình hành vi

- vẽ sơ đồ chân in/out
- Lập trạng thái
- Viết code
- Mô phỏng và ktra kết quả
module decoder (A,E,Y);
input [2:0]A;
input E;
output [7:0]Y;
reg [7:0]Y;
always @ (A,E) begin
if (E == 1'b0)
begin
case (A)
3'b000: Y = 8'b11111110;
3'b001: Y = 8'b11111101;
3'b010: Y = 8'b11111011;
3'b011: Y = 8'b11110111;
3'b100: Y = 8'b11101111;
3'b101: Y = 8'b11011111;
3'b110: Y = 8'b10111111;
3'b111: Y = 8'b01111111;
endcase
end
else
Y = 8'b11111111;
end
endmodule
III. Mô hình hành vi (Behavioral model)

Ví dụ: viết chương trình verilog mô tả ALU 3 bit vôùi


8 chöùc naêng duøng mô hình hành vi
s2 s1 s0 f
0 0 0 a
0 0 1 a and b
0 1 0 a or b
0 1 1 not (a)
1 0 0 a+b
1 0 1 a–b
1 1 0 a+1
1 1 1 a-1
42
module alu_bh (a, b,s, f);
input [2:0]a, b,s;
output [3:0]f;
reg [3:0]f;
always @ (a, b, s) begin
case (s)
3'b000 : f = a;
3'b001 : f = a&b;
3'b010 : f = a|b;
3'b011 : f = ~a;
3'b100 : f = a+b;
3'b101 : f = a-b;
3'b110 : f = a + 1'b1;
3'b111 : f = a - 1'b1;
endcase
end
endmodule
III. Mô hình hành vi (Behavioral model)

Bài tập 8: viết chương trình verilog mô tả mạch so sánh 2


số 4 bit dùng mô hình hành vi

44
III. Mô hình hành vi (Behavioral model)

Bài tập 9:
Viết chương trình verilog mô tả m ch gi i mã BCD sang
LED7SEG anode chung duøng mô hình hành vi
dùng mô hình hành vi

- vẽ sơ đồ chân in/out
- Lập trạng thái
- Viết code
- Mô phỏng và ktra kết quả

45
III. Mô hình hành vi (Behavioral model)

Sơ đồ chân và bảng trạng thái mạch giải mã BCD->LED


bảy đoạn anode chung

46
VI. Thiết kế mạch số theo cấu trúc phân cấp

Verilog hỗ trợ cấu trúc phân cấp bằng cách cho


phép modules được nhúng trong modules khác.
Modules cấp độ cao hơn tạo thể hiện của
module ở cấp độ thấp và giao tiếp với chúng
thông qua các đầu vào, đầu ra và đầu vào ra hai
chiều.
Cấu trúc phân cấp giúp người thiết kế chia một
hệ thống thiết kế ra thành các module nhỏ hơn để
dễ thiết kế và kiểm soát luồng dữ liệu trong quá
trình thiết kế.
VI. Thiết kế mạch số theo cấu trúc phân cấp

a. Nguyên tắc thiết kế theo cấu trúc phân cấp


 top-level module laø module ôû caáp cao nhaát
 module thaáp nhaát chöùa caùc haøm ñöôïc ñònh nghóa
saün trong verilog
 caùc module ñöôïc vieát trong moät hoaëc nhieàu file
khaùc nhau
 module caáp cao muoán goïi module caáp thaáp hôn thì
trong chöông trình cuûa noù phaûi coù leänh goïi module
thaáp ñoù

48
VI. Thiết kế mạch số theo cấu trúc phân cấp

b. Module con
 Laø module ñöôïc ñònh nghóa loàng trong moät module
khaùc
 Leänh goïi vaø gaùn ñaëc tính cho module con seõ taïo ra
moät hoaëc nhieàu baûn sao cuûa module ñöôïc ñònh nghóa
 Caùch goïi module con nhö sau:

module_name_instance name (port_connection_list);


VD: Caáu truùc phaân caáp cuûa boä coäng 16 bit

50
Ví dụ 1: viết code Verilog mô tả mạch FA dùng HA
Mạch cộng HA
Chức năng: HA cộng hai số nhị phân A
và B một bit không có nhớ

Biểu thức ngõ ra:


S  A B
Bảng trạng thái: C  A.B
Sơ đồ mạch HA:
Mạch cộng FA
Chức năng:
FA cộng hai số nhị phân A và B một bit có nhớ.
Bảng trạng thái:

Biểu thức ngõ ra:


VI. Thiết kế mạch số theo cấu trúc phân cấp

Sơ đồ phần cứng mạch cộng FA dùng HA


Code mô tả mạch cộng FA dùng HA
module fa_hier (s,co,ci,a,b); //module top
input ci, a,b;
output s,co;
wire x,y,z;
ha HA1(x,y,a,b);
ha HA2(s,z,ci,x);
or (co,z,y);
endmodule
//module instance
module ha (s,c,a,b);
input a,b;
output s,c;
assign s = a ^ b;
assign c = a & b;
endmodule
VI. Thiết kế mạch số theo cấu trúc phân cấp
Ví dụ 2: viết chương trình verilog mô tả Mux 4 to 1 söû duïng
Mux 2 to 1

sel q
00 a
01 b
10 c
11 d
VI. Thiết kế mạch số theo cấu trúc phân cấp

Đáp án:
- Viết module con Mux2to1
Viết code MUX4to1 duøng MUX 2to1
//module top
module mux4to1(q,sel,a,b,c,d);
input [1:0] sel;
input a,b,c,d;
output q;
wire tmp1,tmp2;

mux2to1 M0 (tmp1,sel[0],a,b);
mux2to1 M1 (tmp2,sel[0],c,d);
mux2to1 M2 (q,sel[1],tmp1,tmp2);
endmodule
code mô tả MUX 4 to 1 duøng MUX 2to1
//module top //module instantiation
module mux4to1(q,sel,a,b,c,d); module mux2to1(q,s,a,b);
input [1:0] sel; input s,a,b;
input a,b,c,d; output q;
output q; wire selbar,a1,a2;
wire tmp1,tmp2;
not(selbar,s);
mux2to1 M0 (tmp1,sel[0],a,b); and (a1,selbar,a);
mux2to1 M1 (tmp2,sel[0],c,d); and (a2,s,b);
mux2to1 M2 (q,sel[1],tmp1,tmp2); or (q,a1,a2);
endmodule endmodule
Ví dụ 3: viết chương trình verilog mô tả decoder 38
ngõ ra tích cực thấp dùng decoder 24

A Y
0 Y0
B(MSB) Y
1 Y1
Y
2 Y2
2 to 4
E Y
3 Y3

A A Y
0 Y4
B(MSB) Y5
B Y
1

Y
2 Y6
2 to 4
C E Y
3 Y7
(MSB)
Đáp án
module decoder3_8 (A,B,C,Y); module decoder2_4(b,a,e,y);
input A,B,C; input a,b,e;
output [7:0]Y; output reg [3:0]y;
wire notc; always @ (a,b,e)
not (notc,C); begin
decoder2_4 u1(B,A,notc,Y[3:0]); if (e == 1'b0)
decoder2_4 u2(B,A,C,Y[7:4]); y = 4'b1111;
Endmodule else
begin
A Y
0 Y0 case ({b,a})
B(MSB) Y
1 Y1 2'b00: y = 4'b1110;
2 to 4
Y
2 Y2 2'b01: y = 4'b1101;
E Y
3 Y3 2'b10: y = 4'b1011;
2'b11: y = 4'b0111;
A A Y
0 Y4 endcase
B B(MSB) Y
1 Y5 end
Y
2 Y6 end
C E
2 to 4 Y
3 Y7 endmodule
(MSB)
Kết quả mô phỏng
C là MSB
Kết quả chạy nestlist
VI. Thiết kế mạch số theo cấu trúc phân cấp

Bài tập 10:


Viết code verilog mô tả MUX16-1 dùng MUX4-1
a. Vẽ sơ đồ mạch logic MUX16-1 dùng MUX4-1
b. Viết code verilog dùng cấu trúc phân cấp
Sơ đồ mạch bài 2
VI. Thiết kế mạch số theo cấu trúc phân cấp

Bài tập 11:


Viết code verilog mô tả decoder 4 to16 dùng decoder2 to 4
a. Vẽ sơ đồ mạch logic decoder 4 to16 dùng decoder2 to 4
b. Viết code verilog dùng cấu trúc phân cấp
sơ đồ mạch logic decoder 4 to16 dùng decoder2 to 4
VI. Thiết kế mạch số theo cấu trúc phân cấp

Bài tập 12
Viết code verilog mô tả DEMUX1-8 dùng DEMUX1-4
a. Vẽ sơ đồ mạch logic DEMUX1-8 dùng DEMUX1-4
b. Viết code verilog dùng cấu trúc phân cấp
VI. Thiết kế mạch số theo cấu trúc phân cấp

Bài tập 13
Viết code verilog mô tả mạch so sánh 4 bit dùng mạch so
sánh 1 bit
a. Vẽ sơ đồ mạch so sánh 4 bit dùng mạch so sánh 1 bit
b. Viết code verilog dùng cấu trúc phân cấp
VI. Thiết kế mạch số theo cấu trúc phân cấp

Bài tập 14
Vieát code verilog moâ taû mạch nhân 4 bit dùng FA, sử
dụng cấu trúc phân cấp.
Sơ đồ chân in/out:

a
4 f
Mạch nhân 8
b 4 bit
4
VI. Thiết kế mạch số theo cấu trúc phân cấp

Gợi ý:
Thực hiện nhân hai số nhị phân A = 1100; B = 1011
VI. Thiết kế mạch số theo cấu trúc phân cấp

Thực hiện nhân hai số nhị phân 4 bit bất kỳ A và B:


Cho: A = a3a2a1a0 và B = b3b2b1b0
Kết quả : P=p7p6p5p4p3p2p1p0
Sơ đồ logic mạch nhân 4 bit dùng FA
VI. Thiết kế mạch số theo cấu trúc phân cấp

- Viết code verilog dùng cấu trúc phân cấp


- Chạy mô phỏng và kiểm tra kết quả

You might also like