Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 59

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

VIỆN ĐIỆN TỬ - VIỄN THÔNG

*******

BÁO CÁO GIỮA KỲ

THIẾT KẾ TỔNG HỢP IC SỐ VÀ HỆ THỐNG SỐ

Nhóm thực hiện: Nhóm 4

Nguyễn Duy Quang 20152956 Điện tử 06-K60

Ngô Văn Quyền 20153086 Điện tử 08-K60

Nguyễn Văn Cường 20150520 Điện tử 05-K60

Giảng viên hướng dẫn: TS. Võ Lê Cường

Hà Nội, 11/2018
MỤC LỤC
MỤC LỤC ........................................................................................................................ 3

DANH MỤC HÌNH ẢNH ............................................................................................... 5

DANH MỤC BẢNG BIỂU ............................................................................................. 8

PHÂN CÔNG CÔNG VIỆC ............................................................................................ 9

CHƯƠNG 1: CÁC VÍ DỤ TRONG CHƯƠNG 3 .................................................... 11

1.1. Commpare 2 bit ................................................................................................ 11

1.2. Mux 4-1 ............................................................................................................ 14

1.3. Full-adder 4 bit ................................................................................................. 16

1.4. Thực hiện cổng AND ba đầu vào ..................................................................... 19

1.5. Encoder ............................................................................................................. 23

1.6. Decoder 2-4 ...................................................................................................... 25

1.7. Hiển thị 4 led 7 thanh(Anot chung) .................................................................. 28

1.8. Adder using a hard literal ................................................................................. 31

1.9. Adder using parameter ..................................................................................... 33

1.10. Adder instantiation example ........................................................................... 34

1.11. Sign-magnitude adder .................................................................................... 36

1.12. Barrel shifter case ........................................................................................... 38

1.13. Barrel shifter stage.......................................................................................... 40

1.14. Simplified floating-point adder ...................................................................... 41

CHƯƠNG 2: CÁC VÍ DỤ TRONG CHƯƠNG 4 .................................................... 44

2.1. DFF without reset asynchronous ...................................................................... 44

 Verilog Code: ................................................................................................... 44

3
2.2. DFF with reset asynchronous ........................................................................... 45

2.3. DFF with enable synchronous ......................................................................... 46

2.4. Register ............................................................................................................. 47

2.5. Register file ...................................................................................................... 48

2.6. Free-running shift register ................................................................................ 50

2.7. Universal shift register ..................................................................................... 51

2.8. Free-Runing Binary Counter ............................................................................ 54

2.9. Universal binary counter .................................................................................. 56

2.10. Mod-m counter ............................................................................................... 58

DANH MỤC TÀI LIỆU THAM KHẢO ....................................................................... 59

4
DANH MỤC HÌNH ẢNH
Hình 1.1. Mô phỏng bộ Compare 2 bit .......................................................................... 13
Hình 1.2. Mạch RTL của bộ Compare ........................................................................... 14
Hình 1.3. Mô phỏng bộ MUX41 .................................................................................... 16
Hình 1.4. Mạch RTL của bộ MUX41 ............................................................................ 16
Hình 1.5. Mô phỏng bộ Half Adder ............................................................................... 18
Hình 1.6. Mô phỏng bộ Full Adder 1bit ........................................................................ 18
Hình 1.7. Mô phỏng bộ Full Adder 4bit ........................................................................ 19
Hình 1.8. Khối DUT bộ And 3 bit ................................................................................. 20
Hình 1.9. Mạch And 3 đầu vào đúng ............................................................................. 20
Hình 1.10. Mô phỏng mạch And 3 đầu vào đúng .......................................................... 21
Hình 1.11. Mạch AND 3 đầu vào sai ............................................................................. 21
Hình 1.12. Mô phỏng mạch And 3 đầu vào lỗi .............................................................. 22
Hình 1.13. Mạch bộ Encoder ưu tiên ............................................................................. 23
Hình 1.14. Khối DUT bộ Endcoder ............................................................................... 24
Hình 1.15. Mô phỏng bộ Encoder .................................................................................. 25
Hình 1.16. Mạch bộ Decoder 2-4. .................................................................................. 26
Hình 1.17. Khối DUT bộ Decoder ................................................................................. 27
Hình 1.18. Mô phỏng bộ Decoder 2-4 ........................................................................... 27
Hình 1.19. Mô phỏng mạch Hex to sseg ........................................................................ 29
Hình 1.20. Mạch RTL bộ Hex to Sseg ........................................................................... 29
Hình 1.21. Sơ đồ khối bộ Adder using a hard literal ..................................................... 31
Hình 1.22. Mô phỏng bộ Adder using a hard literal ...................................................... 32
Hình 1.23. Mạch RTL bộ Adder using a hard literal ..................................................... 32
Hình 1.24. Sơ đồ khối bộ Adder using parameter.......................................................... 33
Hình 1.25. Mô phỏng sử dụng bộ Adder using parameter ............................................. 34
Hình 1.26. Sơ đồ khối bộ Adder instantiation example ................................................. 34
Hình 1.27. Mô phỏng bộ Adder instantiation example .................................................. 35
Hình 1.28. Mạch RTL bộ Adder instantiation example ................................................. 35

5
Hình 1.29. Sơ đồ khối bộ Sign-magnitude adder ........................................................... 36
Hình 1..30. Mô phỏng bộ Sign-magnitude adder ........................................................... 37
Hình 1.31. Mạch RTL bộ Sign-magnitude adder........................................................... 38
Hình 1.32. Mô phỏng bộ Barrel shifter case .................................................................. 39
Hình 1.33. Mạch RTL bộ Barrel shifter case ................................................................. 39
Hình 1.34. Mô phỏng Barrel shifter stage ...................................................................... 40
Hình 1.35. Mạch RTL bộ Barrel shifter stage................................................................ 41
Hình 1.36. Mô phỏng bộ Simplified floating-point adder ............................................. 43
Hình 1.37. Mạch RTL của Simplified floating-point adder........................................... 43
Hình 2.1. Khối DUT và bảng nguyên lý của DFF ......................................................... 44
Hình 2.2. Mô phỏng bộ DFF .......................................................................................... 44
Hình 2.3. Khối DUT và bảng nguyên lý DFF with reset asynchronous ........................ 45
Hình 2.4. Mô phỏng bộ DFF with reset asynchronous .................................................. 46
Hình 2.5. Khối DUT và bảng nguyên lý DFF with enable synchronous ....................... 46
Hình 2.6. Mô phỏng bộ DFF with enable synchronous ................................................. 47
Hình 2.7. Khối DUT bộ Register ................................................................................... 48
Hình 2.8. Mô phỏng bộ Register .................................................................................... 48
Hình 2.9. Khối DUT bộ Register file ............................................................................. 49
Hình 2.10. Mô phỏng bộ Register file ........................................................................... 49
Hình 2.11. Mô phỏng Free-running shift register .......................................................... 51
Hình 2.12. Mạch RTL của bộ Free-running shift register ............................................. 51
Hình 2.13. Mô phỏng bộ Universal shift register .......................................................... 53
Hình 2.14. Mạch RTL bộ Universal shift register ......................................................... 53
Hình 2.15. Sơ đồ thuật toán bộ Free-Runing Binary Counter ....................................... 54
Hình 2.16. Mô phỏng bộ Free-Runing Binary Counter ................................................. 55
Hình 2.17. Mạch RTL bộ Free-Runing Binary Counter ................................................ 55
Hình 2.18. Mô phỏng bộ Universal binary counter ....................................................... 57
Hình 2.19. Mạch RTL bộ Universal binary counter ...................................................... 57
Hình 2.20. Mô phỏng bộ Mod-m counter ...................................................................... 58

6
Hình 2.21. Mô phỏng bộ Mod-m counter ...................................................................... 58

7
DANH MỤC BẢNG BIỂU
Bảng 1. Bảng phân chia công việc ................................................................................. 10
Bảng 1.1. Bảng chân lý bộ Compare ............................................................................. 12
Bảng 1.2. Bảng chân lý của Mux41 ............................................................................... 15
Bảng 1.3. Bảng chân lý của cổng AND 3 đầu vào......................................................... 20
Bảng 1.4. Bảng chân lý Encode ưu tiên và không ưu tiên ............................................. 23
Bảng 1.5. Bảng chân lý bộ Decoder 2-4 ........................................................................ 26
Bảng 1.6. Bảng chuyển đổi giá trị Hex về LED7 Anot ................................................. 28
Bảng 2.1. Bảng chức năng của bộ Universal binary counter ......................................... 56

8
PHÂN CÔNG CÔNG VIỆC
Thành viên MSSV Công việc

Ngô Văn Quyền 20153086 - Tìm hiểu và thiết kế các mạch tổ hợp và một số mạch cơ
bản :

+Full adder 2bit, Decoder, Encoder, And, Eq_always.

+D-flipflop, Register.

- Đọc và tìm hiểu về chương 3 (cấu trúc và quy ước trong


Verilog) sách “Advanced Digital Desgin”; Phần 3.4 – 3.5
sách “FPGA Prototyping By Verilog Examples”.

Nguyễn Văn Cường 20150520 - Tìm hiểu và thiết kế các mạch tổ hợp và một số mạch
thiết kế :

+Adder (4 bits, N bits sử dụng Parameter, Cộng có


dấu, độ lớn).

+Shifter (Universal shift register, Free running shift


register, Barrel shifter stage, Barrel shifter case).

- Đọc và tìm hiểu về chương 2 (Mô hình phân cấp) sách


“Advanced Digital Desgin”; Phần 3.6 – 3.8 sách “FPGA
Prototyping By Verilog Examples”.

Nguyễn Duy Quang 20152956 - Nắm bắt, phân chia công việc và tổng hợp phần bài làm
của các bạn trong nhóm, làm slide, viết báo cáo.

- Tìm hiểu và thiết kế các mạch tổ hợp và một số mạch


thiết kế :

9
+Counter (Free-Runing Binary Counter, Universal
binary counter, Mod-m counter).

+Dsp_Mux (Hex to Seg, mạch hiển thị LED7 thanh).

- Đọc và tìm hiểu về chương 1 (Tổng quan về thiết kế hệ


thống số sử dụng ngôn ngữ mô tả phần cứng Verilog ) sách
“Advanced Digital Desgin”; Phần 3.1 – 3.3 sách “FPGA
Prototyping By Verilog Examples”.

Bảng 1. Bảng phân chia công việc

10
CHƯƠNG 1: CÁC VÍ DỤ TRONG CHƯƠNG 3

1.1. Commpare 2 bit


 Mạch bao gồm:
o Input 2 bit: A1A0 và B1B0 ; Output 1 bit : it, eq và gt.
 Nguyên lý hoạt động:
o Đầu ra it = 1 khi A1A0 < B1B0, còn các đầu ra khác bằng 0.
o Đầu ra eq = 1 khi A1A0 = B1B0, còn các đầu ra khác bằng 0.
o Đầu ra gt = 1 khi A1A0 > B1B0, còn các đầu ra khác bằng 0.
 Bảng chân lý:

A1 A0 B1 B0 it eq gt

0 0 0 0 0 1 0

0 0 0 1 1 0 0

0 0 1 0 1 0 0

0 0 1 1 1 0 0

0 1 0 0 0 0 1

0 1 0 1 0 1 0

0 1 1 0 1 0 0

0 1 1 1 1 0 0

1 0 0 0 0 0 1

1 0 0 1 0 0 1

1 0 1 0 0 1 0

1 0 1 1 1 0 0

1 1 0 0 0 0 1

1 1 0 1 0 0 1

1 1 1 0 0 0 1

1 1 1 1 0 1 0

11
Bảng 1.1. Bảng chân lý bộ Compare

 Bìa Kangnau:
a. Eq:
B0B1
A0 A1 00 01 11 10
00 1
01 1
11 1
10 1
 eq = A1’A0’B1’B0’ + A1’A0B1’B0 + A1A0B1B0 + A1A0’B1B0’
b. Gt:
B0B1
A0 A1 00 01 11 10
00
01 1
11 1 1 1
10 1 1
 gt = A0B1’B0’ + A1A0B0’ + A1B1’
c. lt:
B0B1
A0 A1 00 01 11 10
00 1 1 1
01 1 1
11
10 1
 lt = A1’A0’B0 + A0’B1B0 + A1’B1

12
 Code Verilog:
1. module compare(lt,gt,eq,A,B);
2.
3. output lt,gt,eq;
4. input [1:0] A,B;
5.
6. wire [9:0] C;
7. wire [3:0] D;
8.
9. not n1(D[0], A[0]);
10. not n2(D[1], A[1]);
11. not n3(D[2], B[0]);
12. not n4(D[3], B[1]);
13.
14. and a11(C[0], D[0], D[1], D[2], D[3]);
15. and a12(C[1], A[0], D[1], B[0], D[3]);
16. and a13(C[2], A[0], A[1], B[0], B[1]);
17. and a14(C[3], D[0], A[1], D[2], B[1]);
18. or o1(eq, C[0], C[1], C[2], C[3]);
19.
20. and a21(C[4], A[0], D[2], D[3]);
21. and a22(C[5], A[0], A[1], D[2]);
22. and a23(C[6], A[1], D[3]);
23. or o2(gt, C[4], C[5], C[6]);
24.
25. and a31(C[7], D[0], D[1], B[0]);
26. and a32(C[8], D[0], B[0], B[1]);
27. and a33(C[9], D[1], B[1]);
28. or o3(lt, C[7], C[8], C[9]);
29.
30. endmodule

 Mô phỏng Testbench:

Hình 1.1. Mô phỏng bộ Compare 2 bit

Sử dụng 1 đầu vào A 4 bit , trong đó 2 bít đầu là A1A0 và 2 bit sau là B1B0.

13
 Mạch RTL:

Hình 1.2. Mạch RTL của bộ Compare

1.2. Mux 4-1


 Bộ Mux 4-1 bao gồm:
o 6 đầu vào 1 bit:A và B quy định đầu ra.
o 1 đầu vào 1 bit: X[3:0].
o Một đầu ra O 1 bit.
 Nguyên lý hoạt động:
o Đầu ra sẽ bằng I0 khi S0 = 0 và S1 = 0.
o Đầu ra sẽ bằng I1 khi S0 = 0 và S1 = 1.

