Add gen_sine.sh
Add Shell Script that generates sine wave arrays in VHDL packages.
This commit is contained in:
parent
3f111508c1
commit
19aadb159e
125
src/gen_sine.sh
Executable file
125
src/gen_sine.sh
Executable file
@ -0,0 +1,125 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
echo "USAGE: $0 -h|--help"
|
||||||
|
echo "USAGE: $0 [-z NUMBER] [-a NUMBER] [-n NUMBER] [-f FILE]"
|
||||||
|
echo ""
|
||||||
|
echo "Options:"
|
||||||
|
echo " -z Sine Zero value in decimal (sin(0))"
|
||||||
|
echo " -a Sine Amplitude value in decimal (sin(pi))"
|
||||||
|
echo " -n Number of Period Samples"
|
||||||
|
echo " -f Output VHDL File"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#**********MAIN**********
|
||||||
|
|
||||||
|
FILE="test_sine.vhd"
|
||||||
|
amp=1024
|
||||||
|
zero=512
|
||||||
|
num=1024
|
||||||
|
|
||||||
|
while [ $# -gt 0 ]; do
|
||||||
|
case "$1" in
|
||||||
|
-a)
|
||||||
|
shift
|
||||||
|
amp=$1
|
||||||
|
shift
|
||||||
|
case $amp in
|
||||||
|
''|*[!0-9]*)
|
||||||
|
echo "ERROR: -a Option needs a Decimal Number."
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
*);;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
-z)
|
||||||
|
shift
|
||||||
|
zero=$1
|
||||||
|
shift
|
||||||
|
case $zero in
|
||||||
|
''|*[!0-9]*)
|
||||||
|
echo "ERROR: -z Option needs a Decimal Number."
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
*);;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
-n)
|
||||||
|
shift
|
||||||
|
num=$1
|
||||||
|
shift
|
||||||
|
case $num in
|
||||||
|
''|*[!0-9]*)
|
||||||
|
echo "ERROR: -n Option needs a Decimal Number."
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
*);;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
-f)
|
||||||
|
shift
|
||||||
|
FILE=$1
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-h|--help)
|
||||||
|
usage
|
||||||
|
exit
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "ERROR: Unknown Option"
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
#SANITY CHECK
|
||||||
|
if [ $amp -gt $zero ]
|
||||||
|
then
|
||||||
|
echo "ERROR: The Sine Amplitude has to be smaller than the Zero point."
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if [ $(echo "$amp+$zero" | bc -l) -gt 4095 ]
|
||||||
|
then
|
||||||
|
echo "ERROR: The requested Sine exceeds the 12 Bits representation (2^12=4096)"
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
#Calculate Stepping
|
||||||
|
step=$(echo "(2*(4*a(1)))/$num" | bc -l)
|
||||||
|
num=$(echo "$num-1" | bc -l)
|
||||||
|
|
||||||
|
cat <<EOF >$FILE
|
||||||
|
library ieee;
|
||||||
|
use ieee.std_logic_1164.all;
|
||||||
|
use ieee.numeric_std.all;
|
||||||
|
|
||||||
|
package sine_package is
|
||||||
|
EOF
|
||||||
|
|
||||||
|
echo " type SINE_ARRAY_TYPE is array (0 to $num)" >>$FILE
|
||||||
|
array=" constant sine : SINE_ARRAY_TYPE := ("
|
||||||
|
|
||||||
|
for i in $(seq 0 $num)
|
||||||
|
do
|
||||||
|
#Calculate Value
|
||||||
|
val=$(echo "($amp * s($i*$step))+$zero" | bc -l)
|
||||||
|
#Round
|
||||||
|
val=$(printf '%.0f' $val)
|
||||||
|
array=$array$(printf 'x"%03X"' $val)
|
||||||
|
|
||||||
|
if [ $i -eq $num ]
|
||||||
|
then
|
||||||
|
array=$array$(printf ');\n')
|
||||||
|
else
|
||||||
|
array=$array", "
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
echo $array >>$FILE
|
||||||
|
echo "end package;" >>$FILE
|
||||||
Loading…
Reference in New Issue
Block a user