picorv32/scripts/icestorm/firmware.c

58 lines
1.1 KiB
C
Raw Normal View History

2015-07-19 10:09:19 -04:00
#include <stdint.h>
2015-07-21 11:43:33 -04:00
// use SHIFT_COUNTER_BITS=4 for simulation
2015-07-31 05:08:28 -04:00
#define SHIFT_COUNTER_BITS 18
2015-07-19 10:09:19 -04:00
void output(uint8_t c)
{
*(volatile char*)0x10000000 = c;
}
2015-07-31 05:08:28 -04:00
uint8_t gray_encode_simple(uint8_t c)
2015-07-19 10:09:19 -04:00
{
2015-07-31 05:08:28 -04:00
return c ^ (c >> 1);
}
uint8_t gray_encode_bitwise(uint8_t c)
{
unsigned int in_buf = c, out_buf = 0, bit = 1;
2015-07-19 10:09:19 -04:00
for (int i = 0; i < 8; i++) {
2015-07-31 05:08:28 -04:00
if ((in_buf & 1) ^ ((in_buf >> 1) & 1))
out_buf |= bit;
2015-07-19 10:09:19 -04:00
in_buf = in_buf >> 1;
2015-07-31 05:08:28 -04:00
bit = bit << 1;
}
return out_buf;
}
uint8_t gray_decode(uint8_t c)
{
uint8_t t = c >> 1;
while (t) {
c = c ^ t;
t = t >> 1;
2015-07-19 10:09:19 -04:00
}
2015-07-31 05:08:28 -04:00
return c;
}
void gray(uint8_t c)
{
uint8_t gray_simple = gray_encode_simple(c);
uint8_t gray_bitwise = gray_encode_bitwise(c);
uint8_t gray_decoded = gray_decode(gray_simple);
if (gray_simple != gray_bitwise || gray_decoded != c)
while (1) asm volatile ("sbreak");
output(gray_simple);
2015-07-19 10:09:19 -04:00
}
void main()
{
for (uint32_t counter = (2+4+32+64) << SHIFT_COUNTER_BITS;; counter++) {
asm volatile ("" : : "r"(counter));
if ((counter & ~(~0 << SHIFT_COUNTER_BITS)) == 0)
2015-07-31 05:08:28 -04:00
gray(counter >> SHIFT_COUNTER_BITS);
2015-07-19 10:09:19 -04:00
}
}