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

📄 cal.vhd

📁 用VHDL写的计算器
💻 VHD
字号:
library ieee;
use ieee.std_logic_1164.all;
ENTITY cal IS
PORT ( 
         clk,reset,enable: in std_logic;
         DATAIN:           IN STD_LOGIC_vector(3 downto 0); 
         Q :               OUT STD_LOGIC_VECTOR(23 DOWNTO 0));
END cal;
ARCHITECTURE behav OF cal IS
component bcd is
port(
     SAa, SAb: in std_logic_vector(3 downto 0);
     operator: in std_logic;
     sum: out std_logic_vector(7 downto 0) );
end component;
TYPE states IS (st0, st1, st2, st3,st4);      
SIGNAL STX : states  ;
signal va,vb:std_logic_vector(3 downto 0);
signal opin:std_logic;
signal op:std_logic_vector(3 downto 0);
signal tempsum:std_logic_vector(7 downto 0);
signal tempQ:std_logic_vector(23 downto 0);  
BEGIN                          
    COMREG : PROCESS(CLK,RESET)  
             BEGIN 
                IF RESET ='1' 
                THEN    STX <= ST0;
    ELSIF CLK'EVENT AND CLK = '1' THEN    CASE STX IS           
        WHEN st0 => IF ((not datain(3)) or ((not datain(2) and (not datain(1)))))='1' and enable='1' THEN  
        STX <= st1;
        va<=datain; 
        else
        va<="1111";
        END IF;
        WHEN st1 => IF DATAIN = "1010"  and enable='1'
        THEN STX <= st2;
             opin<='0';
             op<=datain;
        elsif datain="1011" and enable='1'
        then STX<=st2;
             opin<='1';
             op<=datain;
        elsif  ((not datain(3)) or ((not datain(2) and (not datain(1)))))='1' and enable='1'
        THEN va<=datain;
        else 
           op<="1111";
        end if;
        WHEN st2 => IF ((not datain(3)) or ((not datain(2) and (not datain(1)))))='1' and enable='1' 
        THEN  STX <= st3;
              vb<=datain; 
            elsif datain="1010" and enable='1' then
            opin<='0';
            op<=datain;
            elsif datain="1011" and enable='1' then
            opin<='1';
            op<=datain;
            else vb<="1111";    
            END IF;
        WHEN st3=>  IF DATAIN = "1100" and enable ='1' 
        THEN  STX <= st4;
                    elsif ((not datain(3)) or ((not datain(2) and (not datain(1)))))='1' and enable='1' then
              vb<=datain; 
        END IF;
        WHEN st4=>  IF DATAIN = "1101" and enable='1' 
        THEN  STX <= st0;
        END IF;
        WHEN OTHERS => STX <= st0; 
     END CASE ;
   END IF;
END PROCESS COMREG ;
u1:bcd PORT MAP(SAa=>va,SAb=>vb,operator=>opin,sum=>tempsum);
COM1: PROCESS(STX,va,vb,op,tempsum) 
BEGIN 
  CASE STX IS           
    WHEN st0 => 
     tempQ<="111111111111111111111111" ; 
    WHEN st1 =>    
     tempQ(23 downto 20)<=va;
     tempQ(19 downto 0)<="11111111111111111111";                
    WHEN st2 => 
     tempQ(23 downto 20)<=va;
     tempQ(19 downto 16)<=op;
     tempQ(15 downto 0)<="1111111111111111";
    WHEN st3=>  
     tempQ(23 downto 20)<=va;
     tempQ(19 downto 16)<=op;
     tempQ(15 downto 12)<=vb;
     tempQ(11 downto 0)<="111111111111";    
    WHEN st4=> 
     tempQ(23 downto 20)<=va;
     tempQ(19 downto 16)<=op;
     tempQ(15 downto 12)<=vb;
     tempQ(11 downto 8)<="1100";
     tempQ(7 downto 0)<=tempsum;
    WHEN OTHERS => tempQ <= "111111111111111111111111";                                                
  END CASE ;
END PROCESS COM1 ;
Q<=tempQ;
END behav; 

⌨️ 快捷键说明

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