Kĩ thuật điện tử là một trong những lĩnh vực có đóng góp rất lớn trong việc nâng cao và cải thiện đời sống của con người cùng với đó là các phương pháp thiết kế mạch điện tử được sáng tạ
Trang 1BỘ THÔNG TIN VÀ TRUYỀN THÔNG HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIẾN THÔNG
-BÁO CÁO BÀI TẬP LỚN MÔN THIẾT KẾ LOGIC SỐ
Nhóm: 20
Sinh viên: Nguyễn Văn Mạnh………
B18DCDT145
Trần Thanh Phong……… B18DCDT185
Trang 2
LỜI NÓI ĐẦU
Ngày nay, với sự phát triển vượt bậc của các ngành khoa học đều nhằm mục đích phục vụ lợi ích cho con người Kĩ thuật điện tử là một trong những lĩnh vực có đóng góp rất lớn trong việc nâng cao và cải thiện đời sống của con người cùng với đó là các phương pháp thiết kế mạch điện tử được sáng tạo và sử dụng rộng rãi Trong kì học này, bộ môn Thiết
kế Logic số mà học viện lựa chọn giúp chúng em được tiếp xúc với ngôn ngữ VHDL do hãng Xilinx – một trong những hãng sản xuất chip bán dẫn hàng đầu thế giới sáng tạo ra Sau khoảng thời gian học tập, trau dồi và tích lũy kiến thức tại học viện thì bài tập lớn lần này cơ hội cho chúng em được vận dụng những lí thuyết được học vào thực hiện thiết kế mạch logic mô phỏng.
Cảm ơn cô Trần Thị Thúy Hà đã đồng hành cùng với chúng em trong khoảng thời gian qua Nếu báo cáo có bất kì thiếu xót hay chưa đúng mong cô hướng dẫn cũng như góp ý
để bọn em có thể khắc phục cho tương lai.
Trang 3Mục Lục
Bài 1: Viết chương trình mô tả mạch tạo mã và giải mã Hamming 5
1 Cơ sở lí thuyết 5
1.1 Định nghĩa 5
1.2 Quá trình mã hóa Hamming 5
1.3 Quá trình giải mã Hamming 6
2 Áp dụng cho code VHDL 7
2.1 Code chương trình 7
2.1.1 Phần mã hóa Hamming 7
2.1.2 Phần giả mã Hamming 9
2.2 Code testbench 11
Bài 2: Viết chương trình mô tả mạch điều khiển bơm nước vào một tháp nước nhờ 2 bơm P1 và P2 Cả hai bơm P1 và P2 được mở (bơm nước) khi nước ở dưới mức 1 và vẫn mở cho đến khi nước chưa đạt tới mức 2 Khi nước vừa đạt tới mức 2 thì bơm P1 ngắt (không bơm nước), chỉ còn P2 vẫn bơm P1 vẫn ngắt cho tới khi nước lại ở dưới mức 1 P2 vẫn mở, chỉ khi nào nước đạt tới mức 3 thi P2 mới ngắt P2 vẫn ngắt, chỉ mở khi nước lại xuống dưới mức 1 11
1 Cơ sở lí thuyết 11
2 Áp dụng cho code VHDL 11
2.1 Code chương trình 11
2.2 Code testbench 13
Bài 3: Viết chương trình mô tả mạch đếm số xe ô tô và số chỗ trống trong gara, có báo hiệu hết chỗ và hiển thị kết quả trên LED 7 đoạn 13
1 Cơ sở lí thuyết 13
2 Áp dụng cho code VHDL 13
2.1 Code chương trình 13
2.2 Code testbench 17
Bài 4: Viết chương trình mô tả bộ hợp kênh 8:1 từ bộ hợp kênh 4:1 17
1 Cơ sở lí thuyết 17
2 Áp dụng code VHDL 19
2.1 Code chương trình 19
2.1.1 Code hàm main 19
2.1.2 Code biểu thức cho Mux4:1 21
2.1.3 Code biểu thức cho Mux2:1 21
2.2 Code testbench 22
Trang 4Nội dung báo cáo về yêu câu được giao
Bài 1: Viết chương trình mô tả mạch tạo mã và giải mã Hamming.
1 Cơ sở lí thuyết
1.1 Định nghĩa
- Hiện thời, khi nói đến mã Hamming chúng ta thực ra là muốn nói đến mã (7,4) mà Hamming công bố năm 1950 Với mỗi nhóm 4 bit dữ liệu, mã Hamming thêm 3 bit kiểm tra Thuật toán (7,4) của Hamming có thể sửa chữa bất cứ một bit lỗi nào,
và phát hiện tất cả lỗi của 1 bit, và các lỗi của 2 bit gây ra mã (7,4) của Hamming rất có hiệu quả (trừ phi phương tiện truyền thông có độ nhiễu rất cao thì nó mới có thể gây cho 2 bit trong số 7 bit truyền bị đảo lộn).
- Mã chẵn lẻ thêm một bit vào trong dữ liệu, và bit cho thêm này cho biết số lượng bit có giá trị 1 của đoạn dữ liệu nằm trước là một số chẵn hay một số lẻ Nếu một bit bị thay đổi trong quá trình truyền dữ liệu, giá trị chẵn lẻ trong thông điệp sẽ thay đổi và do đó có thể phát hiện được lỗi (Chú ý rằng bit bị thay đổi có thể lại chính là bit kiểm tra) Theo quy ước chung, bit kiểm tra có giá trị bằng 1 nếu số lượng bit có giá trị một trong dữ liệu là một số lẻ, và giá trị của bit kiểm tra
bằng 0 nếu số lượng bit có giá trị một trong dữ liệu là một số chẵn Nói cách khác, nếu đoạn dữ liệu và bit kiểm tra được gộp lại cùng với nhau, số lượng bit có giá trị bằng 1 luôn luôn là một số chẵn.
1.2 Quá trình mã hóa Hamming
- Một từ mã 7 bit được đưa vào đầu vào dữ liệu với kí hiệu chuỗi bít có dạng như sau D7D6D5D4D3D2D1 cùng với 4 bit chẵn lẻ được them vào từ mã vào các vị trí cố định Từ mã 7 bit mã ban đầu và 4 bit chẵn lẻ sắp xếp theo trình tự theo bảng
Trang 5- Các cổng XOR được sử dụng để mã hóa từ mã tại chính các bit chẵn lẻ theo công thức
1.3 Quá trình giải mã Hamming
- Tín hiệu đầu vào là từ mã đã được mã hóa gồm 11 bit với kí hiệu chuỗi bít có dạng như sau D7D6D5P8D4D3D2P4D1P2P1 trong đó P1,P2,P4,P8 là các bít chẵn lẻ được thêm vào từ quá trình mã hóa.
- Các bít chẵn lẻ làm nhiệm vụ giải mã song song với quá trình phát hiện và sửa sai với tối đa là 2 bit lỗi, chuỗi chẵn lẻ P1P2P4P8 được tính theo công thức:
P1=D1⨁ D3 ⨁D5⨁D7⨁D9⨁D11
P2=D2⨁ D3⨁ D6⨁D7⨁D10⨁D11
P4=D4⨁D5⨁ D6⨁D7
P8=D8⨁D9⨁ D10⨁D11
- Chuỗi P1P2P4P8 nhận 15 giá trị và đặc biệt nó còn có thể cho biết vị trí bít sai của
từ mã đầu vào bằng dạng chuỗi nhị phân phát hiện :
Giá trị của chuỗi P1P2P3P4 Chuỗi phát hiện vị trí sai
(vị trí xuất hiện bit 1 là vị trí sai của từ mã )
Trang 6Port ( din : in STD_LOGIC_VECTOR (6 downto 0);
cout : out STD_LOGIC_VECTOR (10 downto 0));
end mahamming;
architecture Behavioral of mahamming is
signal data:STD_LOGIC_VECTOR(7 downto 1);
signal coded:STD_LOGIC_VECTOR(11 downto 1);
begin
data<=din;
Trang 7Port ( datain : in STD_LOGIC_VECTOR (11 downto 1);
decode : out STD_LOGIC_VECTOR (7 downto 1));
end mahamming2;
architecture Behavioral of mahamming2 is
signal coded:STD_LOGIC_VECTOR(11 downto 1);
signal codata:STD_LOGIC_VECTOR(11 downto 1);
signal codigo:STD_LOGIC_VECTOR(4 downto 1);
signal code:STD_LOGIC_VECTOR(11 downto 1);
signal mask:STD_LOGIC_VECTOR(11 downto 1);
signal deout:STD_LOGIC_VECTOR(7 downto 1);
begin
Trang 8codigo(1)<=codata(1) xor codata(3) xor codata(5) xor codata(7) xor codata(9) xor codata(11);codigo(2)<=codata(2) xor codata(3) xor codata(6) xor codata(7) xor codata(10) xor codata(11);codigo(3)<=codata(4) xor codata(5) xor codata(6) xor codata(7);
codigo(4)<=codata(8) xor codata(9) xor codata(10) xor codata(11);
Trang 9signal din : STD_LOGIC_VECTOR (7 downto 1);signal cout : STD_LOGIC_VECTOR (11 downto 1);begin
d0:process
begin
din(0)<='0'; wait for 1ns;
din(0)<='1'; wait for 1ns;
end process;
d1:process
begin
din(1)<='0'; wait for 2ns;
din(1)<='1'; wait for 2ns;
end process;
d2:process
begin
din(2)<='0'; wait for 3ns;
din(2)<='1'; wait for 3ns;
end process;
d3:process
begin
din(3)<='0'; wait for 4ns;
din(3)<='1'; wait for 4ns;
Trang 10din(4)<='1'; wait for 5ns;
end process;
d5:process
begin
din(5)<='0'; wait for 6ns;
din(5)<='1'; wait for 6ns;
end process;
d6:process
begin
din(6)<='0'; wait for 7ns;
din(6)<='1'; wait for 7ns;
Trang 11P1 ngắt (không bơm nước), chỉ còn P2 vẫn bơm P1 vẫn ngắt cho tới khi nước lại ở dưới mức 1 P2 vẫn mở, chỉ khi nào nước đạt tới mức 3 thi P2 mới ngắt P2 vẫn ngắt, chỉ mở khi nước lại xuống dưới mức 1.
1 Cơ sở lí thuyết
- Ta chia mức nước trong bể với 4 mức với mức 0 tương ứng với đáy bể Mức 1,2,3 được chia dựa theo yêu cầu đề bài tương ứng với trạng thái 1,2,3.
- Quá trình nước lên được miêu tả bằng như một xung clock đầu vào liên tục.
- Hai máy bơm được mô tả qua bit nhị phân : ‘1’ tương ứng với bơm bật,’0’ tương ứng với bơm tắt
- Khi nước chạm mức 3 thì hai máy bơm tắt cho đến khi nước xuống lại mức 1, vì thế ta coi trạng thái kế tiếp của trạng thái 3 là trạng thái 1.
Port ( water : in STD_LOGIC;
bom : out STD_LOGIC_VECTOR(1 downto 0));
end baikiemtra2;
architecture Behavioral of baikiemtra2 is
type state is (zero,one,two,three);
Trang 12Port ( water : in STD_LOGIC;
bom: out STD_LOGIC_VECTOR(1 downto 0));end component;
signal water: STD_LOGIC;
signal bom: STD_LOGIC_VECTOR(1 downto 0);
begin
clk: process
begin
water <= '0'; wait for 1ns;
water <= '1'; wait for 1ns;
end process;
Trang 13B2: baikiemtra2 port map(
- Giả sử bãi xe có tối đa 99 chỗ đỗ ứng với 99 xe.
- Coi tín hiệu số xe vào bãi và xe ra khỏi bãi là tín hiệu sườn lên của các xung clock.
- Hai led 7 đoạn tương ứng với hàng chục và hàng đơn vị, hiển thị số xe xuất hiện trong bãi với khởi điểm ban đầu là 0 xe Khi có tín hiệu xe vào sẽ công thêm, ngước lại khi có tín hiệu xe ra sẽ trừ đi 1 Vì thế, khi led hiển 99 tức bãi xe đã hết chỗ.
- Led sử dụng trong bài là Led Catot chung, nhận mức logic 1 khi thanh led sáng và mức 0 khi thanh led tắt
2 Áp dụng cho code VHDL
Trang 14architecture Behavioral of baikiemtra3 is
signal n1:integer range 0 to 9 := 0;
signal n2:integer range 0 to 9 := 0;
signal trong:integer range 0 to 99:=99;
begin
process(xevao,xera,trong)
variable chuc: integer range 0 to 9:=0;
variable dv: integer range 0 to 9:=0;
Trang 15if chuc=0 then chuc:=0;
Trang 16when 0 => led1<="0000001"; when 1 => led1<="1001111"; when 2 => led1<="0010010"; when 3 => led1<="0000110"; when 4 => led1<="1001100"; when 5 => led1<="0100100"; when 6 => led1<="0100000"; when 7 => led1<="0001111"; when 8 => led1<="0000000"; when 9 => led1<="0000100"; when others => null;
end case;
case n2 is
when 0 => led2<="0000001"; when 1 => led2<="1001111"; when 2 => led2<="0010010"; when 3 => led2<="0000110"; when 4 => led2<="1001100"; when 5 => led2<="0100100"; when 6 => led2<="0100000"; when 7 => led2<="0001111"; when 8 => led2<="0000000"; when 9 => led2<="0000100"; when others => null;
end case;
end process;
Trang 17signal xevao, xera: STD_LOGIC;
signal led1,led2: STD_LOGIC_VECTOR(6 downto 0);begin
vao:process
begin
xevao<='0'; wait for 4ns;
xevao<='1'; wait for 4ns;
end process;
ra:process
begin
xera<='0'; wait for 20ns;
xera<='1'; wait for 20ns;
Trang 18Bài 4: Viết chương trình mô tả bộ hợp kênh 8:1 từ bộ hợp kênh 4:1
1 Cơ sở lí thuyết
- Để thiết kế bộ hợp kênh 8:1 theo yêu cầu đề bài ta sử dụng 2 bộ hợp kênh 4:1 và 1
bộ hợp kênh 2:1 mắc theo sơ đồ sau:
- Trong đó:
Trang 19 I0,I1,I2,I3 là đầu vào dữ liệu của bộ hợp kênh thứ nhất
I4,I5,I6,I7 là đầu vào dữ liệu của bộ hợp kênh thứ hai
S0,S1 là đầu vào địa chỉ 2 bộ hợp kênh 4:1
Hai đầu ra dữ liệu của 2 bộ 4:1 sẽ dùng làm đầu vào dữ liệu cho bộ hợp kênh 2:1
S2 là đầu vào địa chỉ cho bộ hợp kênh 2:1
Lối ra Y là đầu ra kết quả cuối cùng, nó phụ thuộc vào giá trị của đầu vào địa chỉ được mô tả qua bảng sau
Biểu thức đầu ra của bộ hợp kênh 4:1
T1= (S0 and S1 and I3) or ((not S0 and S1 and I2) or ((not S1) and S0 and I1) or ((not S0) and (not S1) and I0);
T2= (S0 and S1 and I7) or ((not S0 and S1 and I6) or ((not S1) and S0 and I5) or ((not S0) and (not S1) and I4);
Biểu thức đầu ra của bộ hợp kênh 2:1
Y =((not S2) and T1) or (S2 and T2);
2 Áp dụng code VHDL
Trang 202.1 Code chương trình
2.1.1 Code hàm main
- j1,j2,j3,j4: là các biến trung gian được gán cho giá trị đầu vào i0,i1,i2,i3,i4,i5,i6,i7 của 2 khối
- d1,d2: là các biến trung gian được gán cho giá trị đầu vào địa chỉ s0,s1
- t1,t2: là cac biến trung gian được gán cho giá trị đầu ra của 2 khối Mux4:1
Trang 21m2: main port map(j1=>i4,j2=>i5,j3=>i6,j4=>i7,d1=>s0,d2=>s1,f=>t2);
m3: main2 port map(j1=>t1,j2=>t2,d=>s2,f=>y);
Trang 22in0<='0'; wait for 1ns;
in0<='1'; wait for 1ns;
end process;
ip1:process
begin
in1<='0'; wait for 2ns;
in1<='1'; wait for 2ns;
end process;
ip2:process
begin
in2<='0'; wait for 3ns;
in2<='1'; wait for 3ns;
end process;
ip3:process
begin
in3<='0'; wait for 4ns;
in3<='1'; wait for 4ns;
Trang 23end process;
ip4:process
begin
in4<='0'; wait for 5ns;
in4<='1'; wait for 5ns;
end process;
ip5:process
begin
in5<='0'; wait for 6ns;
in5<='1'; wait for 6ns;
end process;
ip6:process
begin
in6<='0'; wait for 7ns;
in6<='1'; wait for 7ns;
end process;
ip7:process
begin
in7<='0'; wait for 8ns;
in7<='1'; wait for 8ns;
end process;
B4: baikiemtra4 port map(
in0=>in0, in1=>in1, in2=>in2, in3=>in3,in4=>in4, in5=>in5,in6=>in6,in7=>in7, s0=>s0, s1=>s1, s2=>s2,
output=>output);
end Behavioral;