通用寄存器.txt
上传用户:easylife05
上传日期:2013-03-21
资源大小:42k
文件大小:2k
源码类别:

VHDL/FPGA/Verilog

开发平台:

C/C++

  1. -- Universal Register
  2. -- This design is a universal register which can be used as a straightforward storage register, a bi-directional shift register, an up counter and a down counter. 
  3. -- The register can be loaded from a set of parallel data inputs and the mode is controlled by a 3-bit input. 
  4. -- The 'termcnt' (terminal count) output goes high when the register contains zero. 
  5. -- download from: www.fpga.com.cn & www.pld.com.cn
  6. LIBRARY ieee;
  7. USE ieee.Std_logic_1164.ALL;
  8. USE ieee.Std_logic_unsigned.ALL;
  9. ENTITY unicntr IS
  10.    GENERIC(n : Positive := 8);   --size of counter/shifter   
  11.    PORT(clock, serinl, serinr : IN Std_logic;   --serial inputs 
  12.         mode : IN Std_logic_vector(2 DOWNTO 0);   --mode control
  13.         datain : IN Std_logic_vector((n-1) DOWNTO 0);   --parallel inputs
  14.         dataout : OUT Std_logic_vector((n-1) DOWNTO 0); --parallel outputs
  15.         termcnt : OUT Std_logic);    --terminal count output
  16. END unicntr;
  17. ARCHITECTURE v1 OF unicntr IS
  18.    SIGNAL int_reg : Std_logic_vector((n-1) DOWNTO 0);
  19. BEGIN
  20.    main_proc : PROCESS
  21.    BEGIN
  22.       WAIT UNTIL rising_edge(clock);
  23.          CASE mode IS
  24.             --reset
  25.             WHEN "000" => int_reg <= (OTHERS => '0'); 
  26.             --parallel load
  27.             WHEN "001" => int_reg <= datain;          
  28.             --count up 
  29.             WHEN "010" => int_reg <= int_reg + 1;     
  30.             --count down 
  31.             WHEN "011" => int_reg <= int_reg - 1;   
  32.             --shift left
  33.             WHEN "100" => int_reg <= int_reg((n-2) DOWNTO 0) & serinl;     
  34.             --shift right
  35.             WHEN "101" => int_reg <= serinr & int_reg((n-1) DOWNTO 1);     
  36.             --do nothing
  37.             WHEN OTHERS => NULL; 
  38.          END CASE;
  39.    END PROCESS;
  40.    det_zero : PROCESS(int_reg) --detects when count is 0
  41.    BEGIN
  42.       termcnt <= '1';
  43.       FOR i IN int_reg'Range LOOP
  44.          IF int_reg(i) = '1' THEN 
  45.             termcnt <= '0';
  46.             EXIT;
  47.          END IF;
  48.       END LOOP;
  49.    END PROCESS;
  50.    --connect internal register to dataout port
  51.    dataout <= int_reg;
  52. END v1;