Câu 1 2,5 điểm: cho đoạn chương trình viết bằng VHDL sau:a, Tìm lỗi và sửa lỗi bằng cách viết lại chương trình Các lỗi được làm nổi bật thành màu vàng library IEEE; use IEEE.STD_LOGIC_
Trang 1Câu 1 (2,5 điểm): cho đoạn chương trình viết bằng VHDL sau:
a, Tìm lỗi và sửa lỗi bằng cách viết lại chương trình
Các lỗi được làm nổi bật thành màu vàng
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity RSFF is
port ( R;S;RST;CLK : in STD_LOGIC; Dùng dấu phẩy để ngăn cách khai
báo các chân vào/ra chứ không dùng chấm phẩy
Q : out STD_LOGIC; Khai báo các chân vào/ra cuối cùng của
entity không dùng chấm phẩy ở đây (thừa dấu chấm phẩy)
) Thiếu dấu chấm phẩy ở đây
process (CLK,RST,R,S); Thừa dấu chấm phẩy ở đây
variable RS:std_logic_vector (1 downto 0);
begin
RS<=R&S; Lệnh gán biến dùng “:=” chứ không dùng “<=”
if (RST=="1") then Thừa một dấu bằng, nháy đơn chứ không dùng nháy kép
q0<='0';
else if (CLK'event and CLK='1') then
case RS is
1
Trang 2when "00"=>q0=>q0; Dùng lệnh gán biến “<=” chứ không dùng
Trang 3begin
process (CLK,RST,R,S)
variable RS:std_logic_vector (1 downto 0);
begin
RS:=R&S;
if (RST=’1’) then
q0<='0';
else if (CLK'event and CLK='1') then
case RS is
when "00"=>q0<=q0;
when "01"=>q0<='1';
when "10"=>q0<='0';
when others=>q0<='X';
end case;
end if; end if;
end process;
Q<=q0;
end RSFF;
b, Đoạn mã đúng này mô tả phần tử số là Flip-Flop RS không đồng bộ (bất đồng bộ) tín hiệu Reset, mô hình phần tử số đó là:
3
Trang 4Hình 1: Mô hình RSFF và bảng sự thật Câu 2 (2,5 điểm): Viết mã VHDL mô tả mạch như hình bên dưới:
Hình 2: Mạch logic số
4
Trang 7port ( x,y: in std_logic;
Trang 8port ( x,y: in std_logic;
- Chuong trinh
chinh -library ieee; khai báo thư viện
use ieee.std_logic_1164.all;
entity bai_2 is
port ( x1,x2,CLK,RST: in std_logic; Khai báo các chân vào
z: out std_logic Khai báo các chân ra
Trang 9component inverter Khai báo khối component cổng NOT cấp thấp
component OR_2 Khai báo khối component cổng OR_2 cấp thấp
port( x,y: in std_logic;
z: out std_logic
);
end component;
-cong
component NOR_2 Khai báo khối component cổng NOR_2 cấp thấp
port( x,y: in std_logic;
z: out std_logic
);
end component;
-cong
AND_2 -component AND_2 Khai báo khối component cổng AND_2 cấp thấp
port( x,y: in std_logic;
z: out std_logic
);
end component;
Trang 10signal S1,S2,S3,S4,S5,S6,S7,S8: std_logic; Khai báo các tín hiệu để lưu trữ tạm thời các giá trị trung gian (xem hình bên dưới)
- Z = 1 nếu như gặp dãy số vào là 0100
- Z = 0 trong mọi trường hợp khác
Phân tích bài toán ( Phần này không viết vào bài thi, chỉ để đọc hiểu vận dụng để làm những bài khác):
Trang 11- Theo bài ra thì đây là thiết kế máy trạng thái hữu hạn FSM, ở đây đầu ra Z chỉ phụ
thuộc vào trạng thái hiện tại nên là FSM kiểu MOORE.
- Theo bài ra ta xây dựng được bảng trạng thái ngõ ra theo ngõ vào:
Trạng thái hiện tại
Trang 12 Phần bài làm (viết vào bài thi):
- Vẽ sơ đồ chuyển trạng thái:
- Sơ đồ khối mạch:
phat hien chuoi "0100" FSM VHDL
- by Khanh Hung, 08/06/2014 -Khai bao thu vien -library ieee;
use ieee.std_logic_1164.all;
-Khai bao thuc entity FSM is
Trang 13port (
X :in std_logic; Input X
CLK :in std_logic; Input clock
RST :in std_logic; Input reset
Z :out std_logic Output );
-Phan mach to hop ben
duoi -process(X,pr_state) Danh sách cảm nhận là trạng thái hiện tại và đầu vào Xbegin
case pr_state is Với trạng thái hiện tại là:
when S0 => Khi trạng thái hiện tại là S0
Z <= '0'; Đầu ra Z=0if(X='0') then nx_state <= S1; Nếu đầu vào X=0 thì trạngthái tiếp theo là S1
else nx_state <= S0; Nếu đầu vào X=1 thì trạng thái tiếp theo là S0
end if;
when S1 => Khi trạng thái hiện tại là S1
Z <= '0'; Đầu ra Z=0if(X='1') then nx_state <= S2; Nếu đầu vào X=1 thì trạngthái tiếp theo là S2
else nx_state <= S1; Nếu đầu vào X=0 thì trạng thái tiếp theo là S1
Trang 14end if;
when S2 => Khi trạng thái hiện tại là S2
Z <= '0'; Đầu ra Z=0if(X='0') then nx_state <= S3; Nếu đầu vào X=0 thì trạngthái tiếp theo là S3
else nx_state <= S0; Nếu đầu vào X=1 thì trạng thái tiếp theo là S0
end if;
when S3 => Khi trạng thái hiện tại là S3
Z <= '0'; Đầu ra Z=0if(X='0') then nx_state <= S4; Nếu đầu vào X=0 thì trạngthái tiếp theo là S4
else nx_state <= S2; Nếu đầu vào X=1 thì trạng thái tiếp theo là S2
end if;
when S4 => Khi trạng thái hiện tại là S4
Z <= '1'; Đầu ra Z=1if(X='0') then nx_state <= S1; Nếu đầu vào X=0 thì trạng thái tiếp theo là S1
else nx_state <= S2; Nếu đầu vào X=1 thì trạng thái tiếp theo là S2
Trang 20Cong_not: inverter port map(x1,S1);
Cong_OR : OR_2 port map(x2,S8,S2);
JKFF_1 : JKFF port map(S1,S2,CLK,RST,S3,S4);Cong_NOR: NOR_2 port map(S1,S3,S5);
Trang 21port ( x1,x2,CLK,RST: in std_logic; Khai báo các chân vào
z: out std_logic Khai báo các chân ra
component OR_2 is Khai báo khối component cổng OR_2 cấp thấp
port( x,y: in std_logic;
Trang 22z: out std_logic
);
end component;
-cong
component NOR_2 is Khai báo khối component cổng NOR_2 cấp thấp
port( x,y: in std_logic;
z: out std_logic
);
end component;
-cong
AND_2 -component AND_2 is Khai báo khối AND_2 -component cổng AND_2 cấp thấp
port( x,y: in std_logic;
Trang 23-Khai bao thu
X :in std_logic; Input X
CLK :in std_logic; Input clock
RST :in std_logic; Input reset
Z :out std_logic Output );
Trang 24-Phan mach to hop ben
duoi -process(X,pr_state) Danh sách cảm nhận là trạng thái hiện tại và đầu vào Xbegin
case pr_state is Với trạng thái hiện tại là:
when S0 => Khi trạng thái hiện tại là S0
Z <= '0'; Đầu ra Z=0if(X='0') then nx_state <= S1; Nếu đầu vào X=0 thì trạngthái tiếp theo là S1
else nx_state <= S0; Nếu đầu vào X=1 thì trạng thái tiếp theo là S0
end if;
when S1 => Khi trạng thái hiện tại là S1
Z <= '0'; Đầu ra Z=0if(X='1') then nx_state <= S2; Nếu đầu vào X=1 thì trạngthái tiếp theo là S2
else nx_state <= S1; Nếu đầu vào X=0 thì trạng thái tiếp theo là S1
end if;
when S2 => Khi trạng thái hiện tại là S2
Z <= '0'; Đầu ra Z=0if(X='0') then nx_state <= S3; Nếu đầu vào X=0 thì trạngthái tiếp theo là S3
else nx_state <= S0; Nếu đầu vào X=1 thì trạng thái tiếp theo là S0
end if;
when S3 => Khi trạng thái hiện tại là S3
Z <= '0'; Đầu ra Z=0if(X='0') then nx_state <= S4; Nếu đầu vào X=0 thì trạngthái tiếp theo là S4
else nx_state <= S2; Nếu đầu vào X=1 thì trạng thái tiếp theo là S2
Trang 25end if;
when S4 => Khi trạng thái hiện tại là S4
Z <= '1'; Đầu ra Z=1if(X='0') then nx_state <= S1; Nếu đầu vào X=0 thì trạng thái tiếp theo là S1
else nx_state <= S2; Nếu đầu vào X=1 thì trạng thái tiếp theo là S2
end if;
end case;
end process;
end FSM;