⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dividefrequency.txt

📁 如何用VHDL语言对时钟进行分频以达到计数目的
💻 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 + -