beckal87649 4d0bb79521 4.Test
2026-01-13 10:53:22 +01:00

40 lines
1.1 KiB
C

#include "system/task_rand.h"
#include "system/hardware_task.h"
#include "system/data_channel.h"
#include "system/float_word.h"
int task_rand_run(void *task)
{
rand_config *config = (rand_config *)task;
uint32_t data_channel_base = config->base.sink;
data_channel_clear(data_channel_base);
float_word seed_fw = { .value = config->seed };
uint32_t lfsr = seed_fw.word;
for (uint32_t i = 0; i < DATA_CHANNEL_DEPTH; ++i) {
uint32_t sign = (lfsr >> 31) & 0x1u;
uint32_t mant = lfsr & 0x007FFFFFu; // 23 Bit Mantisse
uint32_t exp_rand = (lfsr >> 23) & 0xFFu; // 8 Bit Exponent
uint32_t exp_new;
if (exp_rand & 0x80u) {
exp_new = 0x80u | (exp_rand & 0x01u);
} else {
exp_new = 0x7Cu | (exp_rand & 0x03u);
}
float_word out;
out.word = (sign << 31) | (exp_new << 23) | mant;
data_channel_write(data_channel_base, out.word);
uint32_t fb = ((lfsr >> 31) ^ (lfsr >> 21) ^ (lfsr >> 1) ^ (lfsr >> 0)) & 0x1u;
lfsr = (lfsr << 1) | fb;
}
return 0;
}