Professional Documents
Culture Documents
ICDegin Report
ICDegin Report
*******
Hà Nội, 11/2018
MỤC LỤC
MỤC LỤC ........................................................................................................................ 3
3
2.2. DFF with reset asynchronous ........................................................................... 45
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 :
+D-flipflop, Register.
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ế :
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.
9
+Counter (Free-Runing Binary Counter, Universal
binary counter, Mod-m counter).
10
CHƯƠNG 1: CÁC VÍ DỤ TRONG CHƯƠNG 3
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:
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:
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
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:
Mạch RTL:
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
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:
Mô phỏng TestBench
Mô phỏng Testbench
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
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:
20
Kết quả mô phỏng đúng:
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:
21
Hình 1.12. Mô phỏng mạch And 3 đầu vào lỗi
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:
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
23
Khối DUT:
4 Encoder 3
r y
(DUT)
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
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
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. 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
en a y
0 xx 0000
1 00 0001
1 01 0010
1 10 0100
1 11 1000
Thiết kế mạch :
26
Khối DUT :
en Decoder
2 to 4 4
2 y
a (has en)
(DUT)
Giải thích :
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:
o Mạch RTL:
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
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
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:
Mạch RTL:
32
1.9. Adder using parameter
Sơ đồ khối:
A[N-1:0] Sum = sum_ext[N-1:0]
Đâ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:
4-bit adder
B[3:0] Cout = sum_ext[4]
8-bit adder
B[7:0] Cout = sum_ext[8]
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:
Mạch RTL:
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
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:
37
Mạch RTL:
38
22. endmodule
Mô phỏng:
Mạch RTL:
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:
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.
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:
Mạch RTL:
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.
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
Hình 2.3. Khối DUT và bảng nguyên lý DFF with reset asynchronous
45
Kết quả mô phỏng:
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ộ.
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
Hình 2.5. Khối DUT và bảng nguyên lý DFF with enable synchronous
46
Kết quả mô phỏng:
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
Giải thích:
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
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
50
Mô phỏng:
Mạch RTL:
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:
Mạch RTL:
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
Yes
q=q+1
q = (2^N - 1)?
No
Yes
Max_tick= 0 Max_tick= 1
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 :
Mạch RTL:
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 :
Mạch RTL:
Mạch RTL:
59