Rastgele Sayı Üreteci Modülünün VHDL ile Gerçeklenmesi

Rastgele sayı üretimi işlemleri için Galois tarafından önerilen LFSR (Linear Feedback Shift Register ) yöntemi kullanılmıştır.  Kodda rastgele sayı üretimi için gerekli olan başlangıç değeri jenerik parametre olarak set edilmiştir. Rastgele sayı üretim işlemleri bu değere göre gerçekleşitirilmiştir.  Bununla birlikte oluşturulan paket içerisinde sayı uzunluğu ve kullanulacak olan polinoma ilişkin tanımlamalar yapılabilmetkedir.  Aşağıda rastgele sayı üreteci benzetim çıktısı ve VHDL kodları verilmiştir.

lfsr

  1. library IEEE;
  2. use IEEE.STD_LOGIC_1164.ALL;
  3. use work.lfsr_packet.all;
  4.  
  5. entity lfsr is
  6. Generic(
  7. INIT_VALUE : std_logic_vector(DATA_WIDTH - 1 downto 0) := X"A47C"
  8. );
  9. Port (
  10. in_clk : in std_logic;
  11. in_rst : in std_logic;
  12. out_rnd_data : out std_logic_vector(DATA_WIDTH - 1 downto 0)
  13. );
  14. end lfsr;
  15.  
  16. architecture Behavioral of lfsr is
  17.  
  18. signal r_rnd_data : std_logic_vector(DATA_WIDTH - 1 downto 0) := INIT_VALUE;
  19.  
  20. begin
  21.  
  22. out_rnd_data <= r_rnd_data;
  23.  
  24. process(in_clk, in_rst)
  25. begin
  26. if in_rst = '1' then
  27. r_rnd_data <= INIT_VALUE;
  28. elsif rising_edge(in_clk) then
  29. r_rnd_data <= f_lfsr(r_rnd_data, c_POLYNOM);
  30. end if;
  31. end process;
  32.  
  33. end Behavioral;

  1. library IEEE;
  2. use IEEE.STD_LOGIC_1164.ALL;
  3.  
  4. package lfsr_packet is
  5.  
  6. constant DATA_WIDTH : integer := 16;
  7. constant PLOY_LENGTH : integer := 3;
  8.  
  9. type t_POLYNOM is array (0 to PLOY_LENGTH - 1) of integer range 0 to DATA_WIDTH - 1;
  10. constant c_POLYNOM : t_POLYNOM := (13, 12, 10);
  11.  
  12. function f_lfsr(data : std_logic_vector(DATA_WIDTH - 1 downto 0); POLYNOM : t_POLYNOM ) return std_logic_vector;
  13.  
  14. end lfsr_packet;
  15.  
  16. package body lfsr_packet is
  17.  
  18. function f_lfsr(data : std_logic_vector(DATA_WIDTH - 1 downto 0); POLYNOM : t_POLYNOM ) return std_logic_vector is
  19. variable v_data : std_logic_vector(DATA_WIDTH - 1 downto 0);
  20. variable v_zero : std_logic;
  21. begin
  22. v_data := data;
  23. v_zero := v_data(0);
  24. v_data(DATA_WIDTH - 2 downto 0) := v_data(DATA_WIDTH - 1 downto 1);
  25. v_data(DATA_WIDTH - 1) := v_zero;
  26. for n_j in 0 to PLOY_LENGTH - 1 loop
  27. v_data(POLYNOM(n_j)) := v_data(POLYNOM(n_j)) xor v_zero;
  28. end loop;
  29. return v_data;
  30. end f_lfsr;
  31.  
  32. end package body;

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir