首页 伪随机数产生器

伪随机数产生器

举报
开通vip

伪随机数产生器伪随机数产生器 ----------------------------------------------------------------------------- -- -- The following information has been generated by Exemplar Logic and -- may be freely distributed and modified. -- -- Design name : pseudorandom -- -- Purpose : Thi...

伪随机数产生器
伪随机数产生器 ----------------------------------------------------------------------------- -- -- The following information has been generated by Exemplar Logic and -- may be freely distributed and modified. -- -- Design name : pseudorandom -- -- Purpose : This design is a pseudorandom number generator. This design -- will generate an 8-bit random number using the polynomial p(x) = x + 1. -- This system has a seed generator and will generate 2**8 - 1 unique -- vectors in pseudorandom order. These vectors are stored in a ram which -- samples the random number every 32 clock cycles. This variance of a -- priority encoded seed plus a fixed sampling frequency provides a truely -- random number. -- -- This design used VHDL-1993 methods for coding VHDL. -- ---------------------------------------------------------------------------- Library IEEE ; use IEEE.std_logic_1164.all ; use IEEE.std_logic_arith.all ; entity divide_by_n is generic (data_width : natural := 8 ); port ( data_in : in UNSIGNED(data_width - 1 downto 0) ; load : in std_logic ; clk : in std_logic ; reset : in std_logic ; divide : out std_logic ); end divide_by_n ; architecture rtl of divide_by_n is signal count_reg : UNSIGNED(data_width - 1 downto 0) ; constant max_count : UNSIGNED(data_width - 1 downto 0) := (others => '1') ; begin cont_it : process(clk,reset) begin if (reset = '1') then count_reg <= (others => '0') ; elsif (clk = '1' and clk'event) then if (load = '1') then count_reg <= data_in ; else count_reg <= count_reg + "01" ; end if ; end if; end process ; divide <= '1' when count_reg = max_count else '0' ; end RTL ; Library IEEE ; use IEEE.std_logic_1164.all ; use IEEE.std_logic_arith.all ; entity dlatrg is generic (data_width : natural := 16 ); port ( data_in : in UNSIGNED(data_width - 1 downto 0) ; clk : in std_logic ; reset : in std_logic ; data_out : out UNSIGNED(data_width - 1 downto 0) ); end dlatrg ; architecture rtl of dlatrg is begin latch_it : process(data_in,clk,reset) begin if (reset = '1') then data_out <= (others => '0') ; elsif (clk = '1') then data_out <= data_in ; end if; end process ; end RTL ; Library IEEE ; use IEEE.std_logic_1164.all ; use IEEE.std_logic_arith.all ; entity lfsr is generic (data_width : natural := 8 ); port ( clk : in std_logic ; reset : in std_logic ; data_out : out UNSIGNED(data_width - 1 downto 0) ); end lfsr ; architecture rtl of lfsr is signal feedback : std_logic ; signal lfsr_reg : UNSIGNED(data_width - 1 downto 0) ; begin feedback <= lfsr_reg(7) xor lfsr_reg(0) ; latch_it : process(clk,reset) begin if (reset = '1') then lfsr_reg <= (others => '0') ; elsif (clk = '1' and clk'event) then lfsr_reg <= lfsr_reg(lfsr_reg'high - 1 downto 0) & feedback ; end if; end process ; data_out <= lfsr_reg ; end RTL ; Library IEEE ; use IEEE.std_logic_1164.all ; use IEEE.std_logic_arith.all ; entity priority_encoder is generic (data_width : natural := 25 ; address_width : natural := 5 ) ; port ( data : in UNSIGNED(data_width - 1 downto 0) ; address : out UNSIGNED(address_width - 1 downto 0) ; none : out STD_LOGIC ); end priority_encoder ; architecture rtl of priority_encoder is attribute SYNTHESIS_RETURN : STRING ; FUNCTION to_stdlogic (arg1:BOOLEAN) RETURN STD_LOGIC IS BEGIN IF(arg1) THEN RETURN('1') ; ELSE RETURN('0') ; END IF ; END ; function to_UNSIGNED(ARG: INTEGER; SIZE: INTEGER) return UNSIGNED is variable result: UNSIGNED(SIZE-1 downto 0); variable temp: integer; attribute SYNTHESIS_RETURN of result:variable is "FEED_THROUGH" ; begin temp := ARG; for i in 0 to SIZE-1 loop if (temp mod 2) = 1 then result(i) := '1'; else result(i) := '0'; end if; if temp > 0 then temp := temp / 2; else temp := (temp - 1) / 2; end if; end loop; return result; end; constant zero : UNSIGNED(data_width downto 1) := (others => '0') ; begin PRIO : process(data) variable temp_address : UNSIGNED(address_width - 1 downto 0) ; begin temp_address := (others => '0') ; for i in data_width - 1 downto 0 loop if (data(i) = '1') then temp_address := to_unsigned(i,address_width) ; exit ; end if ; end loop ; address <= temp_address ; none <= to_stdlogic(data = zero) ; end process ; end RTL ; Library IEEE ; use IEEE.std_logic_1164.all ; use IEEE.std_logic_arith.all ; use IEEE.std_logic_unsigned.all ; entity ram is generic (data_width : natural := 8 ; address_width : natural := 8); port ( data_in : in UNSIGNED(data_width - 1 downto 0) ; address : in UNSIGNED(address_width - 1 downto 0) ; we : in std_logic ; clk : in std_logic; data_out : out UNSIGNED(data_width - 1 downto 0) ); end ram ; architecture rtl of ram is type mem_type is array (2**address_width downto 0) of UNSIGNED(data_width - 1 downto 0) ; signal mem : mem_type ; signal addr_reg : unsigned (address_width -1 downto 0); begin data_out <= mem(conv_integer(addr_reg)) ; I0 : process begin wait until clk'event and clk = '1'; if (we = '1') then mem(conv_integer(address)) <= data_in ; end if ; addr_reg <= address; end process ; end RTL ; Library IEEE ; use IEEE.std_logic_1164.all ; use IEEE.std_logic_arith.all ; entity tbuf is generic (data_width : natural := 16 ); port ( data_in : in UNSIGNED(data_width - 1 downto 0) ; en : in std_logic ; data_out : out UNSIGNED(data_width - 1 downto 0) ); end tbuf ; architecture rtl of tbuf is begin three_state : process(data_in,en) begin if (en = '1') then data_out <= data_in ; else data_out <= (others => 'Z') ; end if; end process ; end RTL ; Library IEEE ; use IEEE.std_logic_1164.all ; use IEEE.std_logic_arith.all ; entity pseudorandom is generic (data_width : natural := 8 ); port ( seed : in UNSIGNED (24 downto 0) ; init : in UNSIGNED (4 downto 0) ; load : in std_logic ; clk : in std_logic ; reset : in std_logic ; read : in std_logic ; write : in std_logic ; rand : out UNSIGNED (7 downto 0) ; none : out std_logic ); end pseudorandom ; architecture rtl of pseudorandom is signal latch_seed : UNSIGNED(24 downto 0) ; signal encoder_address : UNSIGNED(4 downto 0) ; signal random_data : UNSIGNED(7 downto 0) ; signal write_enable : std_logic ; signal ram_data : UNSIGNED(7 downto 0) ; begin I0 : entity work.dlatrg(rtl) generic map (25) port map (seed,read,reset,latch_seed) ; I1 : entity work.priority_encoder(rtl) generic map (25,5) port map (latch_seed,encoder_address,none) ; I2 : entity work.ram(rtl) generic map (8,5) port map (random_data,encoder_address,write_enable,clk,ram_data) ; I3 : entity work.tbuf(rtl) generic map (8) port map (ram_data,write,rand) ; I4 : entity work.lfsr(rtl) generic map (8) port map (clk,reset,random_data) ; I5 : entity work.divide_by_n(rtl) generic map (5) port map (init,load,clk,reset,write_enable) ; end rtl ;
本文档为【伪随机数产生器】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_594905
暂无简介~
格式:doc
大小:30KB
软件:Word
页数:11
分类:互联网
上传时间:2017-09-25
浏览量:27