14
o Đầu ra sẽ bằng I2 khi S0 = 1 và S1 = 0.
o Đầu ra sẽ bằng I3 khi S0 = 1 và S1 = 1.
 Bảng chân lý:
S0 S1 O
0 0 I0
0 1 I1
1 0 I2
1 1 I3
Bảng 1.2. Bảng chân lý của Mux41

 O = S1’S0’ I0 + S1’S0I1 + S1S0’I2 + S1S0I3

 Verilog Code:
1. module Mux41 (O, S0, S1, I0, I1, I2, I3);
2.
3. input I0, I1, I2, I3, S0, S1;
4. output O;
5.
6. wire S0n,S1n; // dau ra dao cua S0, S1
7. wire w1,w2,w3,w4;
8.
9. not not1(S0n,S0);
10. not not2(S1n,S1);
11.
12. and and1(w1,I0,S1n,S0n); // S0 = 0, S1 = 0 chon I0
13. and and2(w2,I1,S1n,S0); // S0 = 1, S1 = 0 chon I1
14. and and3(w3,I2,S1,S0n); // S0 = 0, S1 = 1 chon I2
15. and and4(w4,I3,S1,S0); // S0 = 1, S1 = 1 chon I3
16.
17. or or1(O,w1,w2,w3,w4);
18.
19. endmodule

15
 Mô phỏng Testbench:

Hình 1.3. Mô phỏng bộ MUX41

 Mạch RTL:

Hình 1.4. Mạch RTL của bộ MUX41

1.3. Full-adder 4 bit


 Mạch bao gồm:
o Hai đầu vào 4 bit: A[3:0] và B[3:0].
o Một đầu vào 1 bit: C0.
o Một đầu ra 4 bit: S[3:0].
o Một đầu ra 1 bit: C4.
 Nguyên lý hoạt động: Mạch sẽ bao gồm 4 bộ full-adder 1 bit mắc liên tiếp với
nhau để tính ra kết quả của phép công của hai số 4 bit

16
 Half-adder 1 bit:
o Mạch bao gồm:
 Hai đầu vào 1 bit A và B
 Hai đầu ra 1 bit S và C
o Nguyên lý hoạt động: mạch sẽ có đầu ra là kết quả của phép cộng 2 số nhị
phân 1 bit được lấy từ 2 đầu vào A và B. Trong đó, S sẽ là kết quả của
phép cộng của A và B, C sẽ là bit nhớ.
o Bảng chân lý

A B C S

0 0 0 0

0 1 0 1

1 0 0 1

1 1 1 0

 S = A’B + AB’
 C = AB
 Code Verilog

1. module half_add(S,C,A,B);
2.
3. output S,C;
4. input A,B;
5.
6. xor Sum(S,A,B);
7. and Carry(C,A,B);
8.
9. Endmodule

17
 Mô phỏng TestBench

Hình 1.5. Mô phỏng bộ Half Adder

 Full-adder 1 bit
o Mạch bao gồm:
 Ba đầu vào 1 bit: A, B và CI
 Hai đầu ra 1 bit: S và CO
o Nguyên lý hoạt động: mạch sẽ bao gồm hai bộ half adder mắc nối tiếp và
một bộ OR.
o Code Verilog mô hình RTL:

1. module fulladd1bit(S, CO, A, B, CI) ;


2.
3. output S, CO ;
4. input A, B, CI ;
5.
6. wire S1, C1, C2;
7.
8. half_add PARTSUM (S1, C1, A, B);
9. half_add SUM (S, C2, S1, CI);
10.
11. or CARRY (CO, C2, C1);
12.
13. endmodule

 Mô phỏng TestBench

Hình 1.6. Mô phỏng bộ Full Adder 1bit


18
 Code Full-adder 4 bit
1. module fulladd4bit (S, C4, A, B, C0) ;
2.
3. input [3:0] A;
4. input [3:0] B;
5. input C0 ;
6. output [3:0] S;
7. output C4 ;
8.
9. wire C1, C2, C3;
10.
11. fulladd1bit SUM1 (S[0], C1, A[0], B[0], C0);
12. fulladd1bit SUM2 (S[1], C2, A[1], B[1], C1);
13. fulladd1bit SUM3 (S[2], C3, A[2], B[2], C2);
14. fulladd1bit SUM4 (S[3], C4, A[3], B[3], C3);
15.
16. endmodule

 Mô phỏng Testbench

Hình 1.7. Mô phỏng bộ Full Adder 4bit

1.4. Thực hiện cổng AND ba đầu vào


 Bảng chân lý cổng AND ba đầu vào

a b c y
0 0 0 0
0 0 1 0
0 1 0 0
0 1 1 0
1 0 0 0

19
1 0 1 0
1 1 0 0
1 1 1 1
Bảng 1.3. Bảng chân lý của cổng AND 3 đầu vào

 Khối DUT

b And 3bit
y
(DUT)
c

Hình 1.8. Khối DUT bộ And 3 bit

 Mạch thực hiện đúng


Code verilog:

1. module and_block_assign
2. (
3. input reg a, b, c,
4. output reg y
5. );
6. always @*
7. begin
8. y = a;
9. y = y & b;
10. y = y & c;
11. end
12. Endmodule

 Mạch:

Hình 1.9. Mạch And 3 đầu vào đúng

20
 Kết quả mô phỏng đúng:

Hình 1.10. Mô phỏng mạch And 3 đầu vào đúng

 Mạch thực hiện sai:


o Code verilog:

1. module and_cont_assign
2. (
3. input wire a, b, c,
4. output wire y
5. );
6. assign y = a;
7. assign y = y & b;
8. assign y = y & c;
9. endmodule

o Mạch:

Hình 1.11. Mạch AND 3 đầu vào sai

o Kết quả mô phỏng sai:

21
Hình 1.12. Mô phỏng mạch And 3 đầu vào lỗi

Giải thích: Kết quả mô phỏng sai

Các lệnh gán assign chạy song song nên

Khi a = 0, đầu ra y = 0 với mọi giá trị đầu vào

Khi a = 1, y nhận đồng thời các giá trị từ a, b, c do đó y = x (don’t care) – thể hiện
bằng đường màu đỏ nằm ở giữa 0 và 1.

22
1.5. Encoder
 Thiết kế bằng tay với Encoder ưu tiên và không ưu tiên:

r[4] r[3] r[2] r[1] Y 111111111111111 r[4] r[3] r[2] r[1] y

1 x x x 100 0 0 0 0 000

0 1 x x 011 0 0 0 1 001

0 0 1 x 010 0 0 1 0 010

0 0 0 1 001 … … … … 001

0 0 0 0 000 1 1 1 1 100

Bảng 1.4. Bảng chân lý Encode ưu tiên và không ưu tiên

 Từ bảng chân lý ta có mạch:

Hình 1.13. Mạch bộ Encoder ưu tiên

23
 Khối DUT:

4 Encoder 3
r y
(DUT)

Hình 1.14. Khối DUT bộ Endcoder

 Code Verilog sử dụng If (Ưu tiên):

