📄 dividefrequency.txt
字号:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
ENTITY count_60 IS
PORT(CLRN,CLK : IN STD_LOGIC;
segout : OUT std_logic_vector(6 DOWNTO 0);
scan1,scan2,scan3,scan4,scan5,scan6,scan7,scan8 : out std_logic ) ;
END count_60;
ARCHITECTURE a OF count_60 IS
type state is (S00,S01,S02,S03,S04,S05,S06,S07);
signal state_machine1 : state;
signal Qh2,Qh1,Qm2,Qm1,Qs2,Qs1,Qout :STD_LOGIC_VECTOR(3 downto 0);
signal Qclk :STD_LOGIC;
signal count:STD_LOGIC_VECTOR(9 downto 0);
BEGIN
//这就是分频进程,你可以看一下这是1000分频,2MHZ分频即把1111101000改为11110100001001000000同时改变qclk <=count(19)。我认为理解画出脉冲图有助于理解分频,周期的可以从图中读出。其他的方法楼上几位也说了,我只是提出z自己的一点小心得,希望对你有些帮助。
process(clk)
begin
if rising_edge(clk) then
if count="1111101000" then count <="0000000000";
else
count <=count+1;
end if;
end if;
qclk <=count(9);
end process;
PROCESS (qClk)
VARIABLE tmph2 :STD_LOGIC_VECTOR(3 downto 0);
VARIABLE tmph1 :STD_LOGIC_VECTOR(3 downto 0);
VARIABLE tmpm2 :STD_LOGIC_VECTOR(3 downto 0);
VARIABLE tmpm1 :STD_LOGIC_VECTOR(3 downto 0);
VARIABLE tmps2 :STD_LOGIC_VECTOR(3 downto 0);
VARIABLE tmps1 :STD_LOGIC_VECTOR(3 downto 0);
BEGIN
IF CLRN='0' THEN tmph2 := "0000";
tmph1 := "0000";
tmpm2 := "0000";
tmpm1 := "0000";
tmps2 := "0000";
tmps1 := "0000";
ELSE
IF (qClk'event AND qClk='1') THEN
IF ((tmps1="0100"and tmps2="0010")or tmps1="1001") THEN tmps1:="0000";
IF tmps2="0010" THEN tmps2:="0000";
IF ((tmpm1="0100"and tmpm2="0010")or tmpm1="1001") THEN tmpm1:="0000";
IF tmpm2="0010" THEN tmpm2:="0000";
IF ((tmph1="0100"and tmph2="0010")or tmph1="1001") THEN tmph1:="0000";
IF tmph2="0010" THEN tmph2:="0000";
ELSE tmph2:= tmph2+1;
END IF;
ELSE tmph1 := tmph1+1;
END IF;
ELSE tmpm2 := tmpm2+1;
END IF;
ELSE tmpm1 := tmpm1+1;
END IF;
ELSE tmps2 := tmps2+1;
END IF;
ELSE tmps1 := tmps1+1;
END IF;
END IF;
END IF;
Qh2 <=tmph2;Qh1 <=tmph1;Qm2 <=tmpm2;Qm1 <=tmpm1;Qs2 <=tmps2;Qs1 <=tmps1;
END PROCESS ;
process(CLK,CLRN)
begin
if CLRN='0' then
state_machine1 <=S00;
scan1 <= '0';scan2 <= '0';scan3 <= '0';scan4 <= '0';
scan5 <= '0';scan6 <= '0';scan7 <= '0';scan8 <= '0';
elsif rising_edge(CLK) then
case state_machine1 is
when S00=>
Qout <=Qs1; --显示数字1,片选高电平有效
scan1 <= '0';scan2 <= '0';scan3 <= '0';scan4 <= '0';
scan5 <= '0';scan6 <= '0';scan7 <= '0';scan8 <= '1';
state_machine1 <= S01;
when S01=>
Qout <=Qs2; --显示数字1,片选高电平有效
scan1 <= '0';scan2 <= '0';scan3 <= '0';scan4 <= '0';
scan5 <= '0';scan6 <= '0';scan7 <= '1';scan8 <= '0';
state_machine1 <= S02;
when S02=>
Qout <="1111"; --显示数字1,片选高电平有效
scan1 <= '0';scan2 <= '0';scan3 <= '0';scan4 <= '0';
scan5 <= '0';scan6 <= '1';scan7 <= '0';scan8 <= '0';
state_machine1 <= S03;
when S03=>
Qout <=Qm1; --显示数字1,片选高电平有效
scan1 <= '0';scan2 <= '0';scan3 <= '0';scan4 <= '0';
scan5 <= '1';scan6 <= '0';scan7 <= '0';scan8 <= '0';
state_machine1 <= S04;
when S04=>
Qout <=Qm2; --显示数字1,片选高电平有效
scan1 <= '0';scan2 <= '0';scan3 <= '0';scan4 <= '1';
scan5 <= '0';scan6 <= '0';scan7 <= '0';scan8 <= '0';
state_machine1 <= S05;
when S05=>
Qout <="1111"; --显示数字1,片选高电平有效
scan1 <= '0';scan2 <= '0';scan3 <= '1';scan4 <= '0';
scan5 <= '0';scan6 <= '0';scan7 <= '0';scan8 <= '0';
state_machine1 <= S06;
when S06=>
Qout <=Qh1; --显示数字1,片选高电平有效
scan1 <= '0';scan2 <= '1';scan3 <= '0';scan4 <= '0';
scan5 <= '0';scan6 <= '0';scan7 <= '0';scan8 <= '0';
state_machine1 <= S07;
when S07=>
Qout <=Qh2; --显示数字1,片选高电平有效
scan1 <= '1';scan2 <= '0';scan3 <= '0';scan4 <= '0';
scan5 <= '0';scan6 <= '0';scan7 <= '0';scan8 <= '0';
state_machine1 <= S00;
when others=> state_machine1 <=s00; --错误,重新开始
end case;
end if;
end process;
WITH Qout SELECT
segout <= "1111110" WHEN "0000",
"0110000" WHEN "0001",
"1101101" WHEN "0010",
"1111001" WHEN "0011",
"0110011" WHEN "0100",
"1011011" WHEN "0101",
"1011111" WHEN "0110",
"1110000" WHEN "0111",
"1111111" WHEN "1000",
"1111011" WHEN "1001",
"0000001" WHEN "1111",
"-------" WHEN OTHERS;
END a;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -