Discussion:
Generic, parametrized LFSR in VHDL (public domain)
(too old to reply)
Wojciech Zabolotny
2007-02-20 12:22:14 UTC
Permalink
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 <***@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
2007-03-03 11:08:50 UTC
Permalink
Post by Wojciech Zabolotny
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'.
#
# Source directory was `/tmp/lfsr'.
#
# Existing files will *not* be overwritten unless `-c' is specified.
#
# 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
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"
-------------------------------------------------------------------------------
-- File : genlfsr_tb.vhd
-- Created : 2007-02-20
-- Last update: 2007-02-20
-- Standard : VHDL'87
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-- Copyright (c) 2007
-------------------------------------------------------------------------------
-- 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
Wojciech Zabolotny
2021-10-22 14:25:42 UTC
Permalink
This is a slightly refreshed version of my eneric, 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
====== The base64-coded tar.gz archive is below ======
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
CGW7sQAwAgA=
Wojciech Zabolotny
2021-10-22 14:44:07 UTC
Permalink
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==

Loading...