element14 Community
element14 Community
    Register Log In
  • Site
  • Search
  • Log In Register
  • Community Hub
    Community Hub
    • What's New on element14
    • Feedback and Support
    • Benefits of Membership
    • Personal Blogs
    • Members Area
    • Achievement Levels
  • Learn
    Learn
    • Ask an Expert
    • eBooks
    • element14 presents
    • Learning Center
    • Tech Spotlight
    • STEM Academy
    • Webinars, Training and Events
    • Learning Groups
  • Technologies
    Technologies
    • 3D Printing
    • FPGA
    • Industrial Automation
    • Internet of Things
    • Power & Energy
    • Sensors
    • Technology Groups
  • Challenges & Projects
    Challenges & Projects
    • Design Challenges
    • element14 presents Projects
    • Project14
    • Arduino Projects
    • Raspberry Pi Projects
    • Project Groups
  • Products
    Products
    • Arduino
    • Avnet & Tria Boards Community
    • Dev Tools
    • Manufacturers
    • Multicomp Pro
    • Product Groups
    • Raspberry Pi
    • RoadTests & Reviews
  • About Us
    About the element14 Community
  • Store
    Store
    • Visit Your Store
    • Choose another store...
      • Europe
      •  Austria (German)
      •  Belgium (Dutch, French)
      •  Bulgaria (Bulgarian)
      •  Czech Republic (Czech)
      •  Denmark (Danish)
      •  Estonia (Estonian)
      •  Finland (Finnish)
      •  France (French)
      •  Germany (German)
      •  Hungary (Hungarian)
      •  Ireland
      •  Israel
      •  Italy (Italian)
      •  Latvia (Latvian)
      •  
      •  Lithuania (Lithuanian)
      •  Netherlands (Dutch)
      •  Norway (Norwegian)
      •  Poland (Polish)
      •  Portugal (Portuguese)
      •  Romania (Romanian)
      •  Russia (Russian)
      •  Slovakia (Slovak)
      •  Slovenia (Slovenian)
      •  Spain (Spanish)
      •  Sweden (Swedish)
      •  Switzerland(German, French)
      •  Turkey (Turkish)
      •  United Kingdom
      • Asia Pacific
      •  Australia
      •  China
      •  Hong Kong
      •  India
      •  Japan
      •  Korea (Korean)
      •  Malaysia
      •  New Zealand
      •  Philippines
      •  Singapore
      •  Taiwan
      •  Thailand (Thai)
      •  Vietnam
      • Americas
      •  Brazil (Portuguese)
      •  Canada
      •  Mexico (Spanish)
      •  United States
      Can't find the country/region you're looking for? Visit our export site or find a local distributor.
  • Translate
  • Profile
  • Settings
FPGA
  • Technologies
  • More
FPGA
Forum VHDL设计举例:伪随机数产生器
  • Blog
  • Forum
  • Documents
  • Quiz
  • Events
  • Polls
  • Files
  • Members
  • Mentions
  • Sub-Groups
  • Tags
  • More
  • Cancel
  • New
Join FPGA to participate - click to join for free!
Actions
  • Share
  • More
  • Cancel
Forum Thread Details
  • Replies 0 replies
  • Subscribers 567 subscribers
  • Views 634 views
  • Users 0 members are here
Related

VHDL设计举例:伪随机数产生器

vhe1981
vhe1981 over 15 years ago

  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 ;

  • Sign in to reply
  • Cancel
element14 Community

element14 is the first online community specifically for engineers. Connect with your peers and get expert answers to your questions.

  • Members
  • Learn
  • Technologies
  • Challenges & Projects
  • Products
  • Store
  • About Us
  • Feedback & Support
  • FAQs
  • Terms of Use
  • Privacy Policy
  • Legal and Copyright Notices
  • Sitemap
  • Cookies

An Avnet Company © 2026 Premier Farnell Limited. All Rights Reserved.

Premier Farnell Ltd, registered in England and Wales (no 00876412), registered office: Farnell House, Forge Lane, Leeds LS12 2NE.

ICP 备案号 10220084.

Follow element14

  • X
  • Facebook
  • linkedin
  • YouTube