伪随机数产生器.vhd
上传用户:easylife05
上传日期:2013-03-21
资源大小:42k
文件大小:8k
源码类别:

VHDL/FPGA/Verilog

开发平台:

C/C++

  1. -----------------------------------------------------------------------------
  2. --
  3. --      The following information has been generated by Exemplar Logic and
  4. --      may be freely distributed and modified.
  5. --
  6. --      Design name : pseudorandom
  7. --
  8. --      Purpose : This design is a pseudorandom number generator. This design 
  9. --        will generate an 8-bit random number using the polynomial p(x) = x + 1.
  10. --        This system has a seed generator and will generate 2**8 - 1 unique
  11. --        vectors in pseudorandom order. These vectors are stored in a ram which
  12. --        samples the random number every 32 clock cycles. This variance of a 
  13. --        priority encoded seed plus a fixed sampling frequency provides a truely
  14. --        random number.
  15. --
  16. --        This design used VHDL-1993 methods for coding VHDL.
  17. --
  18. ----------------------------------------------------------------------------
  19. Library IEEE ;
  20. use IEEE.std_logic_1164.all ;
  21. use IEEE.std_logic_arith.all ;
  22. entity divide_by_n is
  23.    generic (data_width    : natural := 8 );
  24.    port (
  25.          data_in  : in  UNSIGNED(data_width - 1 downto 0) ;
  26.          load     : in  std_logic ;
  27.          clk      : in  std_logic ;
  28.          reset    : in  std_logic ;
  29.          divide   : out std_logic
  30.         );
  31. end divide_by_n ;
  32. architecture rtl of divide_by_n is  
  33.   signal count_reg : UNSIGNED(data_width - 1 downto 0) ;
  34.   constant max_count : UNSIGNED(data_width - 1 downto 0) := (others => '1') ;
  35.   begin
  36.   cont_it :  process(clk,reset)
  37.        begin
  38.           if (reset = '1') then
  39.            count_reg <= (others => '0') ;
  40.           elsif (clk = '1' and clk'event) then
  41.             if (load = '1') then
  42.                count_reg <= data_in ;
  43.             else
  44.                 count_reg <=  count_reg + "01" ;
  45.             end if ;
  46.           end if;
  47.         end process ;
  48.    divide <= '1' when count_reg = max_count else '0' ;
  49. end RTL ;
  50. Library IEEE ;
  51. use IEEE.std_logic_1164.all ;
  52. use IEEE.std_logic_arith.all ;
  53. entity dlatrg is
  54.    generic (data_width    : natural := 16 );
  55.    port (
  56.          data_in  : in  UNSIGNED(data_width - 1 downto 0) ;
  57.          clk      : in  std_logic ;
  58.          reset    : in  std_logic ;
  59.          data_out : out UNSIGNED(data_width - 1 downto 0)
  60.         );
  61. end dlatrg ;
  62. architecture rtl of dlatrg is
  63.   begin
  64.   latch_it : process(data_in,clk,reset)
  65.         begin
  66.           if (reset = '1') then
  67.             data_out <= (others => '0') ;
  68.           elsif (clk = '1') then
  69.             data_out <= data_in ;
  70.           end if;
  71.         end process ;
  72. end RTL ;
  73. Library IEEE ;
  74. use IEEE.std_logic_1164.all ;
  75. use IEEE.std_logic_arith.all ;
  76. entity lfsr is
  77.    generic (data_width    : natural := 8 );
  78.    port (
  79.          clk      : in  std_logic ;
  80.          reset    : in  std_logic ;
  81.          data_out : out UNSIGNED(data_width - 1 downto 0)
  82.         );
  83. end lfsr ;
  84. architecture rtl of lfsr is  
  85.   signal feedback : std_logic ;
  86.   signal lfsr_reg : UNSIGNED(data_width - 1 downto 0) ;
  87.   begin
  88.     feedback <= lfsr_reg(7) xor lfsr_reg(0) ;
  89.   latch_it :  process(clk,reset)
  90.        begin
  91.           if (reset = '1') then
  92.            lfsr_reg <= (others => '0') ;
  93.           elsif (clk = '1' and clk'event) then
  94.             lfsr_reg <= lfsr_reg(lfsr_reg'high - 1 downto 0) & feedback ;
  95.           end if;
  96.         end process ;
  97.    data_out <= lfsr_reg ;
  98. end RTL ;
  99. Library IEEE ;
  100. use IEEE.std_logic_1164.all ;
  101. use IEEE.std_logic_arith.all ;
  102. entity priority_encoder is
  103.    generic (data_width    : natural := 25 ;
  104.             address_width : natural := 5 ) ;
  105.    port (
  106.          data    : in  UNSIGNED(data_width - 1 downto 0) ;
  107.          address : out UNSIGNED(address_width - 1 downto 0) ;
  108.          none    : out STD_LOGIC
  109.         );
  110. end priority_encoder ;
  111. architecture rtl of priority_encoder is
  112.   attribute SYNTHESIS_RETURN : STRING ;
  113.   
  114.   FUNCTION to_stdlogic (arg1:BOOLEAN)  RETURN STD_LOGIC IS
  115.       BEGIN
  116.       IF(arg1) THEN
  117.         RETURN('1') ;
  118.       ELSE
  119.         RETURN('0') ;
  120.       END IF ;
  121.   END ;
  122.     function to_UNSIGNED(ARG: INTEGER; SIZE: INTEGER) return UNSIGNED is
  123. variable result: UNSIGNED(SIZE-1 downto 0);
  124. variable temp: integer;
  125.         attribute SYNTHESIS_RETURN of result:variable is "FEED_THROUGH" ;
  126.     begin
  127. temp := ARG;
  128. for i in 0 to SIZE-1 loop
  129.     if (temp mod 2) = 1 then
  130. result(i) := '1';
  131.     else 
  132. result(i) := '0';
  133.     end if;
  134.     if temp > 0 then
  135. temp := temp / 2;
  136.     else
  137. temp := (temp - 1) / 2; 
  138.     end if;
  139. end loop;
  140. return result;
  141.     end;
  142.   constant zero : UNSIGNED(data_width downto 1) := (others => '0') ;
  143.   begin
  144. PRIO :  process(data)
  145.          variable temp_address : UNSIGNED(address_width - 1 downto 0) ;
  146.          begin
  147.           temp_address := (others => '0') ;
  148.           for i in data_width - 1 downto 0 loop
  149.             if (data(i) = '1') then
  150.               temp_address := to_unsigned(i,address_width) ;
  151.               exit ;
  152.             end if ;
  153.           end loop ;
  154.           address <= temp_address ;
  155.           none <= to_stdlogic(data = zero) ;
  156.         end process ;
  157. end RTL ;
  158. Library IEEE ;
  159. use IEEE.std_logic_1164.all ;
  160. use IEEE.std_logic_arith.all ;
  161. use IEEE.std_logic_unsigned.all ;
  162. entity ram is
  163.    generic (data_width    : natural := 8 ;
  164.             address_width  : natural := 8);
  165.    port (
  166.          data_in  : in  UNSIGNED(data_width - 1 downto 0) ;
  167.          address  : in  UNSIGNED(address_width - 1 downto 0) ;
  168.          we      : in  std_logic ;
  169.  clk     : in std_logic;
  170.          data_out : out UNSIGNED(data_width - 1 downto 0)
  171.         );
  172. end ram ;
  173. architecture rtl of ram is
  174.   type mem_type is array (2**address_width downto 0) of UNSIGNED(data_width - 1 downto 0) ;
  175.   signal mem : mem_type ;
  176.   signal addr_reg : unsigned (address_width -1 downto 0);
  177.   begin
  178.     data_out <= mem(conv_integer(addr_reg)) ;
  179.     I0 : process 
  180.    begin
  181.        wait until clk'event and clk = '1';
  182.         if (we = '1') then
  183.           mem(conv_integer(address)) <= data_in ;
  184.         end if ;
  185.     addr_reg <= address;
  186.     end process ;
  187. end RTL ;
  188. Library IEEE ;
  189. use IEEE.std_logic_1164.all ;
  190. use IEEE.std_logic_arith.all ;
  191. entity tbuf is
  192.    generic (data_width    : natural := 16 );
  193.    port (
  194.          data_in  : in  UNSIGNED(data_width - 1 downto 0) ;
  195.          en       : in  std_logic ;
  196.          data_out : out UNSIGNED(data_width - 1 downto 0)
  197.         );
  198. end tbuf ;
  199. architecture rtl of tbuf is
  200.   begin
  201.   three_state :  process(data_in,en)
  202.         begin
  203.           if (en = '1') then
  204.             data_out <=  data_in ;
  205.           else
  206.             data_out <= (others => 'Z') ;
  207.           end if;
  208.         end process ;
  209. end RTL ;
  210. Library IEEE ;
  211. use IEEE.std_logic_1164.all ;
  212. use IEEE.std_logic_arith.all ;
  213. entity pseudorandom is
  214.    generic (data_width    : natural := 8 );
  215.    port (
  216.          seed   : in  UNSIGNED (24 downto 0) ;
  217.          init   : in  UNSIGNED (4 downto 0) ;
  218.          load   : in  std_logic ;
  219.          clk    : in  std_logic ;
  220.          reset  : in  std_logic ;
  221.          read   : in  std_logic ;
  222.          write  : in  std_logic ;
  223.          rand   : out UNSIGNED (7 downto 0) ;
  224.          none   : out std_logic
  225.         );
  226. end pseudorandom ;
  227. architecture rtl of pseudorandom is  
  228.   signal latch_seed : UNSIGNED(24 downto 0) ;
  229.   signal encoder_address : UNSIGNED(4 downto 0) ;
  230.   signal random_data : UNSIGNED(7 downto 0) ;
  231.   signal write_enable : std_logic ;
  232.   signal ram_data : UNSIGNED(7 downto 0) ;
  233.   begin
  234.     I0 : entity work.dlatrg(rtl) 
  235.           generic map (25)
  236.           port map (seed,read,reset,latch_seed) ;
  237.     I1 : entity work.priority_encoder(rtl) 
  238.           generic map (25,5)
  239.           port map (latch_seed,encoder_address,none) ;
  240.     I2 : entity work.ram(rtl) 
  241.           generic map (8,5)
  242.           port map (random_data,encoder_address,write_enable,clk,ram_data) ;
  243.     I3 : entity work.tbuf(rtl) 
  244.           generic map (8)
  245.           port map (ram_data,write,rand) ;
  246.     I4 : entity work.lfsr(rtl) 
  247.           generic map (8)
  248.           port map (clk,reset,random_data) ;
  249.      I5 : entity work.divide_by_n(rtl) 
  250.           generic map (5)
  251.           port map (init,load,clk,reset,write_enable) ;
  252. end rtl ;