1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
| LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; ENTITY CALCULATOR IS PORT(AIN,BIN:IN STD_LOGIC_VECTOR(9 DOWNTO 0); CLK:IN STD_LOGIC; CH:IN STD_LOGIC_VECTOR(1 DOWNTO 0); A,B,C,D,E,F,G:OUT STD_LOGIC_VECTOR(0 TO 6)); END ENTITY; ARCHITECTURE BEHAV OF CALCULATOR IS TYPE STATES IS (JIA,JIAN,CHENG,CHU);
SIGNAL C_ST,N_ST:STATES:=JIA; SIGNAL RESULT:STD_LOGIC_VECTOR(19 DOWNTO 0); SIGNAL BCD:STD_LOGIC_VECTOR(27 DOWNTO 0); BEGIN COM:PROCESS(AIN,BIN,CH,C_ST) VARIABLE DATA:STD_LOGIC_VECTOR(19 DOWNTO 0); BEGIN DATA:="00000000000000000000"; CASE C_ST IS WHEN JIA => DATA(10 DOWNTO 0):=('0'&AIN)+('0'&BIN);RESULT<=DATA; IF CH="00" THEN N_ST<=JIA; ELSIF CH="01" THEN N_ST<=JIAN; ELSIF CH="10" THEN N_ST<=CHENG; ELSIF CH="11" THEN N_ST<=CHU; END IF; WHEN JIAN => DATA(9 DOWNTO 0):=AIN-BIN;RESULT<=DATA; IF CH="00" THEN N_ST<=JIA; ELSIF CH="01" THEN N_ST<=JIAN; ELSIF CH="10" THEN N_ST<=CHENG; ELSIF CH="11" THEN N_ST<=CHU; END IF; WHEN CHENG => DATA:=AIN*BIN;RESULT<=DATA; IF CH="00" THEN N_ST<=JIA; ELSIF CH="01" THEN N_ST<=JIAN; ELSIF CH="10" THEN N_ST<=CHENG; ELSIF CH="11" THEN N_ST<=CHU; END IF; WHEN CHU => DATA(4 DOWNTO 0):=CONV_STD_LOGIC_VECTOR(CONV_INTEGER(AIN)/CONV_INTEGER(BIN),5);RESULT<=DATA; IF CH="00" THEN N_ST<=JIA; ELSIF CH="01" THEN N_ST<=JIAN; ELSIF CH="10" THEN N_ST<=CHENG; ELSIF CH="11" THEN N_ST<=CHU; END IF; END CASE; END PROCESS COM; REG:PROCESS(CLK) BEGIN IF CLK'EVENT AND CLK='1' THEN C_ST<=N_ST; END IF; END PROCESS REG; BCDT:PROCESS(RESULT) VARIABLE TEMP:INTEGER; VARIABLE DATA_TEMP:INTEGER; VARIABLE BCD_TEMP:STD_LOGIC_VECTOR(27 DOWNTO 0); BEGIN BCD_TEMP:=(OTHERS=>'0'); DATA_TEMP:=CONV_INTEGER(RESULT); FOR K IN 0 TO 6 LOOP TEMP:=DATA_TEMP REM 10; BCD_TEMP(3+4*K DOWNTO 4*K):=CONV_STD_LOGIC_VECTOR(TEMP,4); DATA_TEMP:=(DATA_TEMP-TEMP)/10; IF DATA_TEMP=0 THEN EXIT; END IF; END LOOP; BCD<=BCD_TEMP; END PROCESS BCDT; WITH BCD(3 DOWNTO 0) SELECT A<="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", "0000000" WHEN OTHERS; WITH BCD(7 DOWNTO 4) SELECT B<="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", "0000000" WHEN OTHERS; WITH BCD(11 DOWNTO 8) SELECT C<="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", "0000000" WHEN OTHERS; WITH BCD(15 DOWNTO 12) SELECT D<="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", "0000000" WHEN OTHERS; WITH BCD(19 DOWNTO 16) SELECT E<="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", "0000000" WHEN OTHERS; WITH BCD(23 DOWNTO 20) SELECT F<="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", "0000000" WHEN OTHERS; WITH BCD(27 DOWNTO 24) SELECT G<="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", "0000000" WHEN OTHERS; END BEHAV;
|