Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Generic, parametrized LFSR in VHDL (public domain)

171 views
Skip to first unread message

Wojciech Zabolotny

unread,
Feb 20, 2007, 7:22:14 AM2/20/07
to
This is a generic, parametrized implementation of the pseudorandom sequence
generator, based on linear feedback shift register, written in VHDL.
This is a behavioral code, however it also gives quite nice results in
synthesis (checked in both Altera Quartus 6.0 and Xilinx ISE 8.2 tools).
The code is published as public domain, in the hope, that it may be useful
for someone...

#!/bin/sh
# This is a shell archive (produced by GNU sharutils 4.2.1).
# To extract the files from this archive, save it to some FILE, remove
# everything before the `!/bin/sh' line above, then type `sh FILE'.
#
# Made on 2007-02-20 13:12 CET by <wzab@ipebio15>.
# Source directory was `/tmp/lfsr'.
#
# Existing files will *not* be overwritten unless `-c' is specified.
#
# This shar contains:
# length mode name
# ------ ---------- ------------------------------------------
# 1320 -rw-r--r-- genlfsr.vhd
# 191 -rw-r--r-- genlfsr_pkg.vhd
# 2574 -rw-r--r-- genlfsr_tb.vhd
# 281 -rw-rw-r-- makefile
#
save_IFS="${IFS}"
IFS="${IFS}:"
gettext_dir=FAILED
locale_dir=FAILED
first_param="$1"
for dir in $PATH
do
if test "$gettext_dir" = FAILED && test -f $dir/gettext \
&& ($dir/gettext --version >/dev/null 2>&1)
then
set `$dir/gettext --version 2>&1`
if test "$3" = GNU
then
gettext_dir=$dir
fi
fi
if test "$locale_dir" = FAILED && test -f $dir/shar \
&& ($dir/shar --print-text-domain-dir >/dev/null 2>&1)
then
locale_dir=`$dir/shar --print-text-domain-dir`
fi
done
IFS="$save_IFS"
if test "$locale_dir" = FAILED || test "$gettext_dir" = FAILED
then
echo=echo
else
TEXTDOMAINDIR=$locale_dir
export TEXTDOMAINDIR
TEXTDOMAIN=sharutils
export TEXTDOMAIN
echo="$gettext_dir/gettext -s"
fi
if touch -am -t 200112312359.59 $$.touch >/dev/null 2>&1 && test ! -f 200112312359.59 -a -f $$.touch; then
shar_touch='touch -am -t $1$2$3$4$5$6.$7 "$8"'
elif touch -am 123123592001.59 $$.touch >/dev/null 2>&1 && test ! -f 123123592001.59 -a ! -f 123123592001.5 -a -f $$.touch; then
shar_touch='touch -am $3$4$5$6$1$2.$7 "$8"'
elif touch -am 1231235901 $$.touch >/dev/null 2>&1 && test ! -f 1231235901 -a -f $$.touch; then
shar_touch='touch -am $3$4$5$6$2 "$8"'
else
shar_touch=:
echo
$echo 'WARNING: not restoring timestamps. Consider getting and'
$echo "installing GNU \`touch', distributed in GNU File Utilities..."
echo
fi
rm -f 200112312359.59 123123592001.59 123123592001.5 1231235901 $$.touch
#
if mkdir _sh11731; then
$echo 'x -' 'creating lock directory'
else
$echo 'failed to create lock directory'
exit 1
fi
# ============= genlfsr.vhd ==============
if test -f 'genlfsr.vhd' && test "$first_param" != -c; then
$echo 'x -' SKIPPING 'genlfsr.vhd' '(file already exists)'
else
$echo 'x -' extracting 'genlfsr.vhd' '(text)'
sed 's/^X//' << 'SHAR_EOF' > 'genlfsr.vhd' &&
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use std.textio.all;
library work;
use work.genlfsr_pkg.all;
X
entity genlfsr is
X
X generic (
X width : integer := 16;
X length : integer := 17; -- length of the register
X taps : T_LFSR_TAPS := (17, 14));
X
X port (
X rst_n : in std_logic;
X clk : in std_logic;
X dout : out std_logic_vector(15 downto 0));
X
end genlfsr;
X
architecture beh of genlfsr is
X
X signal reg : std_logic_vector(length-1 downto 0);
X
begin -- beh
X
X lfsr1 : process (clk, rst_n)
X variable vreg : std_logic_vector(length-1 downto 0);
X variable fb : std_logic;
X begin -- process lfsr1
X if rst_n = '0' then -- asynchronous reset (active low)
X reg <= (others => '1');
X elsif clk'event and clk = '1' then -- rising clock edge
X vreg := reg;
X for i in 1 to width loop
X fb := '0';
X for j in taps'range loop
X if fb=vreg(taps(j)-1) then
X fb := '0';
X else
X fb := '1';
X end if;
X end loop; -- j
X for k in vreg'left downto 1 loop
X vreg(k) := vreg(k-1);
X end loop; -- k
X vreg(0) := fb;
X end loop; -- i
X reg <= vreg;
X end if;
X end process lfsr1;
X
X dout <= reg(width-1 downto 0);
X
end beh;
SHAR_EOF
(set 20 07 02 20 13 10 28 'genlfsr.vhd'; eval "$shar_touch") &&
chmod 0644 'genlfsr.vhd' ||
$echo 'restore of' 'genlfsr.vhd' 'failed'
if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
&& ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
md5sum -c << SHAR_EOF >/dev/null 2>&1 \
|| $echo 'genlfsr.vhd:' 'MD5 check failed'
3243fbb313774b7882608658baa4084b genlfsr.vhd
SHAR_EOF
else
shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'genlfsr.vhd'`"
test 1320 -eq "$shar_count" ||
$echo 'genlfsr.vhd:' 'original size' '1320,' 'current size' "$shar_count!"
fi
fi
# ============= genlfsr_pkg.vhd ==============
if test -f 'genlfsr_pkg.vhd' && test "$first_param" != -c; then
$echo 'x -' SKIPPING 'genlfsr_pkg.vhd' '(file already exists)'
else
$echo 'x -' extracting 'genlfsr_pkg.vhd' '(text)'
sed 's/^X//' << 'SHAR_EOF' > 'genlfsr_pkg.vhd' &&
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use std.textio.all;
X
package genlfsr_pkg is
X
X type T_LFSR_TAPS is array (natural range <>) of integer;
X
end genlfsr_pkg;
SHAR_EOF
(set 20 07 02 20 13 10 28 'genlfsr_pkg.vhd'; eval "$shar_touch") &&
chmod 0644 'genlfsr_pkg.vhd' ||
$echo 'restore of' 'genlfsr_pkg.vhd' 'failed'
if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
&& ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
md5sum -c << SHAR_EOF >/dev/null 2>&1 \
|| $echo 'genlfsr_pkg.vhd:' 'MD5 check failed'
6ffb4cb1e002518f948fca29002bffe5 genlfsr_pkg.vhd
SHAR_EOF
else
shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'genlfsr_pkg.vhd'`"
test 191 -eq "$shar_count" ||
$echo 'genlfsr_pkg.vhd:' 'original size' '191,' 'current size' "$shar_count!"
fi
fi
# ============= genlfsr_tb.vhd ==============
if test -f 'genlfsr_tb.vhd' && test "$first_param" != -c; then
$echo 'x -' SKIPPING 'genlfsr_tb.vhd' '(file already exists)'
else
$echo 'x -' extracting 'genlfsr_tb.vhd' '(text)'
sed 's/^X//' << 'SHAR_EOF' > 'genlfsr_tb.vhd' &&
-------------------------------------------------------------------------------
-- Title : Testbench for design "genlfsr"
-- Project :
-------------------------------------------------------------------------------
-- File : genlfsr_tb.vhd
-- Author :
-- Company :
-- Created : 2007-02-20
-- Last update: 2007-02-20
-- Platform :
-- Standard : VHDL'87
-------------------------------------------------------------------------------
-- Description:
-------------------------------------------------------------------------------
-- Copyright (c) 2007
-------------------------------------------------------------------------------
-- Revisions :
-- Date Version Author Description
-- 2007-02-20 1.0 xl Created
-------------------------------------------------------------------------------
X
library ieee;
use ieee.std_logic_1164.all;
library work;
use work.genlfsr_pkg.all;
-------------------------------------------------------------------------------
X
entity genlfsr_tb is
X
end genlfsr_tb;
X
-------------------------------------------------------------------------------
X
architecture test1 of genlfsr_tb is
X
X component genlfsr
X generic (
X width : integer;
X length : integer;
X taps : T_LFSR_TAPS);
X port (
X rst_n : in std_logic;
X clk : in std_logic;
X dout : out std_logic_vector(15 downto 0));
X end component;
X
X -- component generics
X constant width : integer := 16;
X constant length : integer := 17;
X constant taps : T_LFSR_TAPS := (17, 14);
X
X -- component ports
X signal rst_n : std_logic;
X signal dout : std_logic_vector(15 downto 0);
X
X -- clock
X signal Clk : std_logic := '1';
X
X signal stop : std_logic := '0';
begin -- test1
X
X -- component instantiation
X DUT: genlfsr
X generic map (
X width => width,
X length => length,
X taps => taps)
X port map (
X rst_n => rst_n,
X clk => clk,
X dout => dout);
X
X -- clock generation
X Clk <= not Clk after 10 ns when stop = '0' else
X '0';
X
X -- waveform generation
X WaveGen_Proc: process
X begin
X -- insert signal assignments here
X rst_n <= '0';
X wait until Clk = '1';
X wait for 15 ns;
X rst_n <= '1';
X wait for 2000 ns;
X stop <= '1';
X end process WaveGen_Proc;
X
X
X
end test1;
X
-------------------------------------------------------------------------------
X
configuration genlfsr_tb_test1_cfg of genlfsr_tb is
X for test1
X end for;
end genlfsr_tb_test1_cfg;
X
-------------------------------------------------------------------------------
SHAR_EOF
(set 20 07 02 20 13 10 38 'genlfsr_tb.vhd'; eval "$shar_touch") &&
chmod 0644 'genlfsr_tb.vhd' ||
$echo 'restore of' 'genlfsr_tb.vhd' 'failed'
if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
&& ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
md5sum -c << SHAR_EOF >/dev/null 2>&1 \
|| $echo 'genlfsr_tb.vhd:' 'MD5 check failed'
cfd6a7b12be1320de5cbd8d906218a9c genlfsr_tb.vhd
SHAR_EOF
else
shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'genlfsr_tb.vhd'`"
test 2574 -eq "$shar_count" ||
$echo 'genlfsr_tb.vhd:' 'original size' '2574,' 'current size' "$shar_count!"
fi
fi
# ============= makefile ==============
if test -f 'makefile' && test "$first_param" != -c; then
$echo 'x -' SKIPPING 'makefile' '(file already exists)'
else
$echo 'x -' extracting 'makefile' '(text)'
sed 's/^X//' << 'SHAR_EOF' > 'makefile' &&
TRIPS = genlfsr_pkg.vhd \
X genlfsr.vhd\
X genlfsr_tb.vhd
X
all: show
X
genlfsr_tb: ${TRIPS}
# vhdlp -work fmf fmf/*.vhd
X ghdl -a --ieee=standard ${TRIPS}
X ghdl -e --ieee=standard genlfsr_tb
test.ghw: genlfsr_tb
X ./genlfsr_tb --wave=test.ghw
show: test.ghw
X gtkwave test.ghw test
SHAR_EOF
(set 20 07 02 20 13 10 41 'makefile'; eval "$shar_touch") &&
chmod 0664 'makefile' ||
$echo 'restore of' 'makefile' 'failed'
if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
&& ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
md5sum -c << SHAR_EOF >/dev/null 2>&1 \
|| $echo 'makefile:' 'MD5 check failed'
a369fb457ee4ed9a8dcb74c423ab49a9 makefile
SHAR_EOF
else
shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'makefile'`"
test 281 -eq "$shar_count" ||
$echo 'makefile:' 'original size' '281,' 'current size' "$shar_count!"
fi
fi
rm -fr _sh11731
exit 0

saeid

unread,
Mar 3, 2007, 6:08:50 AM3/3/07
to

Wojciech Zabolotny نوشته است:
Message has been deleted
Message has been deleted

Wojciech Zabolotny

unread,
Oct 22, 2021, 10:44:08 AM10/22/21
to
This is a slightly refreshed version of my generic, parametrized implementation of the pseudorandom sequence
generator, based on linear feedback shift register, written in VHDL.
It contains the VEXTPROJ project for Vivado.
Because the google group archive corrupts the share-packed sources, I send the source as base64-packed
tar.gz archive.
The code is published as public domain.
Wojciech Zabolotny

===== Below is the base64-encoded tar.gz archive of the sources =====
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
AA==
0 new messages