Mình đang viết thử 1 ứng dụng mạch đèn giao thông ngõ ra có 6 led tượng trưng cho 6 đèn và 2LED 7 đoạn để hiển thị thời gian đếm lùi ví dụ chế độ đèn đỏ sẽ đếm lùi 30->00.
Mình dùng máy trạng thái theo kiểu type định nghĩa, mình bị mắc phần không biết xử lý sao cho biết mỗi lần đổi trạng thái thì LED7 đoạn đếm lùi thời gian khắc nhau ;
code của mình :
type states is (st0,st1,st2,st3);
signal clk1: std_logic;
signal TT : std_logic_vector (1 downto 0);
signal pr_state,nx_state: states ;
signal dem1,dem2 : integer range 0 to 40;
signal sel :std_logic_vector (1 downto 0);
--signal bcd: std_logic_vector(11 downto 0);
begin
--************************************************** ******
FUNCTION GM(X1: IN STD_LOGIC_VECTOR (3 downto 0)) RETURN
STD_LOGIC_VECTOR IS
VARIABLE Z1: STD_LOGIC_VECTOR (6 downto 0);
begin
CASE X1 IS
WHEN "0000" => Z1 := "1000000";
WHEN "0001" => Z1 := "1111001";
WHEN "0010" => Z1 := "0100100";
WHEN "0011" => Z1 := "0110000";
WHEN "0100" => Z1 := "0011001";
WHEN "0101" => Z1 := "0010010";
WHEN "0110" => Z1 := "0000010";
WHEN "0111" => Z1 := "1111000";
WHEN "1000" => Z1 := "0000000";
WHEN "1001" => Z1 := "0010000";
WHEN OTHERS => Z1 := "1111111";
END CASE;
RETURN Z1;
END GIAI_MA;
--************************************************** *******
process (clk)
variable chia:integer range 0 to 1000;
begin
if clk='1' and clk'event then
chia:=chia+1; sel<=sel+1; end if;
if chia=1000 then
clk1<='1' ;
else clk1<='0' ;end if;
end process;
--************************************************** *******
process (clk1,clr)
variable QT1,QT2: STD_LOGIC_VECTOR (3 downto 0);
begin
if clr ='0' then pr_state <= st0;TT:="00";
elsif clk1='1' and clk1'event then dem1<= dem1+1;
{if TT = "00" then Q..........................
if dem1= dem2 then dem1<=0;
pr_state <=nx_state;
end if ;}-- doạn này chưa biết xử lý sao cả.
end process;
process(pr_state)
begin
case pr_state is
when st0 => LED<="100001";
dem2 <=25;
TT <= "00"
nx_state<=st1;
when st1 => LED<="100010";
dem2 <=5;
TT <= "01"
nx_state<=st2;
when st2 => LED<="001100";
dem2 <=35;
TT <= "10"
nx_state<=st3;
when st3 => LED<="010100";
dem2 <=5;
TT <= "11"
nx_state<=st0;
end case;
end process;
--*******************************************
process(sel)
begin
case sel is
when '0'=> dk <= "10";SEG7<=GM(QT1);
when '1' => dk <= "01";SEG7<=GM(QT2);
when others => dk<="111";
end case;
end process;
end Behavioral;
Mình dùng máy trạng thái theo kiểu type định nghĩa, mình bị mắc phần không biết xử lý sao cho biết mỗi lần đổi trạng thái thì LED7 đoạn đếm lùi thời gian khắc nhau ;
code của mình :
type states is (st0,st1,st2,st3);
signal clk1: std_logic;
signal TT : std_logic_vector (1 downto 0);
signal pr_state,nx_state: states ;
signal dem1,dem2 : integer range 0 to 40;
signal sel :std_logic_vector (1 downto 0);
--signal bcd: std_logic_vector(11 downto 0);
begin
--************************************************** ******
FUNCTION GM(X1: IN STD_LOGIC_VECTOR (3 downto 0)) RETURN
STD_LOGIC_VECTOR IS
VARIABLE Z1: STD_LOGIC_VECTOR (6 downto 0);
begin
CASE X1 IS
WHEN "0000" => Z1 := "1000000";
WHEN "0001" => Z1 := "1111001";
WHEN "0010" => Z1 := "0100100";
WHEN "0011" => Z1 := "0110000";
WHEN "0100" => Z1 := "0011001";
WHEN "0101" => Z1 := "0010010";
WHEN "0110" => Z1 := "0000010";
WHEN "0111" => Z1 := "1111000";
WHEN "1000" => Z1 := "0000000";
WHEN "1001" => Z1 := "0010000";
WHEN OTHERS => Z1 := "1111111";
END CASE;
RETURN Z1;
END GIAI_MA;
--************************************************** *******
process (clk)
variable chia:integer range 0 to 1000;
begin
if clk='1' and clk'event then
chia:=chia+1; sel<=sel+1; end if;
if chia=1000 then
clk1<='1' ;
else clk1<='0' ;end if;
end process;
--************************************************** *******
process (clk1,clr)
variable QT1,QT2: STD_LOGIC_VECTOR (3 downto 0);
begin
if clr ='0' then pr_state <= st0;TT:="00";
elsif clk1='1' and clk1'event then dem1<= dem1+1;
{if TT = "00" then Q..........................
if dem1= dem2 then dem1<=0;
pr_state <=nx_state;
end if ;}-- doạn này chưa biết xử lý sao cả.
end process;
process(pr_state)
begin
case pr_state is
when st0 => LED<="100001";
dem2 <=25;
TT <= "00"
nx_state<=st1;
when st1 => LED<="100010";
dem2 <=5;
TT <= "01"
nx_state<=st2;
when st2 => LED<="001100";
dem2 <=35;
TT <= "10"
nx_state<=st3;
when st3 => LED<="010100";
dem2 <=5;
TT <= "11"
nx_state<=st0;
end case;
end process;
--*******************************************
process(sel)
begin
case sel is
when '0'=> dk <= "10";SEG7<=GM(QT1);
when '1' => dk <= "01";SEG7<=GM(QT2);
when others => dk<="111";
end case;
end process;
end Behavioral;
Comment