From 19aadb159e3c7b382df91e3821dbc6f20490b9cf Mon Sep 17 00:00:00 2001 From: Greek64 Date: Thu, 25 Mar 2021 11:22:17 +0100 Subject: [PATCH] Add gen_sine.sh Add Shell Script that generates sine wave arrays in VHDL packages. --- src/gen_sine.sh | 125 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100755 src/gen_sine.sh diff --git a/src/gen_sine.sh b/src/gen_sine.sh new file mode 100755 index 0000000..9f13951 --- /dev/null +++ b/src/gen_sine.sh @@ -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 <$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