#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; }