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

📄 pie.vhd

📁 pie编码器,将串行数据并行输出的一种常用编码
💻 VHD
字号:
LIBRARY IEEE;
USE IEEE.Std_Logic_1164.ALL;

ENTITY PIE IS
   PORT (  rst   :  IN    Std_Logic ;
           clk   :  IN    Std_Logic ;
           le    :  IN    Std_Logic ;
           din   :  IN    Std_Logic_Vector(7 DOWNTO 0);
           dout  :  OUT   Std_Logic );
END PIE ;

ARCHITECTURE behav OF PIE IS
 SIGNAL state   : Std_Logic_Vector(3 DOWNTO 0);
 SIGNAL cout   : Integer Range 0 To 40;
 SIGNAL data    : Std_Logic_Vector(7 DOWNTO 0);

BEGIN
   
  PROCESS(rst,clk)
  BEGIN
IF rst='1' THEN
  state <= "0000" ;
  cout <= 0 ;
  dout <= '1' ;

ELSIF clk'event AND clk='1' THEN
 CASE state IS
    WHEN "0000"    =>
      cout <= 0 ; 
      data <= "00000000" ;
      dout <= '1' ;
         IF le='1' THEN
          state <= "0001" ;
         
               ELSE
                 state <= "0000" ;
         END IF ;

    WHEN "0001"    =>  
      data <= din ;
      state <= "0010" ;
   
    WHEN "0010"    =>  
      IF cout<10 THEN
        cout <= cout+1 ;
        dout <= '0' ;

      ELSIF cout>=10 AND cout<15 THEN 
        cout <= cout+1 ;
        dout <= '1' ;

      ELSIF cout>=15 AND cout<20 THEN 
        cout <= cout+1 ;
        dout <= '0' ;      

      ELSIF cout>=20 AND cout<35 THEN 
        cout <= cout+1 ;
        dout <= '1' ;

      ELSIF cout>=35 AND cout<39 THEN 
        cout <= cout+1 ;
        dout <= '0' ;    

      ELSIF cout>=39 THEN 
        cout <= 0 ;
        state <= "0011" ;  

      END IF ;

    WHEN "0011"    =>  
      IF data(7)='1'  THEN
           
           IF  cout<15 THEN 
             cout <= cout+1 ;
             dout <= '1' ;

           ELSIF cout>=15 AND cout<19 THEN 
             cout <= cout+1 ;
             dout <= '0' ;

           ELSIF cout>=19 THEN 
             cout <= 0 ;
             state <= "0100" ; 

           END IF ;

      ELSIF data(7)='0'  THEN
           
           IF  cout<5 THEN 
             cout <= cout+1 ;
             dout <= '1' ;

           ELSIF cout>=5 AND cout<9 THEN 
             cout <= cout+1 ;
             dout <= '0' ;

           ELSIF cout>=9 THEN 
             cout <= 0 ;
             state <= "0100" ; 

           END IF ;

      END IF ;

    WHEN "0100"    =>  
      IF data(6)='1'  THEN
           
           IF  cout<15 THEN 
             cout <= cout+1 ;
             dout <= '1' ;

           ELSIF cout>=15 AND cout<19 THEN 
             cout <= cout+1 ;
             dout <= '0' ;

           ELSIF cout>=19 THEN 
             cout <= 0 ;
             state <= "0101" ; 

           END IF ;

      ELSIF data(6)='0'  THEN
           
           IF  cout<5 THEN 
             cout <= cout+1 ;
             dout <= '1' ;

           ELSIF cout>=5 AND cout<9 THEN 
             cout <= cout+1 ;
             dout <= '0' ;

           ELSIF cout>=9 THEN 
             cout <= 0 ;
             state <= "0101" ; 

           END IF ;

      END IF ;

    WHEN "0101"    =>  
      IF data(5)='1'  THEN
           
           IF  cout<15 THEN 
             cout <= cout+1 ;
             dout <= '1' ;

           ELSIF cout>=15 AND cout<19 THEN 
             cout <= cout+1 ;
             dout <= '0' ;

           ELSIF cout>=19 THEN 
             cout <= 0 ;
             state <= "0110" ; 

           END IF ;

      ELSIF data(5)='0'  THEN
           
           IF  cout<5 THEN 
             cout <= cout+1 ;
             dout <= '1' ;

           ELSIF cout>=5 AND cout<9 THEN 
             cout <= cout+1 ;
             dout <= '0' ;

           ELSIF cout>=9 THEN 
             cout <= 0 ;
             state <= "0110" ; 

           END IF ;

      END IF ;

    WHEN "0110"    =>  
      IF data(4)='1'  THEN
           
           IF  cout<15 THEN 
             cout <= cout+1 ;
             dout <= '1' ;

           ELSIF cout>=15 AND cout<19 THEN 
             cout <= cout+1 ;
             dout <= '0' ;

           ELSIF cout>=19 THEN 
             cout <= 0 ;
             state <= "0111" ; 

           END IF ;

      ELSIF data(4)='0'  THEN
           
           IF  cout<5 THEN 
             cout <= cout+1 ;
             dout <= '1' ;

           ELSIF cout>=5 AND cout<9 THEN 
             cout <= cout+1 ;
             dout <= '0' ;

           ELSIF cout>=9 THEN 
             cout <= 0 ;
             state <= "0111" ; 

           END IF ;

      END IF ;

    WHEN "0111"    =>  
      IF data(3)='1'  THEN
           
           IF  cout<15 THEN 
             cout <= cout+1 ;
             dout <= '1' ;

           ELSIF cout>=15 AND cout<19 THEN 
             cout <= cout+1 ;
             dout <= '0' ;

           ELSIF cout>=19 THEN 
             cout <= 0 ;
             state <= "1000" ; 

           END IF ;

      ELSIF data(3)='0'  THEN
           
           IF  cout<5 THEN 
             cout <= cout+1 ;
             dout <= '1' ;

           ELSIF cout>=5 AND cout<9 THEN 
             cout <= cout+1 ;
             dout <= '0' ;

           ELSIF cout>=9 THEN 
             cout <= 0 ;
             state <= "1000" ; 

           END IF ;

      END IF ;

    WHEN "1000"    =>  
      IF data(2)='1'  THEN
           
           IF  cout<15 THEN 
             cout <= cout+1 ;
             dout <= '1' ;

           ELSIF cout>=15 AND cout<19 THEN 
             cout <= cout+1 ;
             dout <= '0' ;

           ELSIF cout>=19 THEN 
             cout <= 0 ;
             state <= "1001" ; 

           END IF ;

      ELSIF data(2)='0'  THEN
           
           IF  cout<5 THEN 
             cout <= cout+1 ;
             dout <= '1' ;

           ELSIF cout>=5 AND cout<9 THEN 
             cout <= cout+1 ;
             dout <= '0' ;

           ELSIF cout>=9 THEN 
             cout <= 0 ;
             state <= "1001" ; 

           END IF ;

      END IF ;

    WHEN "1001"    =>  
      IF data(1)='1'  THEN
           
           IF  cout<15 THEN 
             cout <= cout+1 ;
             dout <= '1' ;

           ELSIF cout>=15 AND cout<19 THEN 
             cout <= cout+1 ;
             dout <= '0' ;

           ELSIF cout>=19 THEN 
             cout <= 0 ;
             state <= "1010" ; 

           END IF ;

      ELSIF data(1)='0'  THEN
           
           IF  cout<5 THEN 
             cout <= cout+1 ;
             dout <= '1' ;

           ELSIF cout>=5 AND cout<9 THEN 
             cout <= cout+1 ;
             dout <= '0' ;

           ELSIF cout>=9 THEN 
             cout <= 0 ;
             state <= "1010" ; 

           END IF ;

      END IF ;

    WHEN OTHERS    =>  
      IF data(0)='1'  THEN
           
           IF  cout<15 THEN 
             cout <= cout+1 ;
             dout <= '1' ;

           ELSIF cout>=15 AND cout<19 THEN 
             cout <= cout+1 ;
             dout <= '0' ;

           ELSIF cout>=19 THEN 
             cout <= 0 ;
             state <= "0000" ; 

           END IF ;

      ELSIF data(0)='0'  THEN
           
           IF  cout<5 THEN 
             cout <= cout+1 ;
             dout <= '1' ;

           ELSIF cout>=5 AND cout<10 THEN 
             cout <= cout+1 ;
             dout <= '0' ;

           ELSIF cout>=10 THEN 
             cout <= 0 ;
             data <= "00000000" ;
             state <= "0000" ; 

           END IF ;

      END IF ;

 END CASE ;

END IF ;

END PROCESS ;

END ;



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -