2015-07-19 10:09:19 -04:00
|
|
|
#include <stdint.h>
|
|
|
|
|
2019-01-11 16:14:32 -05:00
|
|
|
#ifndef SHIFT_COUNTER_BITS
|
|
|
|
#error SHIFT_COUNTER_BITS must be defined as 4 (for simulation) or 18 (for hardware bitstreams)!
|
|
|
|
#endif
|
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)
|
2016-06-06 04:46:52 -04:00
|
|
|
while (1) asm volatile ("ebreak");
|
2015-07-31 05:08:28 -04:00
|
|
|
|
|
|
|
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
|
|
|
}
|
|
|
|
}
|