2 1.2 Viết mã Verilog HDL RTL và testbench.. 3 2.2 Viết mã Verilog HDL và testbench.. 5 3.2 Viết mã Verilog HDL và testbench.. 7 4.2 Viết mã verilog HDL RTL và testbench cho thiết kế...
Trang 1THÍ NGHIỆM THIẾT KẾ LUẬN LÝ (CO1026)
TUẦN 2: Mạch logic tổ hợp
Lớp L04 - Nhóm 3
TP Hồ Chí Minh, Tháng 3/2023
Trang 2Mục lục
1.1 Đề bài 2 1.2 Viết mã Verilog HDL RTL và testbench 2 1.3 Mô phỏng trên Arty-Z7 3
2.1 Đề bài 3 2.2 Viết mã Verilog HDL và testbench 3 2.3 Mô phỏng trên Arty-Z7 4
3.1 Đề bài 5 3.2 Viết mã Verilog HDL và testbench 5 3.3 Mô phỏng trên Arty-Z7 7
4.1 Đề bài 7 4.2 Viết mã verilog HDL RTL và testbench cho thiết kế 8 4.3 Mô phỏng trên Arty-Z7 10
Trang 31 Exercise 1:
Thiết kế một mạch có một đầu vào 4 bit và một đầu ra 4 bit với các chức năng như sau (tất cả các đầu
ra đều ở mức cao):
• Đầu ra 0: hoạt động khi có số chẵn bit 1 trong đầu vào.
• Đầu ra 1: tích cực khi chỉ có 1 bit 1 ở đầu vào.
• Đầu ra 2: tích cực khi không có bit 1 ở đầu vào.
• Đầu ra 3: hoạt động khi tất cả các bit trong đầu vào là 1.
Ta có mã verilog HDL RTL cho thiết kế:
1 m o d u l e e x e r c i s e 1 (
2 o u t p u t reg [ 3 : 0 ] out ,
3 i n p u t [ 3 : 0 ] in
4 ) ;
5 a l w a y s @ ( in )
6 b e g i n
9
10 if ( in == 4 ’ b 1 0 0 0 || in == 4 ’ b 0 1 0 0 || in == 4 ’ b 0 0 1 0 || in == 4 ’ b 0 0 0 1 )
12 e l s e
14
15 if (~| in == 1 ’ b1 ) out [2] <= 1 ’ b1 ;
16 e l s e out [2] <= ~1 ’ b1 ;
17
18 if (& in == 1 ’ b1 ) out [3] <= 1 ’ b1 ;
19 e l s e out [3] <= ~1 ’ b1 ;
20 end
21 e n d m o d u l e
Ta có testbench mô phỏng thiết kế:
1 ‘ t i m e s c a l e 1 ns / 1 ps
2 m o d u l e w e e k 2 _ 1 _ t b ;
3 reg [ 3 : 0 ] in ;
4 w i r e [ 3 : 0 ] out ;
5
6 w e e k 2 _ 1 t e s t ( in ( in ) , out ( out ) ) ;
7
8 i n i t i a l b e g i n
9 $ m o n i t o r(" % t : in : % b , out : % b ", $time , in , out ) ;
10 end
11
12 i n i t i a l b e g i n
13 in <= 4 ’ b 0 0 0 0 ;
14 #10 in <= 4 ’ b 0 0 0 1 ;
15 #10 in <= 4 ’ b 0 0 1 0 ;
16 #10 in <= 4 ’ b 0 0 1 1 ;
17 #10 in <= 4 ’ b 0 1 0 0 ;
18 #10 in <= 4 ’ b 0 1 0 1 ;
19 #10 in <= 4 ’ b 0 1 1 0 ;
20 #10 in <= 4 ’ b 0 1 1 1 ;
21 #10 in <= 4 ’ b 1 0 0 0 ;
22 #10 in <= 4 ’ b 1 0 0 1 ;
23 #10 in <= 4 ’ b 1 0 1 0 ;
24 #10 in <= 4 ’ b 1 0 1 1 ;
25 #10 in <= 4 ’ b 1 1 0 0 ;
26 #10 in <= 4 ’ b 1 1 0 1 ;
27 #10 in <= 4 ’ b 1 1 1 0 ;
28 #10 in <= 4 ’ b 1 1 1 1 ;
29 #10 $ s t o p ;
30 end
Trang 432
33 e n d m o d u l e
Ta có kết quả in ra (sử dụng monitor):
Hình 1: Kết quả in ra
Sau khi chạy simulation ta được kết quả như sau:
Hình 2: Kết quả mô phỏng mạch
Clip mô phỏng trên Arty-Z7 board
Thiết kế mạch tạo tín hiệu đầu ra 1 Hz bằng mô hình cấu trúc Tín hiệu này kết nối với LED trên Bo mạch FPGA Arty-Z7 để nhấp nháy (bật 0.5s - tắt 0.5s) Biết rằng tần số xung nhịp đầu vào là 125 MHz
và FlipFlop có thể bao gồm từ thư viện Vivado.
Ta có mã verilog HDL RTL cho thiết kế:
1 m o d u l e f r e q _ d i v i d e r (
2 i n p u t clk , reset ,
3 o u t p u t reg led
4 ) ;
5 p a r a m e t e r d i v i s o r = 125 _ 0 0 0 _ 0 0 0 ; // 27 D f l i p f l o p
Trang 56 p a r a m e t e r m = d i v i s o r /2;
7 i n t e g e r c o u n t ;
8
9 a l w a y s @ (p o s e d g e reset , n e g e d g e clk )
10 b e g i n
11 if ( r e s e t == 1)
12 b e g i n
16 e l s e
17 b e g i n
23 e l s e c o u n t <= c o u n t + 1;
25 end
26 e n d m o d u l e
Ta có testbench mô phỏng thiết kế, bởi vì chia tần số cho 125.000.000 là một con số quá lớn để có thể quan sát trển biểu đồ dạng sóng, nhóm mô phỏng với mạch chia tần số cho 10:
1 ‘ t i m e s c a l e 1 ns / 0 0 1 ns
2 m o d u l e t e s t _ f r e q _ d i v i d e r ;
3 reg clk , r e s e t ;
4 w i r e led ;
5
6 f r e q _ d i v i d e r #( d i v i s o r ( 1 0 ) ) div ( clk , reset , led ) ;
7
8 i n i t i a l
9 b e g i n
12 r e s e t = # 0 1 0;
13 end
14
15 a l w a y s clk = # 0 1 ~ clk ;
16
17 i n i t i a l
18 b e g i n
19 $ m o n i t o r (" led = % b ", led ) ;
20 # 1 0 0 $ f i n i s h;
21 end
22 e n d m o d u l e
Sau khi simulation ta được kết quả như sau:
Hình 3: Kết quả mô phỏng mạch
Clip mô phỏng trên Arty-Z7 board
Trang 63 Exercise 3:
Thiết kế bộ giải mã LED 7 đoạn sẽ chấp nhận đầu vào 4 bit và tạo đầu ra 7 bit.
• Tên module: bin2led7(enable, bin in, led out);
• Tín hiệu enable điều khiển đèn LED Nếu enable = 0, đèn LED sẽ tắt.
• Bin_in là tín hiệu đầu vào nhị phân 4 bit.
• Led_out là tín hiệu ra 7 bit cho LED 7 thanh hiển thị.
Hình 4: LED 7 đoạn
Hình 5: Mạch led 7 đoạn anode chung
Ta có mã verilog HDL cho thiết kế:
1 m o d u l e b i n 2 l e d 7 ( enable , bin_in , l e d _ o u t ) ;
2 i n p u t e n a b l e ;
3 i n p u t [ 3 : 0 ] b i n _ i n ;
4 o u t p u t reg [ 6 : 0 ] l e d _ o u t ;
5
6 a l w a y s @ ( enable , b i n _ i n )
7 b e g i n
8 if ( e n a b l e == 1 ’ b0 ) l e d _ o u t <= 7 ’ b 1 1 1 1 1 1 1 ;
Trang 79 e l s e
10 c a s e ( b i n _ i n )
11 0: l e d _ o u t <= ~7 ’ b 1 1 1 1 1 1 0 ;
12 1: l e d _ o u t <= ~7 ’ b 0 1 1 0 0 0 0 ;
13 2: l e d _ o u t <= ~7 ’ b 1 1 0 1 1 0 1 ;
14 3: l e d _ o u t <= ~7 ’ b 1 1 1 1 0 0 1 ;
15 4: l e d _ o u t <= ~7 ’ b 0 1 1 0 0 1 1 ;
16 5: l e d _ o u t <= ~7 ’ b 1 0 1 1 0 1 1 ;
17 6: l e d _ o u t <= ~7 ’ b 1 0 1 1 1 1 1 ;
18 7: l e d _ o u t <= ~7 ’ b 1 1 1 0 0 0 0 ;
19 8: l e d _ o u t <= ~7 ’ b 1 1 1 1 1 1 1 ;
20 9: l e d _ o u t <= ~7 ’ b 1 1 1 1 0 1 1 ;
21 d e f a u l t: l e d _ o u t <= 7 ’ b 1 1 1 1 _ 1 1 1 ;
22 e n d c a s e
23 end
24 e n d m o d u l e
Ta có testbench mô phỏng thiết kế:
1 ‘ t i m e s c a l e 1 ns / 1 ps
2 m o d u l e b i n 2 l e d 7 _ t b ;
3 reg e n a b l e ;
4 reg [ 3 : 0 ] b i n _ i n ;
5 w i r e [ 6 : 0 ] l e d _ o u t ;
6 b i n 2 l e d 7 t e s t ( e n a b l e ( e n a b l e ) , b i n _ i n ( b i n _ i n ) , l e d _ o u t ( l e d _ o u t ) ) ;
7 i n i t i a l b e g i n
8 $ m o n i t o r(" % t : e n a b l e : % b , b i n _ i n : % b , l e d _ o u t : % b , ( % d ) ", $time , enable , bin_in , l ed _ ou t , b i n _ i n ) ;
9 end
10 i n i t i a l b e g i n
11 { enable , b i n _ i n } <= 5 ’ b 0 _ 0 0 0 0 ;
12 #10 { enable , b i n _ i n } <= 5 ’ b 0 _ 0 0 0 1 ;
13 #10 { enable , b i n _ i n } <= 5 ’ b 0 _ 0 0 1 0 ;
14 #10 { enable , b i n _ i n } <= 5 ’ b 0 _ 0 0 1 1 ;
15 #10 { enable , b i n _ i n } <= 5 ’ b 0 _ 0 1 0 0 ;
16 #10 { enable , b i n _ i n } <= 5 ’ b 0 _ 0 1 0 1 ;
17 #10 { enable , b i n _ i n } <= 5 ’ b 0 _ 0 1 1 0 ;
18 #10 { enable , b i n _ i n } <= 5 ’ b 0 _ 0 1 1 1 ;
19 #10 { enable , b i n _ i n } <= 5 ’ b 0 _ 1 0 0 0 ;
20 #10 { enable , b i n _ i n } <= 5 ’ b 0 _ 1 0 0 1 ;
21 #10 { enable , b i n _ i n } <= 5 ’ b 1 _ 0 0 0 0 ;
22 #10 { enable , b i n _ i n } <= 5 ’ b 1 _ 0 0 0 1 ;
23 #10 { enable , b i n _ i n } <= 5 ’ b 1 _ 0 0 1 0 ;
24 #10 { enable , b i n _ i n } <= 5 ’ b 1 _ 0 0 1 1 ;
25 #10 { enable , b i n _ i n } <= 5 ’ b 1 _ 0 1 0 0 ;
26 #10 { enable , b i n _ i n } <= 5 ’ b 1 _ 0 1 0 1 ;
27 #10 { enable , b i n _ i n } <= 5 ’ b 1 _ 0 1 1 0 ;
28 #10 { enable , b i n _ i n } <= 5 ’ b 1 _ 0 1 1 1 ;
29 #10 { enable , b i n _ i n } <= 5 ’ b 1 _ 1 0 0 0 ;
30 #10 { enable , b i n _ i n } <= 5 ’ b 1 _ 1 0 0 1 ;
31 #10 $ s t o p ;
32 end
33 e n d m o d u l e
Ta có kết quả in ra (sử dụng monitor):
Trang 8Hình 6: Kết quả in ra
Sau khi chạy simulation ta được kết quả như sau:
Hình 7: Kết quả mô phỏng mạch
Clip mô phỏng trên Arty-Z7 board
Thiết kế mạch điều khiển các LED RGB trên board Arty-Z7 như sau:
• Công tắc 0: chọn chế độ hiển thị - 1 LED hoặc 2 LED.
• Công tắc 1:
– để chọn đèn LED trái hoặc phải ở chế độ hiển thị 1 đèn LED.
– để chọn mã màu như bảng bên dưới.
• Các nút: chọn màu.
Trang 9Hình 8: Bảng mã màu
Ta có mã verilog HDL RTL cho thiết kế:
1 m o d u l e ex4 (
2 i n p u t [ 3 : 0 ] b u tt on s ,
3 i n p u t sw0 , sw1 ,
4 o u t p u t reg [ 2 : 0 ] l e d 1 , l e d 2
5 ) ;
6 // 0: b l u e 1: g r e e n 2: red
7 a l w a y s @ ( b ut to n s , sw0 , sw1 ) b e g i n
8 if( sw0 = = 1 ) b e g i n
10 c a s e( b u t t o n s )
31 d e f a u l t: b e g i n
37 e l s e b e g i n
38 c a s e( b u t t o n s )
Trang 1050 end
55 d e f a u l t: b e g i n
62 e l s e b e g i n
66 c a s e( b u t t o n s )
72 d e f a u l t: l e d 1 <= 3 ’ b 0 0 0 ;
78 c a s e( b u t t o n s )
84 d e f a u l t: l e d 2 <= 3 ’ b 0 0 0 ;
89 e n d m o d u l e
Ta có testbench mô phỏng thiết kế:
1 ‘ t i m e s c a l e 1 ns / 1 ns
2
3 m o d u l e e x 4 _ t b ;
4 reg [ 3 : 0 ] b u t t o n s ;
5 reg sw0 , sw1 ;
6 w i r e [ 2 : 0 ] led1 , l e d 2 ;
7 ex4 tb ( b u t t o n s ( b u t t o n s ) , sw0 ( sw0 ) , sw1 ( sw1 ) , l e d 1 ( l e d 1 ) , l e d 2 ( l e d 2 ) ) ;
8 i n i t i a l b e g i n
9 $ m o n i t o r(" t i m e % t : b u t t o n s = % b , sw0 = % b , sw1 = % b , l e d 1 = % b , l e d 2 = % b \ n
", $time , b ut t on s , sw0 , sw1 , led1 , l e d 2 ) ;
11 i n i t i a l b e g i n
12 { bu t to n s , sw0 , sw1 } <= 6 ’ b 0 0 0 1 _ 1 _ 0 ;
13 #10 { b u tt o ns , sw0 , sw1 } <= 6 ’ b 0 0 1 0 _ 1 _ 0 ;
14 #10 { b u tt o ns , sw0 , sw1 } <= 6 ’ b 0 1 0 0 _ 1 _ 0 ;
15 #10 { b u tt o ns , sw0 , sw1 } <= 6 ’ b 1 0 0 0 _ 1 _ 0 ;
16 #10 { b u tt o ns , sw0 , sw1 } <= 6 ’ b 0 0 0 0 _ 1 _ 0 ;
17 #10 { b u tt o ns , sw0 , sw1 } <= 6 ’ b 0 0 0 1 _ 0 _ 0 ;
18 #10 { b u tt o ns , sw0 , sw1 } <= 6 ’ b 0 0 1 0 _ 0 _ 0 ;
19 #10 { b u tt o ns , sw0 , sw1 } <= 6 ’ b 0 1 0 0 _ 0 _ 0 ;
20 #10 { b u tt o ns , sw0 , sw1 } <= 6 ’ b 1 0 0 0 _ 0 _ 0 ;
21 #10 { b u tt o ns , sw0 , sw1 } <= 6 ’ b 0 0 0 0 _ 0 _ 0 ;
22 #10 { b u tt o ns , sw0 , sw1 } <= 6 ’ b 0 0 0 0 _ 1 _ 1 ;
23 #10 { b u tt o ns , sw0 , sw1 } <= 6 ’ b 0 0 0 1 _ 1 _ 1 ;
24 #10 { b u tt o ns , sw0 , sw1 } <= 6 ’ b 0 0 1 0 _ 1 _ 1 ;
25 #10 { b u tt o ns , sw0 , sw1 } <= 6 ’ b 0 1 0 0 _ 1 _ 1 ;
26 #10 { b u tt o ns , sw0 , sw1 } <= 6 ’ b 1 0 0 0 _ 1 _ 1 ;
27 #10 $ s t o p ;
Trang 1129 e n d m o d u l e
Ta có kết quả in ra (sử dụng minitor):
Hình 9: Kết quả in ra
Sau khi chạy simulation ta được kết quả như sau:
Hình 10: Kết quả mô phỏng mạch
Clip mô phỏng trên Arty-Z7 board