Advertisement
Simone_Monaco

Untitled

May 18th, 2018
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VHDL 4.78 KB | None | 0 0
  1. LIBRARY ieee;
  2. USE ieee.std_logic_1164.all;
  3. USE ieee.numeric_std.all;
  4.  
  5. ENTITY control_unit IS
  6.     PORT(add_V_H, MSB_sum,
  7.          CNTn_is0_H, CNTn_is1_H, CNTn_is2_H, CNTA_is1023_H,
  8.          CNTn_sign_H,
  9.          Clock, START, Resetn : IN STD_LOGIC;
  10.                
  11.          memA_WR_H, memA_RD_H, memA_CS_H,
  12.          memB_WR_H, memB_RD_H, memB_CS_H,
  13.          mux2to1_sign_H, mux2to1_MINMAX, mux2to1_V_H, mux2to1_DONE_H,
  14.          regFilter_RST_H, regAvg_RST_H,
  15.          CNT_RST_H,
  16.          regAvg_EN_H,
  17.          CNTn_EN_H, CNTn1_EN_H, CNTn3_EN_H, CNTA_EN_H,
  18.          addFilter_sub_H,
  19.          DONE_out : OUT STD_LOGIC;
  20.          
  21.          mux4to1_sel, mux4to1_CNT : OUT STD_LOGIC_VECTOR(1 DOWNTO 0));
  22. END control_unit;
  23.  
  24. ARCHITECTURE behavior OF control_unit IS
  25.    
  26.     TYPE STATE_TYPE IS (IDLE, LOAD_A, LOAD_Xn1, LOAD_Xn_EN_AVG, LOAD_Xn3, SIGN, WAIT_SIGN, OVERFLOW_MIN, OVERFLOW_MAX, WRITE_B, COUNT, DONE);
  27.     SIGNAL state : STATE_TYPE;
  28.    
  29. BEGIN
  30.     state_updating: PROCESS(Resetn,Clock)
  31.     BEGIN
  32.         IF Resetn='0' THEN
  33.             state <= IDLE;
  34.         ELSIF (Clock'EVENT AND Clock='1') THEN
  35.             CASE state IS
  36.                    
  37.                 WHEN IDLE =>
  38.                     IF START='1' THEN
  39.                         state <= LOAD_A;
  40.                     ELSE
  41.                         state <= IDLE;
  42.                     END IF;
  43.                
  44.                 WHEN LOAD_A =>
  45.                     IF CNTA_is1023_H='1' THEN
  46.                         state <= LOAD_Xn1;
  47.                     ELSE
  48.                         state <= LOAD_A;
  49.                     END IF;
  50.                
  51.                 WHEN LOAD_Xn1 =>
  52.                     state <= LOAD_Xn_EN_AVG;
  53.                  
  54.                 WHEN LOAD_Xn_EN_AVG =>
  55.                     IF (CNTn_is0_H OR CNTn_is1_H OR CNTn_is2_H)='1' THEN
  56.                         IF CNTn_sign_H='1' THEN
  57.                           state <= SIGN;
  58.                       ELSE
  59.                         state <= WAIT_SIGN;
  60.                       END IF;
  61.                     ELSE
  62.                         state <= LOAD_Xn3;
  63.                     END IF;
  64.                    
  65.                 WHEN LOAD_Xn3 =>
  66.                     IF CNTn_sign_H='1' THEN
  67.                         state <= SIGN;
  68.                     ELSE
  69.                       state <= WAIT_SIGN;
  70.                     END IF;
  71.                                        
  72.                 WHEN SIGN =>
  73.                     state <= WAIT_SIGN;
  74.                
  75.                 WHEN WAIT_SIGN =>
  76.                   IF add_V_H='1' THEN
  77.                         IF MSB_sum='0' THEN
  78.                             state <= OVERFLOW_MAX;
  79.                         ELSE
  80.                             state <= OVERFLOW_MIN;
  81.                         END IF;
  82.                     ELSE
  83.                         state <= WRITE_B;
  84.                     END IF;
  85.                    
  86.                 WHEN OVERFLOW_MAX =>
  87.                     IF CNTn_is0_H='1' THEN
  88.                         state <= DONE;
  89.                     ELSE
  90.                         state <= COUNT;
  91.                     END IF;
  92.                    
  93.                 WHEN OVERFLOW_MIN =>
  94.                     IF CNTn_is0_H='1' THEN
  95.                         state <= DONE;
  96.                     ELSE
  97.                         state <= COUNT;
  98.                     END IF;
  99.                    
  100.                 WHEN WRITE_B =>
  101.                     IF CNTn_is0_H='1' THEN
  102.                         state <= DONE;
  103.                     ELSE
  104.                         state <= COUNT;
  105.                     END IF;
  106.                    
  107.                 WHEN COUNT =>
  108.                     IF CNTn_is1_H='1' THEN
  109.                         state <= LOAD_Xn_EN_AVG;
  110.                     ELSE
  111.                         state <= LOAD_Xn1;
  112.                     END IF;
  113.                    
  114.                 WHEN DONE =>
  115.                     IF START='1' THEN
  116.                         state <= DONE;
  117.                     ELSE
  118.                         state <= IDLE;
  119.                     END IF;
  120.                    
  121.                 WHEN OTHERS =>
  122.                     state <= IDLE;
  123.             END CASE;
  124.         END IF;
  125.     END PROCESS state_updating;    
  126.        
  127.     output_generation: PROCESS(state)
  128.     BEGIN
  129.         memA_WR_H <= '0'; memA_RD_H <= '0'; memA_CS_H <= '0';  
  130.         memB_WR_H <= '0'; memB_RD_H <= '0'; memB_CS_H <= '0';
  131.         mux2to1_sign_H <= '0'; mux2to1_MINMAX <= '0'; mux2to1_V_H <= '0'; mux2to1_DONE_H <= '0';
  132.         regFilter_RST_H <= '0'; regAvg_RST_H <= '0';
  133.         CNT_RST_H <= '0';
  134.         regAvg_EN_H <= '0';
  135.         CNTn_EN_H <= '0'; CNTn1_EN_H <= '0'; CNTn3_EN_H <= '0'; CNTA_EN_H <= '0';
  136.         addFilter_sub_H <= '0';
  137.         DONE_out <= '0';
  138.        
  139.         mux4to1_sel <= "00"; mux4to1_CNT <= "00";
  140.        
  141.         CASE state IS
  142.            
  143.             WHEN IDLE =>
  144.                 regFilter_RST_H <= '1';
  145.                 regAvg_RST_H <= '1';
  146.                 CNT_RST_H <= '1';
  147.                
  148.                
  149.             WHEN LOAD_A =>
  150.                 memA_CS_H <= '1';
  151.                 memA_WR_H <= '1';
  152.                 CNTA_EN_H <= '1';
  153.                 regFilter_RST_H <= '1';
  154.                
  155.             WHEN LOAD_Xn1 =>
  156.                 memA_RD_H <= '1';
  157.                 mux4to1_CNT <= "01";
  158.                 memA_CS_H <= '1';
  159.        
  160.             WHEN LOAD_Xn_EN_AVG =>
  161.                mux4to1_sel <= "01";
  162.                regAvg_EN_H <= '1';
  163.                mux4to1_CNT <= "10";
  164.                memA_CS_H <= '1';
  165.                    memA_RD_H <= '1';
  166.  
  167.             WHEN LOAD_Xn3 =>
  168.                 mux4to1_sel <= "10";
  169.                 addFilter_sub_H <= '1';
  170.                 mux4to1_CNT <= "11";
  171.                 memA_CS_H <= '1';
  172.                 memA_RD_H <= '1';
  173.                
  174.             WHEN SIGN =>
  175.                 mux4to1_sel <= "11";
  176.                 mux2to1_sign_H <='1';
  177.                 addFilter_sub_H <= '1';
  178.            
  179.             WHEN WAIT_SIGN =>
  180.                 mux4to1_sel <= "11";
  181.                   mux2to1_sign_H <='1';
  182.                   addFilter_sub_H <= '0';
  183.                  
  184.             WHEN OVERFLOW_MIN =>
  185.                 mux2to1_MINMAX <= '1';
  186.                 mux2to1_V_H <= '1';
  187.                 memB_CS_H <= '1';
  188.                 memB_WR_H <= '1';
  189.                 mux4to1_CNT <= "10";
  190.                
  191.             WHEN OVERFLOW_MAX =>
  192.                 mux2to1_MINMAX <= '0';
  193.                 mux2to1_V_H <= '1';
  194.                 memB_CS_H <= '1';
  195.                 memB_WR_H <= '1';
  196.                 mux4to1_CNT <= "10";           
  197.            
  198.             WHEN WRITE_B =>
  199.                 memB_CS_H <= '1';
  200.                 memB_WR_H <= '1';
  201.                 mux4to1_CNT <= "10";
  202.                
  203.             WHEN COUNT =>
  204.               regFilter_RST_H <= '1';
  205.                 CNTn_EN_H <= '1';
  206.                 CNTn1_EN_H <= '1';
  207.                 CNTn3_EN_H <= '1';
  208.                
  209.             WHEN DONE =>
  210.                 DONE_out <= '1';
  211.                 mux2to1_DONE_H <= '1';
  212.                
  213.         END CASE;
  214.     END PROCESS output_generation; 
  215. END behavior;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement