Bài 1: Viết chương trình điều khiển 8 led sáng lan từ 2 bên vào giữa.Chương trình VHDL mô tả hệ thống: logic đa mức entity main is --Là thực thể tạo danh sách mô tả các chân vào/ra Port
Trang 1HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG
*****
BÁO CÁO MÔN HỌC :
THIẾT KẾ LOGIC SỐ - NHÓM 02
NHÓM BÀI TẬP LỚN : 18 GIẢNG VIÊN : TRẦN THÚY HÀ CÁC THÀNH VIÊN TRONG NHÓM :
TRẦN ĐÌNH KHIÊM-B18DCDT114 TRẦN QUANG LINH-B18DCDT125 NGUYỄN GIA LONG-B18DCDT130
Hà Nội, ngày 27 tháng 11 năm 2021
Trang 2Bài 1: Viết chương trình điều khiển 8 led sáng lan từ 2 bên vào giữa.
Chương trình VHDL mô tả hệ thống:
logic đa mức
entity main is Là thực thể tạo danh sách mô tả các chân vào/ra
Port ( clk : in STD_LOGIC; Xung clock mô tả tín hiệu vào
rst : in STD_LOGIC; Hệ thống đóng ngắt
cout : out STD_LOGIC_VECTOR (7 downto 0)); Đầu ra 8bit của hệ thống
architecture Behavioral of main is cấu trúc mô tả mạch
type state is (zero, one, two, three, four); Các trạng thái biểu diễn
signal pr_state, nx_state : state; Hai trạng thái hiện tại và kế tiếp có
begin
process(clk, rst) Tuần tự của clk và rst
begin
if(rst = '1') then Khi rst = ‘1’ trạng thái ở mức thấp(trạng thái zero)
pr_state <= zero;
elsif clk'event and clk = '1' then Khi rst = ‘0’, xung clock lên 1 thì trạng thái
tiếp
end if;
Trang 3end process;
process(pr_state) Tuần tự của trạng thái hiện tại
begin
case pr_state is Các trường hơp của led
when zero =>cout <="00000000"; Ở trạng thái zero đầu ra là
‘00000000’
“one”
when one =>cout <="10000001"; Ở trạng thái one đầu ra là
‘10000001’
“two”
when two =>cout <= "11000011"; (Tương tự như trên…)
nx_state <= three;
when three =>cout <="11100111";
nx_state <= four;
when four =>cout <="11111111";
nx_state <= zero; Về trạng thái đầu lặp lại vòng lặp end case;
end process;
Chương trình mô tả mạch led Kathode chung bít 1 led sáng
*Kết quả mô phỏng:
Trang 4*Sơ đồ khối:
Trang 5Bài 2 : Viết chương trình mô tả mạch phát hiện chuỗi bit nhị phân liên tiếp, đầu ra của nó là 1 khi xuất hiện 4 hoặc xuất hiện nhiều hơn 4 bit 1 liên tục và đầu ra là 0 trong các trường hợp còn lại
d = 1 d=1
d=0
d=0
d=0
d=0
d=1 d=1 d=1
Có 4 trạng thái là s0,s1,s2,s3,s4
S0 nếu thêm bit 1 thì sẽ sang trạng thái s1, còn nếu là bit 0 thì vẫn ở trạng thái s0 (s1= ‘1’)
S1 nếu thêm bit 1 thì sang trạng thái s2, còn nếu là bit 0 thì quay về trạng thái s0 (s2 = ‘11’)
S2 nếu thêm bit 1 thì sang trạng thái s3, còn nếu là bit 0 thì quay về trạng thái s0 (s3 = ‘111’)
S3 nếu thêm bit 1 thì sang trạng thái s4, còn nếu là bit 0 thì quay về trạng thái s0 (s4 = ‘1111’)
S4 nếu thêm bit 0 thì sẽ về trạng thái s0,bit 1 thì sẽ ở lại s4
S0
S1
S2
S3 S4
Trang 6* Code VHDL :
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
Uncomment the following library declaration if using arithmetic functions with Signed or Unsigned values use IEEE.NUMERIC_STD.ALL;
Uncomment the following library declaration if instantiating any Xilinx leaf cells in this code.
library UNISIM;
use UNISIM.VComponents.all;
entity main is Port ( clock : in STD_LOGIC;
reset : in STD_LOGIC;
d : in STD_LOGIC;
Z : out STD_LOGIC);
end main;
architecture Behavioral of main is type state is (s0,s1,s2,s3,s4); khai bao cac trang thái signal pr_state,nx_state : state;
begin process(clock,reset) begin
if reset='1' then
pr_state <= s0; nếu reset =1 thì quay về trạng thái s0 elsif clock'event and clock='1' then
pr_state <= nx_state; nếu clock thay đổi thì trạng thái sang trạng thái tiếp theo end if;
end process;
process(d,pr_state) begin
case pr_state is when s0 =>
Z <= '0';
if d = '1' then nx_state <= s1; nếu thêm bit 1 thì trạng thái sang trạng thái s1 else nx_state <= s0; còn không thì về s0
end if;
when s1 =>
Z <='0';
if d = '1' then nx_state <= s2;
else nx_state <= s0;
end if;
when s2 =>
Z <='0';
if d = '1' then nx_state <= s3;
else nx_state <= s0;
end if;
when s3 =>
Z <= '0';
if d ='1' then nx_state <= s4;
else nx_state <= s0;
end if;
Trang 7
end if;
when s4 =>
Z <= '1'; khi có 4 bit liên tiếp thì Z=1
if d = '0' then nx_state <= s0; nếu d=’1’ thì quay về trạng thái s0 else nx_state <= s4; còn không thì nó tiếp tục ở trạng thái s4 end if;
end case;
end process;
end Behavioral;
Trang 8* Thiết lập các giá trị :
Value radix: binary, Leading value : 0, Trailing value :1
Start time 0s, Cancel time :30s
Trang 9* Kết quả :
* Schematic :
Trang 10Câu 3 Viết chương trình mô tả mạch tuần tự đồng bộ để kiểm tra tính chẵn lẻ của
một dãy dữ liệu nhị phân liên tục được đưa đến đầu vào Nếu số bit 1 nhận
được là lẻ thì mạch sẽ đưa ra tín hiệu ra là Z=1, chẵn bit 1 thì mạch đưa ra
tín hiệu ra Z=0 Nếu hai bit 0 liên tiếp ở đầu vào thì mạch sẽ quay trở lại
trạng thái ban đầu và lại bắt đầu kiểm tra dãy dữ liệu mới
Bài làm
*Đồ hình trạng thái:
*Chương trình VHDL mô tả hệ thống:
library IEEE; Khai báo thư viện IEEE
logic đa mức
entity main is Là thực thể tạo danh sách mô tả các chân vào/ra
Port ( d : in STD_LOGIC; Tín hiệu vào
clk : in STD_LOGIC; Xung clock mô tả tín hiệu vào
rst : in STD_LOGIC; Hệ thống đóng ngắt
q : out STD_LOGIC); Đầu ra của hệ thống
Trang 11end main;
architecture Behavioral of main is Cấu trúc mô tả mạch
type state is(zero, one, two, reset); Các trạng thái biểu diễn
signal pr_state, nx_state : state; Hai trạng thái hiện tại và kế tiếp có tác
dụng chuyển trạng thái
begin
process(clk,rst) Tuần tự của clk và rst
begin
if rst ='1' then
pr_state <= reset; Khi rst = ‘1’ trạng thái ở mức thấp(trạng thái zero)
elsif clk'event and clk = '1' then Khi rst = ‘0’ hệ thống chuyển trạng thái,
thành
pr_state <= nx_state; trạng thái kế tiếp
end if;
end process;
process(d, pr_state) Tuần tự của trạng thái hiện tại
begin
when reset => q <= '0'; Ở trạng thái reset đầu ra q mức 0
q <= '1';
Trang 12q <= '0'; đầu ra vẫn là 0
nx_state <= zero;
end if;
if d = '1' then Nếu d =1 thì là 2 bit 1 chẵn
nx_state <= zero; Quay về trạng thái zero
nx_state <= two; Chuyển sang trạng thái two(10)
end if;
when two => Khi ở trạng thái two
if d = '1' then d= 1 là chẵn bit 1(tức 101)
q <= ‘0’; Nên đầu ra q =0
nx_state <= zero; Quay về trạng thái zero
else d = 0 là lẻ bit 1(tức 100)
nx_state <= zero; Do có hai bit 0 liên tiếp nên về trạng thái zero
end if;
end case;
end process;
end Behavioral; Kết thúc trương trình
*Kết quả: Ta setup như sau
Trang 13d 6s 50s
Ta có thể quan sát ở giây thứ 3, d = 1 lẻ bit 1 nên q =1, giây tiếp theo d =1 chẵn bit
1 nên q =0 về trạng thái zero, giây tiếp theo d =1 lẻ bit 1 nên q =1 Giây tiêp theo d
= 0 lẻ bit 1 q=1 là trạng thái two Giây tiếp theo d =0 vẫn lẻ bit 1 nên q = 1 nhưng
do có 2 bit 0 liên tiếp nên quay về trạng thái zero Ở trạng thái zero thêm d =0 nên
q = 0
Tín hiệu vào như sau: 000111000…
Q: 000101110…
*Sơ đồ khối:
Trang 15Bài 4 : Lập trình VHDL MUX 8:1 từ MUX 2:1
MUX 2 :1 có 2 đầu vào và 1 đầu lựa chọn
I0 F I1
S
Như vậy, để có thể tạo khối Mux 8:1 thì cần phải có 7 khối 2:1 Công thức của khối Mux 2:1 : 1*S
Ta có sơ đồ :
MUX 2:1
Trang 16* Code VHDL :
- Chương trình chạy mux 2:1 :
- Chương trình chạy mux 8:1 :
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity main is
Port ( j0 : in STD_LOGIC;
j1 : in STD_LOGIC;
e : in STD_LOGIC;
f : out STD_LOGIC);
end main;
architecture Behavioral of main is
begin
f<=((not e) and j0) or (e and j1);
end Behavioral;
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity mux81 is
Port ( i0,i1,i2,i3,i4,i5,i6,i7 : in STD_LOGIC;
s0,s1,s2 : in STD_LOGIC;
fout : out STD_LOGIC);
end mux81;
architecture Behavioral of mux81 is
component main is khai bao component de g?i ch??ng trình main
Trang 17* Thiết lập các giá trị đầu vào :
Value radix: binary, Leading value : 0, Trailing value :1
Start time 0s, Cancel time :30s
* Kết quả :
Port ( j0 : in STD_LOGIC;
j1 : in STD_LOGIC;
e : in STD_LOGIC;
f : out STD_LOGIC);
end component;
signal t1,t2,t3,t4,t5,t6 : std_logic; khai báo tín hi?u trong - k?t n?i các component
begin
m1: main port map(j0 => i0, j1=>i1,e=>s0,f=>t1); s? d?ng câu l?nh port map k?t n?i component m2: main port map(j0 => i2, j1=>i3,e=>s0,f=>t2);
m3: main port map(j0 => i4, j1=>i5,e=>s0,f=>t3);
m4: main port map(j0 => i6, j1=>i7,e=>s0,f=>t4);
m5: main port map(j0 => t1, j1=>t2,e=>s1,f=>t5);
m6: main port map(j0 => t3, j1=>t4,e=>s1,f=>t6);
m7: main port map(j0 => t5, j1=>t6,e=>s2,f=>fout);
end Behavioral;
Trang 18* Schematic :