Thí nghiệm Kỹ thuật số của thầy Nguyễn Khắc Phương Tuấn THIẾT KẾ BỘ CỘNG 2 SỐ 4BIT, Thiết kế bộ ALU (Arithmetic and Logic Unit) thực hiện 8 hàm tính toán số học và logic đơn giản, Bộ Alu cộng trừ hai số bốn bit, Thiết kế bộ đếm thập phân các số có 2 chữ số. Mạch thực hiện đếm lên từ 00 đến 99 hoặc đếm xuống từ 99 về 00.
Trang 1TRƯỜNG ĐẠI HỌC BÁCH KHOA
KHOA ĐIỆN – ĐIỆN TỬ
Trang 2TP HỒ CHÍ MINH, THÁNG 12 NĂM 2019
Trang 3MỤC LỤC
BÀI THÍ NGHIỆM 1 4
MỤC TIÊU: 4
TIẾN HÀNH THÍ NGHIỆM: 4
I THÍ NGHIỆM 1.1 TUTORIAL: 4
II THÍ NGHIỆM 1.2: 6
BÀI THÍ NGHIỆM 2 10
MỤC TIÊU: 10
TIẾN HÀNH THÍ NGHIỆM: 10
I THÍ NGHIỆM 2.1 THIẾT KẾ BỘ CỘNG 2 SỐ 4-BIT: 10
II THÍ NGHIỆM 2.2: 13
BÀI THÍ NGHIỆM 3 18
MỤC TIÊU: 18
TIẾN HÀNH THÍ NGHIỆM 18
I Thí nghiệm 3.1 – Bộ đếm mã BCD 18
II Thí nghiệm 3.2- Bộ đếm lên xuống thập phân từ 0-99 23
BÀI THÍ NGHIỆM 4 28
YÊU CẦU 28
TIẾN HÀNH THÍ NGHIỆM 29
Trang 4Sinh viên đọc phần III của bài thí nghiệm 0 và thực hiện chương trình Test01 theo từng bước
đã được đưa ra
Giáo viên hướng dẫn sẽ kiểm tra kết quả thực hiện của sinh viên thông qua kết quả môphỏng
Các bước thực hiện:
Step 1: Trên thanh menu chọn File/New Project Wizard để bắt đầu quá trình tạo project Step 2: Đặt tên project và thiết lập đường dẫn đến thư mục làm việc của project.
Step 3: Add Files
Step 4: Chọn device cho project muốn thiết kế
Step 5: Tạo file thiết kế cho project
Step 6: Viết code chương trình cho thiết kế bằng ngôn ngữ VHDL
Step 7: Tiến hành gán pin cho thiết kế bằng cách import Assignments
Step 8: Tiến hành biên dịch chương trình
Trang 7b Sơ đồ mạch Logic (Logic Diagrams):
- Mô phỏng trên Proteus các cổng logic:
Trang 8port (a_in,b_in: in std_logic;
not_op,and_op,nand_op,or_op,nor_op,xor_op,xnor_op: out std_logic);
end gates;
architecture dataflow of gates is
Trang 9not_op <= not a_in;
and_op <= a_in and b_in;
nand_op <= a_in nand b_in;
or_op <= a_in or b_in;
nor_op <= a_in nor b_in;
xor_op <= a_in xor b_in;
xnor_op <= a_in xnor b_in;
end dataflow;
Trang 10e kết quả mô phỏng trên ModelSim/VWF:
f Kết quả thực hiện trên KIT DE2:
- Gán ngõ vào a_in và b_in vào SW[0] và SW[1], các ngõ ra vào LEDG[0]-[6]
LEDG[1 ]
LEDG[2 ]
LEDG[3 ]
LEDG[4 ]
LEDG[5 ]
LEDG[6 ]
Tắt Tắt Sáng Tắt Sáng Tắt Sáng Tắt SángTắt Bật Sáng Tắt Sáng Sáng Tắt Sáng TắtBật Tắt Tắt Tắt Sáng Sáng Tắt Sáng TắtBật Bật Tắt Sáng Tắt Sáng Tắt Tắt Sáng
Trang 12s : OUT STD_LOGIC_VECTOR(3 downto 0);
Cout : OUT STD_LOGIC);
stage0: fulladder PORT MAP(a(0),b(0),Cin,s(0),c(1)) ;
stage1: fulladder PORT MAP(a(1),b(1),c(1),s(1),c(2)) ;
stage2: fulladder PORT MAP(a(2),b(2),c(2),s(2),c(3)) ;
stage3: fulladder PORT MAP(a(3),b(3),c(3),s(3),Cout) ;
END model;
c Kết quả mô phỏng VWF:
Trang 13d Kết quả mô phỏng trên kit DE2:
Input
Output
a[3] a[2] a[1] a[0] b[3] b[2] b[1] b[0] C_in C_ou
t s[3] s[2] s[1] s[0] SW
SW [3]
SW [2]
SW [1]
SW [0]
SW [8]
LED R [4]
LED R [3]
LEDR [2]
LED R [1]
LED R [0] Tắt Tắt Tắt Bật Tắt Tắt Tắt Tắt Tắt Tắt Tắt Tắt Tắt Sáng Tắt Tắt Tắt Bật Tắt Tắt Tắt Bật Tắt Tắt Tắt Tắt Sáng Tắt Bật Bật Bật Bật Tắt Tắt Tắt Bật Tắt Bật Tắt Tắt Tắt Tắt Bật Bật Bật Bật Tắt Tắt Bật Bật Tắt Bật Tắt Tắt Sáng Tắt Bật Bật Bật Bật Bật Bật Bật Bật Tắt Bật Sáng Sáng Sáng Tắt
Mô phỏng trên Proteus dùng 7483:
A( A1:LSB)
Trang 14II THÍ NGHIỆM 2.2:
1 Yêu cầu:
Thiết kế bộ ALU (Arithmetic and Logic Unit) thực hiện 8 hàm tính toán số học vàlogic đơn giản Mã điều khiển và mô tả các phép toán tương ứng với các mã ấy đượctrình bày trong Bảng 1
Bộ ALU 4-bit có các ngõ vào sau:
A, B: 4-bit input
Cin: 1-bit input
Output: 4-bit output
Cout: 1-bit output
Control: 3-bit control input
B(B1:LSB)
Trang 15Bảng 1 Các ngõ vào và ngõ ra của ALUSignal
Type
Signal Name
4-bit output result to be displayed on HEX0
Cout LEDG[0] 1-bit output result to be displayed on
LEDG[0]
Bảng 2 Tập lệnh của ALU
Control Instruction
Operation
000 Add Output <= A + B + Cin; Cout chứa số nhớ (carry)
001 Sub Output <= A – B – Cin; Cout chứa số mượn (borrow)
010 Or Output <= A or B
011 And Output <= A and B
100 Shl Output <= A(2 downto 0) & ’0’
101 Shr Output <= ‘0’ & A(3 downto 1)
110 Rol Output <= A(2 downto 0) & A(3)
111 Ror Output <= A(0) & A(3 downto 1)
Những điểm cần lưu ý:
Sử dụng lệnh CASE (hoặc các câu lệnh thiết kế tương đương) kiểm tra ngõ vào “Code”
để xác định phép toán cần thực hiện
Trang 16 Với mạch tổ hợp, ngõ vào thay đổi sẽ làm ngõ ra thay đổi ngay lập tức.
Có thể dùng các phép toán số học và logic trong thiết kế
Mô phỏng thiết kế sử dụng lệnh “force” và “run” trong cửa sổ Transcript để thiết lập giá
trị ngõ vào và quan sát giản đồ xung của ngõ ra ở cửa sổ Waveform
2 Thiết kế:
a Sơ đồ khối (Block Diagram):
b Sơ đồ mạch Logic (Logic Diagrams):
Trang 17Control : in STD_LOGIC_VECTOR(2 downto 0);
ALU_OUT, s : out STD_LOGIC_VECTOR(3 downto 0);
C_out : out STD_LOGIC);
end ALU;
architecture model of ALU is
signal x, C_in_b: STD_LOGIC;
signal sum, sub1 : STD_LOGIC_VECTOR(4 downto 0);
signal ht : STD_LOGIC_VECTOR(3 downto 0);
signal C_in_a : STD_LOGIC_VECTOR(3 downto 0);
begin
ht<= “0001”;
sum <= ('0'& A ) + B + C_in When Control = "000";
sub1 <= ('0'& A ) + (not('0'& B ))+ ht + (not("0000"& C_in)) +ht when Control = "001";
x<='0';
C_out <= sum(4) when Control = "000" else
sub1(4) when Control="001" else
x when Control="010" else
x when Control="011" else
x when Control="100" else
x when Control="101" else
Trang 18x when Control="110" else
x when Control="111";
with Control select
ALU_OUT <= sum(3 downto 0) when "000",
sub1(3 downto 0) when "001",
A or B when "010",
A and B when "011",A(2 downto 0) & '0' when "100",'0' & A(3 downto 1) when "101",A(2 downto 0) & A(3) when "110",A(0) & A(3 downto 1) when "111";
end model;
4 Kết quả mô phỏng trên VWF:
Trang 195 Kết quả mô phỏng trên kit DE2:
STT
Input
A[3] A[2] A[1] A[0] B[3] B[2] B[1] B[0] C_in
Control [2]
Control [1]
Con trol[ 0] SW
[7]
SW [6]
SW [5]
SW [4]
SW [3]
SW [2]
SW [1]
SW [0]
SW [8]
SW [9]
SW [10]
SW [11]
ALU_OUT[0]
LEDR
[4]
LEDR [3]
LEDR [2]
LEDR [1] LEDR
Trang 21Trạng thái ngõ ra thay đổi khi ngõ vào CLK xuất hiện cạnh lên.
Khi ngõ vào bất đồng bộ CLR = 0, bộ đếm bị reset
Chọn chu kỳ của tín hiệu CLK là 10ns khi mô phỏng thiết kế
LOAD ENABLE UP
1 1 X Bộ đếm nạp giá trị từ ngõ vào D
Trang 220 1 1 Mạch thực hiện đếm lên Nếu giá trị của bộ đếm là
9, Carry output (CO) = 1
0 1 0 Mạch thực hiện đếm xuống Nếu giá trị của bộ đếm
là 0, Carry output (CO) = 1
Bảng 3 Các ngõ vào, ngõ ra của bộ đếm mã BCD
Signal
Type
Signal Name Assigned Port Comment
Inputs D SW[3 0] 4-bit input to be displayed on HEX6
ENABLE SW[4] 1-bit input to be displayed on LEDR[0]LOAD SW[5] 1-bit input to be displayed on LEDR[1]
UP SW[6] 1-bit input to be displayed on LEDR[2]CLR SW[7] 1-bit input to be displayed on LEDR[3]Outputs Q HEX0 4-bit output result to be displayed on
HEX0Cout LEDG[0] 1-bit output result to be displayed on
LEDG[0]
2 Thiết kế:
3 Sơ đồ khối (Block Diagram):
4 VHDL code
Trang 23port (clk1,rst1,enable,load,up: in std_logic;
Q1: out std_logic_vector(3 downto 0);
variable temp1: std_logic_vector(3 downto 0);
variable c_out: std_logic_vector(3 downto 0);
Trang 27II Thí nghiệm 3.2- Bộ đếm lên xuống thập phân từ 0-99
Trang 28port (clk,rst1,enable,load,up: in std_logic;
Q1,Q2: out std_logic_vector(6 downto 0);
port (clkin,rst: in std_logic;
clock_out: out std_logic);
end component;
begin
user1: clk_devider port map(clk,rst1,clk1);
process(clk1,rst1,load,enable,up)
variable temp1: std_logic_vector(3 downto 0);
variable temp2: std_logic_vector(3 downto 0);
Trang 29variable c_out: std_logic_vector(3 downto 0);
Trang 314 Sơ đồ khối.
Trang 33TIẾN HÀNH THÍ NGHIỆM
1.Sơ đồ khối.
2
Sơ đồ mạch logic.
Trang 34weight: in std_logic_vector(11 downto 0);
Grp1,Grp2,Grp3,Grp4,Grp5,Grp6:out std_logic_vector(7 downto 0);
currentGrp:inout std_logic_vector(2 downto 0));
end sorter;
architecture behavioral of sorter is
begin
currentGrp <= "000" when weight = "000000000000" else
"001" when weight > "000000000000" and weight < "000011001001" else "010" when weight > "000011001000" and weight < "000111110101" else "011" when weight > "000111110100" and weight < "001100100001" else "100" when weight > "001100100000" and weight < "001111101001" else "101" when weight > "001111101000" and weight < "011111010001" else "110" when weight > "011111010000";
process (clk)
Trang 35variable c1,c2,c3,c4,c5,c6: std_logic_vector(7 downto 0);
variable tmp: std_logic_vector(2 downto 0);
Trang 371