1. module prio_encoder_if
2. (
3. input wire [4:1] r,
4. output reg [2:0] y
5. );
6. always @*
7. if (r[4] == 1'b1) // can be written as (r[4])
8. y = 3'b100;
9. else if (r[3] == 1'b1) // can be written as (r[3])
10. y = 3'b011;
11. else if (r[2] == 1'b1) // can be written as (r[2])
12. y = 3'b010;
13. else if (r[1] == 1'b1) // can be written as (r[l])
14. y = 3'b001;
15. else
16. y = 3'b000;
17. endmodule

 Dùng case (Không ưu tiên):

1. module prio_encoder_case
2. (
3. input wire [4:1] r,
4. output reg [2:0] y
5. );
6. always @*
7. case (r)
8. 4'b1000, 4'b1001, 4'b1010, 4'b1011,
9. 4'b1100, 4'b1101, 4'b1110, 4'b1111:
10. y = 3'b100;
11. 4'b0100, 4'b0101, 4'b0110, 4'b0111:
12. y = 3'b011;
13. 4'b0010, 4'b0011:
14. y = 3'b010;
15. 4'b0001:
16. y = 3'b001;
17. 4'b0000: // defau1t can a1s0 be used
18. y = 3'b000;

24
19. endcase
20. endmodule

 Dùng casez:

1. module prio_encoder_casez
2. (
3. input wire [4:1] r,
4. output reg [2:0] y
5. );
6. always @*
7. casez (r)
8. 4'b1???: y = 3'b100;
9. 4'b01??: y = 3'b011;
10. 4'b001?: y = 3'b010;
11. 4'b0001: y = 3'b001;
12. 4'b0000: y = 3'b000; // defau1t can also be used
13. endcase
14. endmodule

 Kết quả mô phỏng:

Hình 1.15. Mô phỏng bộ Encoder

 Giải thích:

Trong khoảng từ 80ps đếb 160ps bit thứ 3 tính từ phải sang trái là bit được ưu
tiên và kết quả đều là 011 với 4 giá trị đầu vào 0100, 0101, 0110, 0111 đúng vơi bảng
chân lý

Sự khác biệt khi ko dùng if ưu tiên mà dùng case hoặc casez là ở mạch thực hiện. Trong
khi if … else là các bộ mux 2-1 nối tiếp nhau, thì với case là bộ mux 24 – 1, bộ casez là
mux 5 -1.

1.6. Decoder 2-4


 Code Verilog:

1. module decoder_2_4_if
2. (
3. input wire [1:0] a,
4. input wire en,

25
5. output reg [3:0] y
6. );
7. always @*
8. if (en==1'b0) // can be writen as (-en)
9. y = 4'b0000;
10. else if (a==2'b00)
11. y = 4'b0001;
12. else if (a==2'b01)
13. y = 4'b0010;
14. else if (a==2'b10)
15. y = 4'b0100;
16. else
17. y = 4'b1000;
18. endmodule

 Thiết kế bằng tay:

en a y

0 xx 0000

1 00 0001

1 01 0010

1 10 0100

1 11 1000

Bảng 1.5. Bảng chân lý bộ Decoder 2-4

 Thiết kế mạch :

Hình 1.16. Mạch bộ Decoder 2-4.

26
 Khối DUT :

en Decoder
2 to 4 4
2 y
a (has en)
(DUT)

Hình 1.17. Khối DUT bộ Decoder

 Kết quả mô phỏng :

Hình 1.18. Mô phỏng bộ Decoder 2-4

 Giải thích :

Từ dạng sóng ta thấy:

Khi en = 0 thì bất cứ giá trị nào của a (00, 01, 10, 11) thì y = 0. Điều này chứng tỏ en có
độ ưu tiên cao nhất (đúng như khi xét điều kiện của en đầu tiên.

Khi en = 1 thì bắt đầu xét đến giá trị của a sẽ có giá trị của y tương ứng.

a = 00 => y = 0001

a = 01 => y = 0010

a = 10 => y = 0100

a = 11 => y = 1000

27
1.7. Hiển thị 4 led 7 thanh(Anot chung)
 Hex to sseg: Mạch hiển thị LED 7 thanh loại Anot chung.
o Bảng chuyển từ giá trị hex sang hiển thị LED7:

Bảng 1.6. Bảng chuyển đổi giá trị Hex về LED7 Anot

o Code Verilog:

1. module hex_to_sseg
2. (
3. input wire [3:0] hex,
4. input wire dp,
5. output reg [7:0] sseg // output active low
6. );
7. always @*
8. begin
9. case(hex)
10. 4'h0 : sseg[6:0] = 7'b0000001;
11. 4'hl : sseg[6:0] = 7'b1001111;
12. 4'h2 : sseg[6:0] = 7'b0010010;
13. 4'h3 : sseg[6:01 = 7'b0000110;
14. 4'h4 : sseg[6:0] = 7'b1001100;
15. 4'h5 : sseg[6:0] = 7'b0100100;
16. 4'h6 : sseg[6:0] = 7'b0100000;
17. 4'h7 : sseg[6:0] = 7'b0001111;
18. 4'h8 : sseg[6:0] = 7'b0000000;
19. 4'h9 : sseg[6:0] = 7'b0000100;
20. 4'ha : sseg[6:0] = 7'b0001000;
21. 4'hb : sseg[6:0] = 7'b1100000;
22. 4'hc : sseg[6:0] = 7'b0110001;
23. 4'hd : sseg[6:0] = 7'b1000010;
24. 4'he : sseg[6:0] = 7'b0110000;
25. default : sseg[6:0] = 7'b0111000; //4'hf
26. endcase
27. sseg[7] = dp;
28. end
29. endmodule

28
o Mô phỏng:

Hình 1.19. Mô phỏng mạch Hex to sseg

o Mạch RTL:

Hình 1.20. Mạch RTL bộ Hex to Sseg

29
 Dsp Mux: mạch hiện thị LED theo dạng quét LED.

1. module disp_mux
2. (
3. input wire clk,reset,
4. input [7:0] in3, in2, in1, in0,
5. output reg [3:0] an,
6. output reg [7:0] sseg
7. );
8.
9. localparam N=18;
10.
11. reg [N-1:0] q_reg;
12. wire [N-1:0] q_next;
13.
14. always @(posedge clk, posedge reset)
15. if (reset)
16. q_reg <= 0;
17. else
18. q_reg <= q_next;
19.
20. assign q_next =q_reg + 1;
21.
22. always @*
23. case (q_reg[N-1:N-2])
24. 2'b00:
25. begin
26. an = 4'b1110;
27. sseg = in0;
28. end
29. 2'b01:
30. begin
31. an = 4'b1101;
32. sseg = in1;
33. end
34. 2'b10:
35. begin
36. an = 4'b1011;
37. sseg = in2;
38. end
39. default:
40. begin
41. an = 4'b0111;
42. sseg = in3;
43. end
44. endcase
45. endmodule

 Mạch tổng hợp của Hex to sseg và dsp mux:

1. module hex_to_sseg_test
2. (
3. input wire clk,
4. input wire [7:0] sw,
5. output wire [3:0] an,
6. output wire [7:0] sseg
7. );
8.

30
9. wire [7:0] inc;
10. wire [7:0] led0, led1, led2, led3;
11.
12. assign inc = sw + 1;
13.
14. hex_to_sseg sseg_unit_0
15. (.hex(sw[3:0]),.dp(1'b0), .sseg(led0));
16. hex_to_sseg sseg_unit_1
17. (.hex(sw[7:4]),.dp(1'b0), .sseg(led1));
18.
19. hex_to_sseg sseg_unit_2
20. (.hex(sw[3:0]),.dp(1'b1), .sseg(led2));
21. hex_to_sseg sseg_unit_3
22. (.hex(sw[7:4]),.dp(1'b1), .sseg(led3));
23.
24. disp_mux disp_unit
25. (.clk(clk), .reset(1'b0), .in0(led0), .in1(led1),
26. .in2(led2), .in3(led3), .an(an), .sseg(sseg));
27.
28. endmodule

1.8. Adder using a hard literal


 Sơ đồ khối:

A[3:0] Sum = sum_ext[3:0]

Thêm 1 bit 0 vào sum_ext


A+B
B[3:0] đầu
Cout = sum_ext[4]

Hình 1.21. Sơ đồ khối bộ Adder using a hard literal

 Đầu vào: A, B: 4 bit


 Đầu ra:
o Tổng Sum 4 bit
o Bit nhớ: cout (1 bit)
 Hoạt động:
o Thêm 1 bit 0 vào phía trái (bit trọng số cao nhất) cho cả A và B.
o Tiến hành cộng bình thường, được tổng sum_ext 5 bit.
o Tổng Sum đầu ra là 4 bit cuối, cout là bit trái cùng của sum_ext.

31
 Mã nguồn
1. module adder_carry_hard_lit
2. (
3. input wire [3:0] a, b,
4. output wire [3:0] sum,
5. output wire cout // carry-out
6. );
7.
8. // signal declaration
9. wire [4:0] sum_ext;
10.
11. //body
12. assign sum_ext = {1'b0, a} + {1'b0, b};
13. assign sum = sum_ext[3:0];
14. assign cout= sum_ext[4];
15.
16. endmodule

 Mô phỏng:

Hình 1.22. Mô phỏng bộ Adder using a hard literal

 Mạch RTL:

Hình 1.23. Mạch RTL bộ Adder using a hard literal

32
1.9. Adder using parameter
 Sơ đồ khối:
A[N-1:0] Sum = sum_ext[N-1:0]

Thêm 1 bit 0 vào sum_ext


A+B
B[N-1:0] đầu
Cout = sum_ext[N]

Hình 1.24. Sơ đồ khối bộ Adder using parameter

 Đây là trường hơp tổng quát của bộ cộng N bit, ví dụ trên là trường hợp N = 4.
 Hoạt động tương tự như bộ cộng 4 bit.
 Code Verilog:
1. // Listing 3.11
2. module adder_carry_para
3. #(parameter N=4)
4. (
5. input wire [N-1:0] a, b,
6. output wire [N-1:0] sum,
7. output wire cout // carry-out
8. );
9.
10. // constant declaration
11. localparam N1 = N-1;
12.
13. // signal declaration
14. wire [N:0] sum_ext;
15.
16. //body
17. assign sum_ext = {1'b0, a} + {1'b0, b};
18. assign sum = sum_ext[N1:0];
19. assign cout= sum_ext[N];
20.
21. endmoduleendmodule

Sử dụng khai báo parameter để truyền tham số N cho module (giá trị mặc định
là 4).

33
 Mô phỏng:

Hình 1.25. Mô phỏng sử dụng bộ Adder using parameter

1.10. Adder instantiation example


Đây là ví dụ áp dụng bộ cộng N bit với giá trị N bất kì được truyền vào.

A[3:0] Sum = sum_ext[3:0]

4-bit adder
B[3:0] Cout = sum_ext[4]

A[7:0] Sum = sum_ext[7:0]

8-bit adder
B[7:0] Cout = sum_ext[8]

Hình 1.26. Sơ đồ khối bộ Adder instantiation example

 Giải thích:
o Đây là module lớn chứa 2 module bộ cộng 4 bit và 8 bit.
o Các đầu vào, đầu ra của module là tất cả đầu vào, đầu ra của 2 bộ cộng.
o Truyền tham số N = 8 và N = 4 để tạo 2 module bộ cộng trong module lớn,
sau đó nối các đầu vào, đầu ra tương ứng.
 Mã nguồn
1. // Listing 3.12

34
2. module adder_insta
3. (
4. input wire [3:0] a4, b4,
5. output wire [3:0] sum4,
6. output wire c4,
7. input wire [7:0] a8, b8,
8. output wire [7:0] sum8,
9. output wire c8
10. );
11.
12. // instantiate 8-bit adder
13. adder_carry_para #(.N(8)) unit1
14. (.a(a8), .b(b8), .sum(sum8), .cout(c8));
15.
16. // instantiate 4-bit adder
17. adder_carry_para unit2
18. (.a(a4), .b(b4), .sum(sum4), .cout(c4));
19.
20. endmodule

 Mô phỏng:

Hình 1.27. Mô phỏng bộ Adder instantiation example

 Mạch RTL:

Hình 1.28. Mạch RTL bộ Adder instantiation example

35
1.11. Sign-magnitude adder
 Một số nguyên N bit có thể biểu diễn dưới dạng dấu và độ lớn: bit trái cùng biểu
diễn dấu (0 là dương, 1 là âm), các bit còn lại biểu diễn độ lớn.
 Phép cộng có dấu 2 số nguyên có thể thực hiện như sau:
o Nếu 2 số hạng có cùng dấu: giữ nguyên dấu và cộng độ lớn.
o Nếu 2 số hạng khác dấu: lấy dấu của số hạng lớn hơn, độ lớn của tổng là
hiệu độ lớn 2 số hạng.
 Sơ đồ thuật toán:
a[N-1:0]

Sum[N-1:0]
Tách ra phần độ lớn Cộng độ lớn, giữ
Cùng dấu?
b[N-1:0] và phần dấu nguyên dấu

Lấy số có độ lớn lớn


hơn trừ độ lớn của
số nhỏ hơn

Lấy dấu của số có độ


lớn lớn hơn
Sum[N-1:0]

Hình 1.29. Sơ đồ khối bộ Sign-magnitude adder

 Code Verilog:
1. // Listing 3.16
2. module sign_mag_add
3. #(
4. parameter N=4
5. )
6. (
7. input wire [N-1:0] a, b,
8. output reg [N-1:0] sum
9. );
10.

36
11. // signal declaration
12. reg [N-2:0] mag_a, mag_b, mag_sum, max, min;
13. reg sign_a, sign_b, sign_sum;
14.
15. //body
16. always @*
17. begin
18. // separate magnitude and sign
19. mag_a = a[N-2:0];
20. mag_b = b[N-2:0];
21. sign_a = a[N-1];
22. sign_b = b[N-1];
23. // sort according to magnitude
24. if (mag_a > mag_b)
25. begin
26. max = mag_a;
27. min = mag_b;
28. sign_sum = sign_a;
29. end
30. else
31. begin
32. max = mag_b;
33. min = mag_a;
34. sign_sum = sign_b;
35. end
36. // add/sub magnitude
37. if (sign_a==sign_b)
38. mag_sum = max + min;
39. else
40. mag_sum = max - min;
41. // form output
42. sum = {sign_sum, mag_sum};
43. end
44. endmodule

 Mô phỏng:

Hình 1..30. Mô phỏng bộ Sign-magnitude adder

37
 Mạch RTL:

Hình 1.31. Mạch RTL bộ Sign-magnitude adder

1.12. Barrel shifter case


 Mục đích: thực hiện phéo toán quay bit
 Đầu vào:
o 8 bit dữ liệu cần quay: a[7:0]
o 3 bit biểu diễn số bit sẽ quay: amt[2:0]
 Đầu ra: 8 bit đã quay
 Cách thực hiện: “vét cạn”, tức liệt kê hết các giá trị có thể có của amt (số bit sẽ
quay) rồi tìm kết quả ứng với mỗi trường hợp. Dùng lệnh case.
 Mã nguồn
1. // Listing 3.18
2. module barrel_shifter_case
3. (
4. input wire [7:0] a,
5. input wire [2:0] amt,
6. output reg [7:0] y
7. );
8.
9. // body
10. always @*
11. case(amt)
12. 3'o0: y = a;
13. 3'o1: y = {a[0], a[7:1]};
14. 3'o2: y = {a[1:0], a[7:2]};
15. 3'o3: y = {a[2:0], a[7:3]};
16. 3'o4: y = {a[3:0], a[7:4]};
17. 3'o5: y = {a[4:0], a[7:5]};
18. 3'o6: y = {a[5:0], a[7:6]};
19. default: y = {a[6:0], a[7]};
20. endcase
21.

38
22. endmodule

 Mô phỏng:

Hình 1.32. Mô phỏng bộ Barrel shifter case

 Mạch RTL:

Hình 1.33. Mạch RTL bộ Barrel shifter case


39
1.13. Barrel shifter stage
 Mục đích: thực hiện phép quay bit không sử dụng lệnh case, vì nếu kích thước
đầu vào lớn mạch sẽ rất phức tạp.
 Cách thực hiện: xét từng bit của amt[2:0], nếu là 1 thì dịch a theo cơ số mũ 2
tương ứng.
 Code Verilog :
1. // Listing 3.19
2. module barrel_shifter_stage
3. (
4. input wire [7:0] a,
5. input wire [2:0] amt,
6. output wire [7:0] y
7. );
8.
9. // signal declaration
10. wire [7:0] s0, s1;
11.
12. // body
13. // stage 0, shift 0 or 1 bit
14. assign s0 = amt[0] ? {a[0], a[7:1]} : a;
15. // stage 1, shift 0 or 2 bits
16. assign s1 = amt[1] ? {s0[1:0], s0[7:2]} : s0;
17. // stage 2, shift 0 or 4 bits
18. assign y = amt[2] ? {s1[3:0], s1[7:4]} : s1;
19.
20. endmodule

 Giải thích:
o Ở đây amt có 3 bit, xét từng bit tương ứng với 3 lệnh assign.
o Bit amt[0] ở vị trí 0, nếu amt[0] = 1 sẽ dịch a đi 20 = 1 bit.
o Bit amt[1] ở vị trí 1, nếu amt[1] = 1 sẽ dịch s0 đi 21 = 2 bit.
o Bit amt[2] ở vị trí 2, nếu amt[2] = 1 sẽ dịch s1 đi 22 = 4 bit.
o Đầu ra y sẽ là kết quả sau khi dịch s1, tức tổng số lần dịch sẽ bằng đúng
giá trị của amt.
 Mô phỏng:

Hình 1.34. Mô phỏng Barrel shifter stage


40
 Mạch RTL:

Hình 1.35. Mạch RTL bộ Barrel shifter stage

Ta có thể thấy số bộ MUX cần dùng bằng số bit của amt (trường hợp này là 3),
thay vì số bit dữ liệu vào là 8, mạch gọn hơn rất nhiều.

1.14. Simplified floating-point adder


 Là bộ cộng số nguyên biểu diễn dưới dạng dấu phẩy động.
 Cách thực hiện:
o Sắp xếp: đặt số có độ lớn lớn hơn lên trên khi thực hiện, không cần xét đến
dấu.
o Viết lại 2 số hạng sao cho chúng có cùng phần mũ.
o Thực hiện cộng hoặc trừ phần định trị của 2 số sau khi đã có cùng phần
mũ.
o Chuẩn hóa lại kết quả, phần mũ và phần định trị.
 Code Verilog:
1. // Listing 3.21
2. module fp_adder
3. (
4. input wire sign1, sign2,
5. input wire [3:0] exp1, exp2,
6. input wire [7:0] frac1, frac2,
7. output reg sign_out,
8. output reg [3:0] exp_out,
9. output reg [7:0] frac_out
10. );
11.
12. // signal declaration
13. //suffix b, s, a, n for
14. // big, small, aligned, normalized number
15. reg signb, signs;
16. reg [3:0] expb, exps, expn, exp_diff;
17. reg [7:0] fracb, fracs, fraca, fracn, sum_norm;

41
18. reg [8:0] sum;
19. reg [2:0] lead0;
20.
21. // body
22. always @*
23. begin
24. // 1st stage: sort to find the larger number
25. if ({exp1, frac1} > {exp2, frac2})
26. begin
27. signb = sign1;
28. signs = sign2;
29. expb = exp1;
30. exps = exp2;
31. fracb = frac1;
32. fracs = frac2;
33. end
34. else
35. begin
36. signb = sign2;
37. signs = sign1;
38. expb = exp2;
39. exps = exp1;
40. fracb = frac2;
41. fracs = frac1;
42. end
43.
44. // 2nd stage: align smaller number
45. exp_diff = expb - exps;
46. fraca = fracs >> exp_diff;
47.
48. // 3rd stage: add/substract
49. if (signb==signs)
50. sum = {1'b0, fracb} + {1'b0, fraca};
51. else
52. sum = {1'b0, fracb} - {1'b0, fraca};
53.
54. // 4th stage: normalize
55. // count leading 0s
56. if (sum[7])
57. lead0 = 3'o0;
58. else if (sum[6])
59. lead0 = 3'o1;
60. else if (sum[5])
61. lead0 = 3'o2;
62. else if (sum[4])
63. lead0 = 3'o3;
64. else if (sum[3])
65. lead0 = 3'o4;
66. else if (sum[2])
67. lead0 = 3'o5;
68. else if (sum[1])
69. lead0 = 3'o6;
70. else
71. lead0 = 3'o7;
72. // shift significand according to leading 0
73. sum_norm = sum << lead0;
74. // normalize with special conditions
75. if (sum[8]) // with carry out; shift frac to right
76. begin
77. expn = expb + 1;
78. fracn = sum[8:1];

42
79. end
80. else if (lead0 > expb) // too small to normalize
81. begin
82. expn = 0; // set to 0
83. fracn = 0;
84. end
85. else
86. begin
87. expn = expb - lead0;
88. fracn = sum_norm;
89. end
90.
91. // form output
92. sign_out = signb;
93. exp_out = expn;
94. frac_out = fracn;
95. end
96.
97. endmodule

 Mô phỏng:

Hình 1.36. Mô phỏng bộ Simplified floating-point adder

 Mạch RTL:

Hình 1.37. Mạch RTL của Simplified floating-point adder


43
CHƯƠNG 2: CÁC VÍ DỤ TRONG CHƯƠNG 4

2.1. DFF without reset asynchronous


 Verilog Code:
1. module d_ff
2. (
3. input wire clk,
4. input wire d,
5. output reg q
6. );
7. // body
8. always @(posedge clk)
9. q <= d;
10. endmodule

 Khối DUT và bảng nguyên lý:

Hình 2.1. Khối DUT và bảng nguyên lý của DFF

 Kết quả mô phỏng:

Hình 2.2. Mô phỏng bộ DFF

44
 Giải thích:
DFF được điều kiển dựa trên sự xuất hiện sườn lên của xung clock. Khi có sườn
lên xung clock. q từ giá trị không xác định được đưa vào giá trị của d. Ta có thể nhận
thấy rằng từ 10ps trở đi thì xung q trễ so với sung d 20 ps.

2.2. DFF with reset asynchronous


 Code Verilog:

1. module d_ff_reset
2. (
3. input wire clk, reset,
4. input wire d,
5. output reg q
6. );
7. // body
8. always @(posedge clk, posedge reset)
9. if (reset)
10. q <= 1'b0;
11. else
12. q <= d;
13. endmodule

 Khối DUT và bảng nguyên lý:

Hình 2.3. Khối DUT và bảng nguyên lý DFF with reset asynchronous

45
 Kết quả mô phỏng:

Hình 2.4. Mô phỏng bộ DFF with reset asynchronous

 Giải thích:
Khi reset = 1 thì q* = 0 mặc dù có sườn lên xung clock hay không.
Khi reset = 0 thì đợi sườn lên xung clock thì q* = d và trong trường hợp này thì
nó giống hệt với dff không có reset không đồng bộ.

2.3. DFF with enable synchronous


 Code Verilog:

1. module d_ff_en_1seg
2. (
3. input wire clk, reset,
4. input wire en,
5. input wire d,
6. output reg q
7. );
8. // body
9. always O(posedge clk, posedge reset)
10. if (reset)
11. q <= 1'b0;
12. else if (en)
13. q <= d;
14. endmodule

 Khối DUT và bảng nguyên lý:

Hình 2.5. Khối DUT và bảng nguyên lý DFF with enable synchronous

46
 Kết quả mô phỏng:

Hình 2.6. Mô phỏng bộ DFF with enable synchronous

 Giải thích:
Khi reset = 1 thì không quan tâm đến sườn lên clk hay en, q* = 0.
Khi reset = 0:
o Gặp sườn lên nhưng en = 0 thì q giữ giá trị trước đó q* = 0
o Gặp sườn lên nhưng en = 1 thì q* = d, nó cũng giống hệt với dff không có
reset không đồng bộ.

2.4. Register
 Code Verilog:

1. module reg_reset
2. (
3. input wire clk, reset,
4. input wire [7:0] d,
5. output reg [7:0] q
6. );
7. // body
8. always @ (posedge clk, posedge reset)
9. if (reset)
10. q <= 0;
11. else
12. q <= d;
13. endmodule

47
 Khối DUT:

clk
8
Register q
8
d

reset
Hình 2.7. Khối DUT bộ Register

 Kết quả mô phỏng:

Hình 2.8. Mô phỏng bộ Register

 Giải thích:

Khi reset = 1 (tại sườn lên reset) thì q* = 8’b00000000.

Khi reset = 0 xét sườn lên clock q* = d.

2.5. Register file


 Code Verilog:

1. module reg_file
2. #(
3. parameter B = 8, // number of bits
4. W = 2 // number of address bits
5. )
6. (
7. input wire clk,
8. input wire wr_en,
9. input wire [W-1:0] w_addr, r_addr,
10. input wire [B-1:0] w_data,
11. output wire [B-1:0] r_data
12. );
13.
14. // signal declaration
15. reg [B-1:0] array_reg [2**W-1:0];
16.

48
17. // body
18. // write operation
19. always @(posedge clk)
20. if (wr_en)
21. array_reg [w_addr] <= w_data;
22. // read operation
23. assign r_data = array_reg [r_addr];
24. Endmodule

 Khối DUT:

clk
wr_en
8
2 Register
w_ad
File r_data
ddr 2
r_add
r
8
w_da
ta

Hình 2.9. Khối DUT bộ Register file

 Kết quả mô phỏng:

Hình 2.10. Mô phỏng bộ Register file

 Giải thích:

Khi wr_en = 0 thì r_data = x (không xác định) vì tại thời điểm này ta chưa ghi dữ
liệu nào vào thanh ghi.

Khi wr_en = 1 thì đợi sườn lên của xung clock dữ liệu sẽ được ghi vào ô nhớ có
địa chỉ tại thời gian xung này, và sau đó được đọc tương ứng cũng tại ô nhớ có địa chỉ
tương ứng.

49
2.6. Free-running shift register
 Mạch dịch giá trị đầu vào về trái hoặc phải 1 vị trí tại mỗi chu kì xung nhịp.
Không có tín hiệu điều khiển nào khác.
 Đầu vào: xung clock, tín hiệu reset, dữ liệu đưa vào.
 Đầu ra: dữ liệu bị dịch khỏi thanh ghi.
 Mã nguồn:
1. // Listing 4.7
2. module free_run_shift_reg
3. #(parameter N=8)
4. (
5. input wire clk, reset,
6. input wire s_in,
7. output wire s_out
8. );
9.
10. //signal declaration
11. reg [N-1:0] r_reg;
12. wire [N-1:0] r_next;
13.
14. // body
15. // register
16. always @(posedge clk, posedge reset)
17. if (reset)
18. r_reg <= 0;
19. else
20. r_reg <= r_next;
21.
22. // next-state logic
23. assign r_next = {s_in, r_reg[N-1:1]};
24. // output logic
25. assign s_out = r_reg[0];
26.
27. endmodule

 Giải thích: có 3 phần chính


o Phần đồng bộ theo sườn lên của xung clock: cập nhật giá trị lưu trong thanh
ghi tại mỗi sườn lên, hoặc reset về 0 khi có tín hiệu reset.
o Phần tính giá trị tiếp theo cho thanh ghi: ghép bit đầu vào cùng với (N-1)
bit trái cùng của dữ liệu đang lưu trong thanh ghi.
o Phần tính đầu ra: là bit phải cùng trong thanh ghi.

50
 Mô phỏng:

Hình 2.11. Mô phỏng Free-running shift register

 Mạch RTL:

Hình 2.12. Mạch RTL của bộ Free-running shift register

2.7. Universal shift register


 Đây là mạch thanh ghi dịch phức tạp hơn, có các chức năng : load dữ liệu song
song vào thanh ghi, dịch trái hoặc phải, hoặc giữ nguyên giá trị.
 Đầu vào: clock, reset, 2 bit tín hiệu điều khiển ctrl [1:0], dữ liệu N bit cần load
vào thanh ghi d[N-1:0].
 Đầu ra: N bit q [N-1:0].
 Mã nguồn:
1. // Listing 4.8
2. module univ_shift_reg
3. #(parameter N=8)
4. (

51
5. input wire clk, reset,
6. input wire [1:0] ctrl,
7. input wire [N-1:0] d,
8. output wire [N-1:0] q
9. );
10.
11. //signal declaration
12. reg [N-1:0] r_reg, r_next;
13.
14. // body
15. // register
16. always @(posedge clk, posedge reset)
17. if (reset)
18. r_reg <= 0;
19. else
20. r_reg <= r_next;
21.
22. // next-state logic
23. always @*
24. case(ctrl)
25. 2'b00: r_next = r_reg; // no op
26. 2'b01: r_next = {r_reg[N-2:0], d[0]}; // shift left
27. 2'b10: r_next = {d[N-1], r_reg[N-1:1]}; // shift right
28. default: r_next = d; // load
29. endcase
30. // output logic
31. assign q = r_reg;
32.
33. endmodule

 Giải thích:
o Phần đồng bộ theo sườn lên của xung clock: cập nhật giá trị lưu trong thanh
ghi tại mỗi sườn lên, hoặc reset về 0 khi có tín hiệu reset.
o Phần tính giá trị tiếp theo cho thanh ghi: dựa vào tín hiệu điểu khiển ctrl:
 Nếu ctrl == ‘00’: giữ nguyên giá trị hiện tại.
 Nếu ctrl == ‘01’: dịch trái 1 bit.
 Nếu ctrl == ‘10’: dịch phải 1 bit.
 Nếu ctrl == ‘11’: load giá trị d vào thanh ghi.
o Phần tính đầu ra: chính là giá trị của thanh ghi.

52
 Mô phỏng:

Hình 2.13. Mô phỏng bộ Universal shift register

 Mạch RTL:

Hình 2.14. Mạch RTL bộ Universal shift register

53
2.8. Free-Runing Binary Counter
 Yêu cầu : Mạch rãy đếm từ 0 đến (2N – 1) theo sườn lên của xung nhịp Clock với
mọi N.
 Thuật toán :

Reset, Clk

q=0 Yes Reset = 1? No Posedge Clk? No q=q

Yes

q=q+1

q = (2^N - 1)?

No
Yes

Max_tick= 0 Max_tick= 1

Hình 2.15. Sơ đồ thuật toán bộ Free-Runing Binary Counter

 Giải thích : Các khối cần thiết là 1 khối Register, 1 khối Adder, 1 khối Compare,
đầu ra sẽ bằng 0 khi có tín hiệu lên của Reset và bắt đầu đếm khi có sườn lên của
xung nhịp.
 Từ sơ đồ thuật toán, ta có Verilog Code :

1. module free_run_bin_counter
2. #(parameter N=8)
3. (
4. input wire clk, reset,
5. output wire max_tick,
6. output wire [N-1:0]q
7. );
8. // signal declaration

54
9. reg [N-1:0]r_reg;
10. wire [N-1:0]r_next;
11. // body
12. // register
13. always @(posedge clk, posedge reset)
14. if(reset)
15. r_reg <= 0; // { N{lb'0}}
16. else
17. r_reg <= r_next;
18.
19. // next state logic
20. assign r_next = r_reg + 1;
21.
22. // output logic
23. assign q = r_reg;
24.
25. assign max_tick = (r_reg == 2**N-1) ? 1'b1 : 1'b0;
26. // can also use (r_reg== N ((l'bl)))
27. endmodule
 Mô phỏng :

Hình 2.16. Mô phỏng bộ Free-Runing Binary Counter

 Mạch RTL:

Hình 2.17. Mạch RTL bộ Free-Runing Binary Counter

55
2.9. Universal binary counter
 Yêu cầu: Unv_bin_counter là một bộ đếm có nhiều chức năng mở rộng thêm cho
Free-Runing Binary Counter, có 4 chức năng là : Xóa đầu ra về 0, Xóa đầu ra về
giá trị d là đầu vào được định sẵn, đếm tăng, đếm giảm, giữ nguyên trạng thái đầu
ra.
 Bảng chức năng của các tín hiệu:

Syn_clr Load En Up Q*
1 X X X 0
0 1 X X D
0 0 1 1 Q+1
0 0 1 0 Q-1
0 0 0 X Q
Bảng 2.1. Bảng chức năng của bộ Universal binary counter

 Giải thích: Syn_clr là tín hiệu xóa bộ đếm về 0, Load là tín hiệu xóa bộ đếm về
giá trị D đầu vào có trước, (En&Up) là tín hiệu đếm tăng, (En&~Up) là tín hiệu
đếm giảm, (En = 0) là tín hiệu giữ nguyên trạng thái và đây là tín hiệu không đồng
bộ!
Max_Tick là một tín hiệu ra và bằng 1 khi Q đạt giá trị max là (2N-1).
Min_Tick là một tín hiệu ra và bằng 1 khi Q đạt giá trị min là 0.
 Từ bảng chức năng và giải thích, ta có code của Unv_bin_counter:

1. module univ_bin_counter
2. #(parameter N=8)
3. (
4. input wire clk, reset,
5. input wire syn_clr, load, en, up,
6. input wire [N-1:0]d,
7. output wire max_tick, min_tick,
8. output wire [N-1:0]q
9. );
10. // signal declaration
11. reg [N-1:0] r_reg, r_next;
12. // body
13. // register
14. always @(posedge clk, posedge reset)

56
15. if(reset)
16. r_reg <= 0;
17. else
18. r_reg <= r_next;
19. // next - state logic
20. always @*
21. if(syn_clr)
22. r_next = 0;
23. else if(load)
24. r_next = d;
25. else if(en & up)
26. r_next = r_reg + 1;
27. else if(en & ~up)
28. r_next = r_reg - 1;
29. else
30. r_next = r_reg;
31. // out put logic
32. assign q = r_reg;
33. assign max_tick = (r_reg==2**N-1) ? 1'b1 : 1'b0;
34. assign min_tick = (r_reg==0) ? 1'b1 : 1'b0;
35.
36. endmodule
 Mô phỏng :

Hình 2.18. Mô phỏng bộ Universal binary counter

 Mạch RTL:

Hình 2.19. Mạch RTL bộ Universal binary counter


57
2.10. Mod-m counter
 Yêu cầu: Mod-m counter là mạch Free-Runing Binary Counter với giá trị đếm từ
0 đếm (M-1) và Max_tick = 1 khi Q = (M-1).
 Verilog Code :
1. module mod_m_counter
2. #(parameter N=4,M=10) // mod-M
3. (
4. input wire clk, reset,
5. output wire max_tick,
6. output wire [N-1:0]q
7. );
8. // signal declaration
9. reg [N-1:0]r_reg;
10. wire [N-1:0]r_next;
11.
12. // body
13. // register
14. always @(posedge clk, posedge reset)
15. if(reset)
16. r_reg <= 0;
17. else
18. r_reg <= r_next;
19. // next - state logic
20. assign r_next = (r_reg==(M-1)) ? 0 : r_reg + 1;
21. // output logic
22. assign q = r_reg ;
23. assign max_tick = (r_reg==(M-1)) ? 1'b1 : 1'b0;
24. endmodule
 Mô phỏng :

Hình 2.20. Mô phỏng bộ Mod-m counter

 Mạch RTL:

Hình 2.21. Mô phỏng bộ Mod-m counter


58
DANH MỤC TÀI LIỆU THAM KHẢO

[1] P. P.Chu, FPGA Prototyping By Verilog Examples.

59

You might also like