Biến nội bộ - Thiết kế mạch phức tạp với các hàm phức tạp Phân chia hàm thành các bước trung gian Sử dụng biến nội bộ - Biến nội bộ không phải là đầu vào hay đầu ra, mà chỉ được sử d
Trang 1ĐẠI HỌC QUỐC GIA HÀ NỘI
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ
BÁO CÁO THỰC HÀNH
MÔN THIẾT KẾ SỐ VÀ VI XỬ LÝ
BUỔI 3+4
Giảng viên hướng dẫn: KS Dương Minh Ngọc
Họ và tên sinh viên: Trần Duy Long – 22029071
Phạm Thu Hằng - 21021580 Lớp: ELT3290 59
HÀ NỘI – 2024
Trang 21 Lý thuyết
1.1 Mô hình cấu trúc
- Mạch phức tạp -> Sử dụng mô hình cấu trúc.
- Mô hình cấu trúc: mô tả một mô-đun dựa trên cách mà nó được kết hợp từ các
mô-đun đơn giản hơn
1.2 Biến nội bộ
- Thiết kế mạch phức tạp với các hàm phức tạp
Phân chia hàm thành các bước trung gian
Sử dụng biến nội bộ
- Biến nội bộ không phải là đầu vào hay đầu ra, mà chỉ được sử dụng bên trong
mô-đun; tương tự như biến cục bộ trong các ngôn ngữ lập trình
1.3 Phép gán:
Phépgánliêntục
Phépgánkhóa
Phépgánkhôngkhóa
Cậpnhậtvếtráichovếphải
Ngaylậptức
Ngaylậptức
Vàocuốibướcthờigianhiệntại,thườn
g làtạicạnhxungđồnghồThứ tự
thựchiệncáccâulệnh
Đồngthời Theothứ tự Đồngthời
Dùng để
thiếtkế
Mạch tổhợpđơngiản
Mạch tổhợp
Mạchtuầntự
Trang 3- Các câu lệnh trong câu lệnh always chỉ được chạy khi sự kiện được chỉ định
trong sensitivity list xảy ra
- câu lệnh always có thể được sử dụng để thiết kế flip-flop, latches hoặc mạch tổ
hợp tùy thuộc vào sensitivity list và câu lệnh
- Các loại câu lệnh always:
+ always@(sensitivity list) có thể được sử dụng để thiết kế mạch tuần tự hoặc tổhợp dựa trên sensitivity list
+ always_comb: dành riêng cho việc thiết kế mạch tổ hợp; đánh giá lại các câulệnh bên trong always_comb bất kỳ lúc nào tín hiệu ở vế phải của câu lệnh thayđổi
+ always_latch dành riêng cho thiết kế latch
+ always_ff dành riêng cho thiết kế flip flop
1.5 Mảng đóng gói và mảng không đóng gói
Đặc điểm Mảng đóng gói Mảng khôngđóng gói
Khai báo
Kích thước/chiềunằm bên trái tên biến
Ví dụ: logic [3:0]
data_bus (4 bit được đóng gói với nhau)
Kích thước/chiềunằm bên phải tên biến
Ví dụ: logic flag[3:0] (4 biến logic 1-bit độc lập)Lưu trữ Khối bit liền kề
(gọn trong bộ
Các thành phần độc lập
Trang 4trong bộ nhớ)
Sử dụng
Biểu diễn dữ liệu
đa bit như vecto, bus
Biểu diễn các biến độc lập (như mảng)Các phép
toán bitwise Có hỗ trợ
Không trực tiếp
hỗ trợ (cần truy cập riêng mỗi biến)Các phép
tính số học
Có hỗ trợ (coi toàn mảng là một số)
Không trực tiếp
hỗ trợ cả mảng
1.6 Số trong SystemVerilog
- Định dạng để khai báo hằng số là N'Bvalue, trong đó N là kích thước tính
bằng bit, B chỉ cơ số và value cho biết giá trị
Ví dụ: 9'h25 biểu thị số có 9 bit với giá trị là 25(cơ số 16) = 37(cơ số 10) =
0001001012 (cơ số 2)
- SystemVerilog hỗ trợ 'b cho nhị phân, 'o cho bát phân, 'd cho thập phân và 'h
cho thập lục phân Nếu cơ số bị bỏ qua, nó sẽ mặc định là thập phân
1.7 Câu lệnh if-else
- Cú pháp:
if (dieu_kien) begin
// Doan ma chay neu dieu kien dung
end else begin
// Doan ma chay neu dieu kien sai
Trang 52.1 Bài 1: Thiết kế bộ ghép kênh 4:1 sử dụng bộ ghép kênh 2:1 trong
SystemVerilog, mô phỏng trên ModelSim và thử nghiệm hoạt động của thiết kếtrên bảng mạch DE-10
- Đoạn mã thiết kế:
module mux2_1 (input logic a, b, sel, output logic y);
assign y = sel ? b : a;
endmodule
module mux4_1 (input logic in1, in2, in3, in4, sel0, sel1, output logic y);
logic low, high;
mux2_1 muxhigh(in3, in4, sel1, high);
Trang 6mux2_1 muxlow(in1, in2, sel1, low);
mux2_1 muxfinal(low, high, sel0, y);
endmodule
- Testbench:
module mux4_1_tb();
logic in4, in3, in2, in1;
logic sel1, sel0;
case ({sel1, sel0})
0 : assert (y == in1) else $error ("in4 = %b, in3 = %b, in2 = %b, in1 = %b sel1 =
%b, sel0 = %b failed", in4, in3, in2, in1, sel1, sel0);
1 : assert (y == in2) else $error ("in4 = %b, in3 = %b, in2 = %b, in1 = %b sel1 =
%b, sel0 = %b failed", in4, in3, in2, in1, sel1, sel0);
2 : assert (y == in3) else $error ("in4 = %b, in3 = %b, in2 = %b, in1 = %b sel1 =
%b, sel0 = %b failed", in4, in3, in2, in1, sel1, sel0);
3 : assert (y == in4) else $error ("in4 = %b, in3 = %b, in2 = %b, in1 = %b sel1 =
%b, sel0 = %b failed", in4, in3, in2, in1, sel1, sel0);
endcase
Trang 7- Mô phỏng trên ModelSim
- Thử nghiệm trên bảng mạch STEP MAX-10
- Giải thích kết quả thử nghiệm:
Trong thực nghiệm này ta gắn input a, b, c, d lần lượt với các switch 1, 2, 3, 4
và 2 sel1 và sel2 ta gắn với 2 button là button 1 và 2 cùng với đó output e tagắn cho led 1
Khi ta không bấm vào các button nó sẽ mặc định là 11 và nó sẽ lấy lối ra led 1dựa vào switch 4 và khi switch 4 ở giá trị 0( hay off) đèn led sẽ sáng(biểu thịcho giá trị 0)(hình bên trái) Khi switch 4 ở giá trị 1(hay on) đèn led sẽ tắt(biểuthị cho giá trị 1)(hình bên phải)
Trang 8 Khi ta bấm cả 2 button cùng lúc thì mạch sẽ hiểu là ta muốn giá trị led1 dựatheo switch 1(00)(khi bấm button sẽ chuyển từ dạng 1 về 0) khi switch 1 ở giátrị 0( hay off) đèn led sẽ sáng(biểu thị cho giá trị 0)(hình bên trái) Khi switch
1 ở giá trị 1(hay on) đèn led sẽ tắt(biểu thị cho giá trị 1)(hình bên phải)
Trang 9 Khi ta chỉ bấm button 1 thì mạch sẽ hiểu là ta muốn giá trị led1 dựa theoswitch 2(01) (khi bấm button sẽ chuyển từ dạng 1 về 0) khi switch 2 ở giá trị0( hay off) đèn led sẽ sáng(biểu thị cho giá trị 0)(hình bên trái) Khi switch 2 ởgiá trị 1(hay on) đèn led sẽ tắt(biểu thị cho giá trị 1)(hình bên phải).
Khi ta chỉ bấm button 2 thì mạch sẽ hiểu là ta muốn giá trị led1 dựa theoswitch 3(10) (khi bấm button sẽ chuyển từ dạng 1 về 0) khi switch 3 ở giá trị0( hay off) đèn led sẽ sáng(biểu thị cho giá trị 0)(hình bên trái) Khi switch 3 ởgiá trị 1(hay on) đèn led sẽ tắt(biểu thị cho giá trị 1)(hình bên phải)
Trang 102.2 Bài 2: Thiết kế bộ full adder sử dụng biến nội bộ và phép gán liên tục trong
SystemVerilog, mô phỏng trên ModelSim và thử nghiệm hoạt động của thiết kếtrên bảng mạch STEP MAX-10
Trang 11- Mô phỏng trên ModelSim
- Thử nghiệm trên bảng mạch STEP MAX-10
- Giải thích kết quả thử nghiệm:
Trong thực nghiệm này ta gắn input A, B, Cin lần lượt với các switch 1, 2, 3
và output S, Cout ta gắn cho led 1, 2
Khi lối vào A, B, Cin đều có giá trị bằng 1 ( hay switch 1,2,3 đều có giá trị là1(ON) ) thì đèn led 1,2(hay lối ra S,Cout) đều sẽ tắt(biểu thị cho giá trị bằng 1)
Trang 12 Khi switch 1 OFF(hay có giá trị bằng 0) và switch 2,3 ON(hay có giá trị bằng1) thì led 1 sẽ sáng(biểu thị cho giá trị bằng 0) và led 2 sẽ tắt (biểu thị cho giátrị bằng 1)
Khi switch 2 OFF(hay có giá trị bằng 0) và switch 1,3 ON(hay có giá trị bằng1) thì led 1 sẽ sáng(biểu thị cho giá trị bằng 0) và led 2 sẽ tắt (biểu thị cho giátrị bằng 1)
Trang 13 Khi switch 1,2 OFF(hay có giá trị bằng 0) và switch 3 ON(hay có giá trị bằng1) thì led 1 sẽ tắt(biểu thị cho giá trị bằng 1) và led 2 sẽ sáng (biểu thị cho giátrị bằng 0)
Khi switch 1,2 ON(hay có giá trị bằng 1) và switch 3 OFF(hay có giá trị bằng0) thì led 1 sẽ sáng(biểu thị cho giá trị bằng 0) và led 2 sẽ tắt(biểu thị cho giátrị bằng 1)
Trang 14 Khi switch 1,3 OFF(hay có giá trị bằng 0) và switch 2 ON(hay có giá trị bằng1) thì led 1 sẽ tắt(biểu thị cho giá trị bằng 1) và led 2 sẽ sáng(biểu thị cho giátrị bằng 0)
Khi switch 1 ON(hay có giá trị bằng 1) và switch 2,3 OFF(hay có giá trị bằng0) thì led 1 sẽ tắt(biểu thị cho giá trị bằng 1) và led 2 sẽ sáng(biểu thị cho giátrị bằng 0)
Trang 15 Khi switch 1,2,3 đều OFF(hay có giá trị bằng 0) thì led 1,2 đều sẽ sáng(biểuthị cho giá trị bằng 0)
2.3 Bài 3: Thiết kế bộ fulladder sử dụng câu lệnh always_comb
- Đoạn mã thiết kế:
module full_adder_2 (input logic a, b, cin, output logic s, cout);
Trang 16- Mô phỏng trên ModelSim
- Thử nghiệm trên bảng mạch STEP MAX-10
2.4 Bài 4: Thiết kế bộ giải mã 2-4 dùng trong SystemVerilog, mô phỏng trên
ModelSim và thử nghiệm hoạt động của thiết kế trên bảng mạch STEP MAX10
Trang 17- Mô phỏng trên ModelSim
- Thử nghiệm trên bảng mạch STEP MAX-10
- Giải thích thực nghiệm:
Trang 18 Ta gắn lần lượt các đầu vào A[1], A[0] lần lượt với các switch 1,2 và các đầu
ra B[0] cho đến B[3] lần lượt với các led 4 đến 1
Ta có những trường hợp như dưới đây:
Khi ta để các giá trị switch là off tương ứng với trường hợp 00 thì đèn led4( B[0] ) sẽ tắt( tương ứng với giá trị 1 ) còn 3 led còn lại sẽ sáng( tương ứngvới giá trị 1)
Trang 19 Khi ta để switch 2( A[0] ) ở giá trị ON( tương ứng với giá trị 1), switch1( A[1] ) ở giá trị OFF( tương ứng với giá trị 0 ) thì led 3( B[1] ) sẽ tắt (tươngứng với giá trị 1) còn 3 led còn lại sẽ sáng(tương ứng với giá trị 0).
Khi ta để switch 1 ( A[1] ) ở giá trị ON và switch 2 ( A[2] ) ở giá trị OFF thìled 2( B[2] ) sẽ tắt còn 3 led còn lại sẽ sáng
Trang 20 Khi ta để switch 1 và switch 2 đều ở giá trị ON ( tương ứng với giá trị 11 ) thìled 1 ( A[3] ) sẽ tắt còn 3 led còn lại sẽ sáng.
2.5 Bài 5: Thiết kế bộ ALU dùng trong SystemVerilog, mô phỏng trên ModelSim
và thử nghiệm hoạt động của thiết kế trên bảng mạch STEP MAX10
Trang 21- Mô phỏng trên ModelSim
- Thử nghiệm trên bảng mạch STEP MAX-10
- Giải thích thực nghiệm:
Trang 22Ta gắn các đầu vào opcode[2] đến opcode[0] lần lượt cho các switch từ 1 đến 3 và 2đầu vào A, B lần lượt cho các button 1 và 2 Đầu ra out ta gắn với led 1.
Trang 23Khi có 1 trong 2 giá trị đầu vào A hoặc B bằng 0( để giá trị bằng 0 bằng cách bấmbutton) thì lối ra out sẽ bằng 1 thể hiện bằng led của out tắt.
Trang 24Khi cả 2 giá trị đầu vào A và B bằng 0 thì lối ra out sẽ bằng 0 thể hiện bằng led của outsáng.
2) Xét đến trường hợp opcode có tác dụng là trừ( opcode[0] = 1, opcode[1] = 0,opcode[2] = 0 )
Khi ta không bấm các giá trị đầu vào A, B sẽ mặc định giá trị là 1 vậy nên đầu ra sẽ cógiá trị là 0 thể hiện với led của đầu ra sáng( khi out = 0 thì led sẽ sáng )
Trang 25Khi có 1 trong 2 giá trị đầu vào A hoặc B bằng 0( để giá trị bằng 0 bằng cách bấmbutton) thì lối ra out sẽ bằng 1 thể hiện bằng led của out tắt.
Khi cả 2 giá trị đầu vào A và B bằng 0 thì lối ra out sẽ bằng 0 thể hiện bằng led của outsáng
3) Xét đến trường hợp opcode có tác dụng như là 1 cổng logic AND( opcode[0] = 0,opcode[1] = 1, opcode[2] = 0 )
Trang 26Khi ta không bấm các giá trị đầu vào A, B sẽ mặc định giá trị là 1 vậy nên đầu ra sẽ cógiá trị là 1 thể hiện với led của đầu ra tắt( khi out = 1 thì led sẽ tắt ).
Trang 27Khi 1 trong 2 hoặc cả 2 giá trị đầu vào A, B là 0 (bằng cách bấm button) thì đầu ra out
= 0 do đó đèn led sẽ sáng ( khi out = 0 thì led sẽ sáng )
4) Xét đến trường hợp opcode có tác dụng như là 1 cổng logic OR( opcode[0] = 1,opcode[1] = 1, opcode[2] = 0 )
Khi cả 2 giá trị đầu vào A, B là 0(bằng cách bấm button) thì đầu ra out = 0 do đó đènled sẽ sáng ( khi out = 0 thì led sẽ sáng )
Trang 28Khi cả 2 đầu vào hoặc 1 trong 2 đầu vào A, B có giá trị bằng 1 thì đầu ra out = 1 do đóđèn led sẽ tắt ( khi out = 0 thì led sẽ tắt ).
4) Xét đến trường hợp opcode có tác dụng như là 1 cổng logic XOR( opcode[0] = 0,opcode[1] = 0, opcode[2] = 1 )
Trang 29Khi đầu vào A và B có các giá trị giống nhau như cùng là giá trị 1 hoặc cùng là giá trị
0 thì out = 0 khi đó đèn led sẽ sáng
Trang 30Khi đầu vào A và B có các giá trị khác nhau như khi A = 0, B = 1 hoặc khi A = 1, B =
0 thì out = 1 khi đó đèn led sẽ tắt
5) Xét đến trường hợp opcode có tác dụng như là bộ so sánh( opcode[0] = 1,opcode[1] = 0, opcode[2] = 1 )
Trang 31Khi A và B có các giá trị giống nhau như cùng là giá trị 1 hoặc 0 thì out = 1 khi đó đènled sẽ tắt.
Trang 32Khi đầu vào A và B có các giá trị khác nhau như khi A = 0, B = 1 hoặc khi A = 1, B =
0 thì out = 0 khi đó đèn led sẽ sáng
2.6 Bài 6: Thiết kế bộ giải mã bảy đoạn sử dụng câu lệnh always_comb và cấu trúc
case trong SystemVerilog, mô phỏng trên ModelSim và thử nghiệm hoạt độngcủa thiết kế trên bảng mạch STEP MAX-10
- Đoạn mã thiết kế:
module seven_segment_decoder (input logic [3:0] D, output logic [6:0] S);
Trang 33D = 4'b0000; #50;
D = 4'b0001; #50;
D = 4'b0010; #50;
D = 4'b0011; #50;
Trang 34- Mô phỏng trên ModelSim
- Thử nghiệm trên bảng mạch STEP MAX-10