From 4cb356e25bbd246a95cc8bce293ff08d93439044 Mon Sep 17 00:00:00 2001 From: schoeffelbe82781 Date: Wed, 27 Nov 2024 11:28:35 +0100 Subject: [PATCH] Added Rand Software, started Rand Hardware, Fixed error in Task --- hardware/signal_processing/.sine.vhd.swo | Bin 0 -> 16384 bytes hardware/signal_processing/rand.vhd | 53 +++++++++++++- software/signal_processing/rand.c | 67 +++++++++++++++++- software/signal_processing/system/task_rand.c | 2 +- 4 files changed, 116 insertions(+), 6 deletions(-) create mode 100644 hardware/signal_processing/.sine.vhd.swo diff --git a/hardware/signal_processing/.sine.vhd.swo b/hardware/signal_processing/.sine.vhd.swo new file mode 100644 index 0000000000000000000000000000000000000000..950dda9f6494b60fc48dc0f014dd86382bc17858 GIT binary patch literal 16384 zcmeI2U5Ff27RSpZuC|)^g}M(Ct|KO0IMeB#i6%Q^gmGpFqmvn#=|n`OsOh@hT~4RE zt*V|$6hF`xMf2c;uI{q>U{qXoVf}beUqlc^UqnO@cU4e9@e@?U2Os>Od+S!+?ygA) zA}qVN!Y@5lb?!aqp8I`nEte0>?qj=4Wee9?mi6+{J&ld;w$J#-&OcgFt=Z=FI&UrW z-J`p9S4br9;&tEcbfR*}^`c6t-W&X>Wm%xMIAeaHuU@Q1|vt_*x-T<$I zzk_GMA#gR=0ycx6&#>4PYFc4bB3eo^DxBfkR*)m;+aX zX|NTX34S>Z`Gc>)hu|&nCU_DY0UT@vo4_{(%lZO*4juycgB!u0z}eulQ;`lF0n5M! z-<)Du?}2}UyTBx{!3E&EKUmhc;7#xfcpNmr9M}mi1mB;Gci^w!HgGez7L0-l*aCjq zWLY197r~#w!{BzX3!D$m1HT|>^KbAHcm&)B?gbsN04@O=!H=l>AHWBI+QBOLov(tt zMn)KY$lb7EM)ouBnBW+}R*!IeHo5j$ivi98A?G-|~wwJf7tTL;v+P`%D2^vL7R7M5ZwA_sj zpRg^J99x#ElZ#c|m>iD?nN+(QG+JEgMiGlW4^Ul8vwP=fri)R`J5J=^ikkM^PRu>q zwkOy?6;00Xo$INh6E+~x*J-*Dx0RWhw`Zqi{-SNvAj32bek2SM(rfrIsT8}>N~t=z zbd9sPe|~;;esAU*Eg6a}+6v{JXiUCnS_^&Ima>}n1CJk~MqZYpdCHWLOuK}w0Y4Nw zWRw$$RtkeP5mxJlArE>apr|j=M4E)RBEQaxEcC@USKMpxBCEAln2mp`G3S;EQvnQm7E;V|{yWao%d`|V(OT!sX%2%4q=&P%tlB`#^_JP&x(7P^FjL9Gc$mrBkqy64ki#KOw;0CsNtQ-E zF>cdyeE=V(H<+S_Sao4~flW1eZ3QzX1_wVvZ(?q%)n4NsD|&v&S7PSY=mSoM$@-w% z!E-ry*h7?!K5>#B{XUsMggTnc=)E?niRamjN^i5fG;N}U1_+Tmk3~8f(C~l;0!Vb) z=u$AQh`()0fhED>WOa67eu<=Z<57bLJoIacRM)Au+HQ=wE8yek^RXWvmVG&UZpli+ zVz3}ftUDJKMh~%M8LOzJOqr@e7fn|)$Cd7%M=3$$ zC}LR|awSGYcVJiEmzF3G!&tZvb7mis<@*?(QrZC ziB(GaPAn_ZJL@Qb*XwF4BJtP$)JI^>eQOp}WWSAWqoRz6{XJdIb+R5&l zr0wtU<9ZUBx_hJt#{xJ=(;*XBZdhw#JyDChA!lLSV(q$UXkuQYkuqtW)Kq2u@S7S* zrD2X(kx+d=L%SOvukGX}?@u}*-A0=9cI*eT3?Xlfjh0XxFSAB0&ydftWYQ($I&!IP zYQ)1*OBQOtbz~Y{N)ls$(4F=itq5|l(EnPdXJUDj_fCu}MN6xJbhXjNA~UlHL#A{? z`dEx3rNQUYZ{m5&Uk=?+jys8|l-%c>mxAs=8m_P+^m;Q9Z_^SwmCEHirGUzf1STxn z|8K#*`7eO>|LT0dfxY~f*sp&AUI$NsC&3YL3pfBS1KYqQ;AHS4_U#{l*T4(lG4MA~ z2Su<6Yy=y?f1vMK@UKMoqom(l#skI!#skI!#skI!#skI!#skI!|EC_HEp7jv7rP${ zNL?)AQDPUVA3pR1|C7zH+Vjak{NPp_IU)ct5LQ9NHaoNsL6nh^<47UEGjdrL;$hp^ zP?@fwECi$NzoB5MI_=CY?46x*4$Mqd7Z!20r5}YMnMM0f@`DOjQ-C|$M(2e`>6r{z zBf3>cqD)dRg`rREBtpfL5mv#~mv!!enFzJWqYb1;4+rEQm$FLwN)Jf%8deZN;xycY zxEyLoURs0*Wl2TW&on#bqR^1Ia*rJIt0M0Vk`5sUq|>-Z?^&eH`VJ#e9eNE@xy2Ku kD2)(~Rcy2$*&x)*c%;!P5J0LMn|(II>DIrD{SU&{{R30 literal 0 HcmV?d00001 diff --git a/hardware/signal_processing/rand.vhd b/hardware/signal_processing/rand.vhd index 3a229f3..4eb0fb9 100644 --- a/hardware/signal_processing/rand.vhd +++ b/hardware/signal_processing/rand.vhd @@ -26,6 +26,19 @@ architecture rtl of rand is signal next_task_state : work.task.State; signal index : integer range 0 to work.task.STREAM_LEN; + type CalcState is ( + CALC_IDLE, + CALC_WRITE + ); + signal Calc_State : CalcState; + + signal lsfr : SIGNED( 31 downto 0 ); + signal lsfr_std_logic : std_logic_vector( 31 downto 0 ); + signal POLYNOM : std_logic_vector (31 downto 0); + + signal lsfr_dump : SIGNED( 31 downto 0 ); + + begin task_state_transitions : process ( current_task_state, task_start, index ) is begin @@ -50,17 +63,50 @@ begin begin if ( reset = '1' ) then current_task_state <= work.task.TASK_IDLE; + Calc_State <= CALC_IDLE; + lsfr <= SIGNED(seed); + lsfr_std_logic <= seed; + POLYNOM <= (others => '0'); + POLYNOM(31) <= '1'; + POLYNOM(21) <= '1'; + POLYNOM(1) <= '1'; + POLYNOM(0) <= '1'; index <= 0; + elsif ( rising_edge( clk ) ) then current_task_state <= next_task_state; case next_task_state is when work.task.TASK_IDLE => index <= 0; + lsfr <= SIGNED(seed); signal_write <= '0'; + when work.task.TASK_RUNNING => - index <= index + 1; - signal_write <= '1'; - signal_writedata <= ( others => '0' ); + case Calc_State is + when CALC_IDLE => + signal_write <= '0'; + lsfr_std_logic <= STD_LOGIC_VECTOR(lsfr); + if(lsfr_std_logic(0) = '1') then + lsfr <= SIGNED(lsfr_std_logic srl 1); + lsfr <= SIGNED(lsfr_std_logic XOR POLYNOM); + else + lsfr <= SIGNED(lsfr_std_logic srl 1); + end if; + lsfr <= SIGNED(lsfr_std_logic); + lsfr_dump <= lsfr; + + if(lsfr_std_logic(30) = '1') then + lsfr <= lsfr(31 downto 31) & "1000000" & lsfr(23 downto 0); + else + lsfr <= lsfr(31 downto 31) & "011111" & lsfr(24 downto 0); + end if; + Calc_State <= CALC_WRITE; + when CALC_WRITE => + signal_write <= '1'; + index <= index + 1; + Calc_State <= CALC_IDLE; + end case; + when work.task.TASK_DONE => index <= 0; signal_write <= '0'; @@ -69,5 +115,6 @@ begin end process sync; task_state <= current_task_state; + signal_writedata <= STD_LOGIC_VECTOR(lsfr); end architecture rtl; diff --git a/software/signal_processing/rand.c b/software/signal_processing/rand.c index d4fc0fd..93846ab 100644 --- a/software/signal_processing/rand.c +++ b/software/signal_processing/rand.c @@ -3,9 +3,72 @@ #include "system/data_channel.h" #include "system/float_word.h" -int task_rand_run( void * task ) { +#include "stdio.h" - // TODO +#define POLYNOM ((1 << 31)|(1 << 21)|(1 << 1)|(1 << 0)) + +int32_t shift_lsfr(int32_t *lsfr) { + int feedback; + + feedback = *lsfr & 1; + + *lsfr >>= 1; + + if(feedback == 1) + *lsfr ^= POLYNOM; + return *lsfr; + +} + +int32_t pot(int32_t base, int exp) { + int32_t res = 1; + while(exp-- >= 0) + res *= base; + + return res; +} + +uint8_t clamp_value(uint8_t value) { + + if(value & 128) { + value &= 0b10000001; + //value &= ((1 << 7) | (1 << 0)); + } else { + //value |= ~((1 << 1) | (1 << 0)); + value |= 0b01111100; + } + return value; + +} + +int task_rand_run( void * task ) { + + rand_config* config = ( rand_config* ) task; + float_word seed = { .value = config->seed }; + + uint32_t lfsr = seed.word; + + uint32_t data_channel_base = config->base.sink; + data_channel_clear(data_channel_base); + + for(uint32_t i = 0; i < DATA_CHANNEL_DEPTH; ++i) { + float_word res, value; + + //res.value = lfsr; + // + + + uint32_t E = (value.word >> 23) & 0xff; + E = clamp_value(E); + + res.word = value.word; + res.word &= ~(0xFF << 23); + res.word |= (E << 23); + + value.word = shift_lsfr(&lfsr) ; + + data_channel_write( data_channel_base, res.word); + } return 0; } diff --git a/software/signal_processing/system/task_rand.c b/software/signal_processing/system/task_rand.c index bc08f8b..7470197 100644 --- a/software/signal_processing/system/task_rand.c +++ b/software/signal_processing/system/task_rand.c @@ -21,7 +21,7 @@ rand_config RAND_CONFIG = { .cycle_count = 0 }, .seed = 1.3, .abs_min = 0.125, - .abs_max = 9.0 }; + .abs_max = 8.0 }; int task_rand_configure( void * data ) { rand_config * task = ( rand_config * ) data;