public static async Task Aggregator(
            FPGA.InputSignal <bool> RXD,
            FPGA.OutputSignal <bool> TXD
            )
        {
            bool internalTXD = true;

            FPGA.Config.Link(internalTXD, TXD);

            Sequential mainHandler = () =>
            {
                byte   data = 0;
                byte[] buff = new byte[] { 1, 2, 3, 4, 5 };

                UART.Read(115200, RXD, out data);

                for (int i = 0; i < buff.Length; i++)
                {
                    byte existing = 0;
                    existing = buff[i];
                    UART.RegisteredWrite(115200, existing, out internalTXD);
                }
            };

            FPGA.Config.OnStartup(mainHandler);
        }
示例#2
0
        public static async Task Aggregator(
            FPGA.InputSignal <bool> RXD,
            FPGA.OutputSignal <bool> TXD)
        {
            var  stream      = new FPGA.SyncStream <byte>();
            bool internalTXD = true;

            FPGA.Config.Link(internalTXD, TXD);
            object txdLock = new object();

            Sequential <byte> streamHandler = (value) =>
            {
                lock (txdLock)
                {
                    UART.RegisteredWrite(115200, value, out internalTXD);
                }
            };

            FPGA.Config.OnStream(stream, streamHandler, 2);

            Sequential handler = () =>
            {
                byte data = 0;
                UART.Read(115200, RXD, out data);
                for (ushort i = 0; i < data; i++)
                {
                    stream.Write((byte)i);
                }
            };

            const bool trigger = true;

            FPGA.Config.OnSignal(trigger, handler);
        }
        public static async Task Aggregator(
            FPGA.InputSignal <bool> RXD,
            FPGA.OutputSignal <bool> TXD
            )
        {
            bool internalTXD = true;

            FPGA.Config.Link(internalTXD, TXD);

            Sequential handler = () =>
            {
                byte prev = 100, next = 0;
                while (true)
                {
                    next = UART.Read(115200, RXD);

                    UART.RegisteredWrite(115200, prev, out internalTXD);
                    UART.RegisteredWrite(115200, next, out internalTXD);

                    prev = next;
                }
            };

            FPGA.Config.OnStartup(handler);
        }
示例#4
0
        public static async Task Aggregator(
            // blinker
            FPGA.OutputSignal <bool> LED1,

            // UART
            FPGA.InputSignal <bool> RXD,
            FPGA.OutputSignal <bool> TXD

            )
        {
            bool internalTXD = true;

            FPGA.Config.Link(internalTXD, TXD);

            IsAlive.Blink(LED1);

            Sequential handler = () =>
            {
                for (byte b = 0; b < 10; b++)
                {
                    UART.RegisteredWrite(115200, b, out internalTXD);
                }

                UART.RegisteredWrite(115200, 255, out internalTXD);
            };

            FPGA.Config.OnTimer(TimeSpan.FromSeconds(1), handler);
        }
        public static void WriteData(
            FPGA.Register <ulong> a00, FPGA.Register <ulong> a01, FPGA.Register <ulong> a02, FPGA.Register <ulong> a03, FPGA.Register <ulong> a04,
            FPGA.Register <ulong> a05, FPGA.Register <ulong> a06, FPGA.Register <ulong> a07, FPGA.Register <ulong> a08, FPGA.Register <ulong> a09,
            FPGA.Register <ulong> a10, FPGA.Register <ulong> a11, FPGA.Register <ulong> a12, FPGA.Register <ulong> a13, FPGA.Register <ulong> a14,
            FPGA.Register <ulong> a15, FPGA.Register <ulong> a16, FPGA.Register <ulong> a17, FPGA.Register <ulong> a18, FPGA.Register <ulong> a19,
            FPGA.Register <ulong> a20, FPGA.Register <ulong> a21, FPGA.Register <ulong> a22, FPGA.Register <ulong> a23, FPGA.Register <ulong> a24,
            out bool TXD)
        {
            TXD = true;

            FPGA.Collections.ReadOnlyDictionary <byte, ulong> mapItems = new FPGA.Collections.ReadOnlyDictionary <byte, ulong>()
            {
                { 0, a00 }, { 1, a01 }, { 2, a02 }, { 3, a03 }, { 4, a04 },
                { 5, a05 }, { 6, a06 }, { 7, a07 }, { 8, a08 }, { 9, a09 },
                { 10, a10 }, { 11, a11 }, { 12, a12 }, { 13, a13 }, { 14, a14 },
                { 15, a15 }, { 16, a16 }, { 17, a17 }, { 18, a18 }, { 19, a19 },
                { 20, a20 }, { 21, a21 }, { 22, a22 }, { 23, a23 }, { 24, a24 },
            };

            for (byte pos = 0; pos < 25; pos++)
            {
                ulong tmp = 0;

                tmp = mapItems[pos];

                for (byte j = 0; j < 8; j++)
                {
                    UART.RegisteredWrite(115200, (byte)tmp, out TXD);
                    tmp = tmp >> 8;
                }
            }
        }
示例#6
0
        public static async Task Aggregator(
            FPGA.InputSignal <bool> RXD,
            FPGA.OutputSignal <bool> TXD)
        {
            bool internalTXD = true;

            FPGA.Config.Link(internalTXD, TXD);
            object txdLock = new object();

            byte   counter     = 0;
            object counterLock = new object();

            var transmitterStream = new FPGA.SyncStream <byte>();
            Sequential <byte> transmitterStreamHandler = (value) =>
            {
                lock (txdLock)
                {
                    UART.RegisteredWrite(115200, value, out internalTXD);
                }
            };

            FPGA.Config.OnStream(transmitterStream, transmitterStreamHandler, 2);

            var receiverStream = new FPGA.SyncStream <byte>();
            Sequential <byte> receiverStreamHandler = (value) =>
            {
                Func <uint> instanceId = () => FPGA.Config.InstanceId();

                byte increment = 0;
                lock (counterLock)
                {
                    increment = counter;
                    counter++;
                }
                transmitterStream.Write((byte)(value + increment + instanceId()));
            };

            FPGA.Config.OnStream(receiverStream, receiverStreamHandler, 3);

            Sequential handler = () =>
            {
                byte data = 0;
                UART.Read(115200, RXD, out data);
                for (ushort i = 0; i < data; i++)
                {
                    receiverStream.Write((byte)i);
                }
            };

            const bool trigger = true;

            FPGA.Config.OnSignal(trigger, handler);
        }
        public static async Task Aggregator(
            FPGA.InputSignal <bool> RXD,
            FPGA.OutputSignal <bool> TXD
            )
        {
            bool internalTXD = true;

            FPGA.Config.Link(internalTXD, TXD);

            Sequential mainHandler = () =>
            {
                byte   data = 0;
                byte[] buff = new byte[] { 0, 1, 2, 3, 4 };

                for (int i = 0; i < buff.Length; i++)
                {
                    UART.Read(115200, RXD, out data);
                    UART.RegisteredWrite(115200, data, out internalTXD);
                    byte existing = 0;
                    existing = buff[i];
                    UART.RegisteredWrite(115200, existing, out internalTXD);

                    buff[i] = (byte)(data + existing);
                }

                for (int i = 0; i < buff.Length; i++)
                {
                    data = buff[i];
                    UART.RegisteredWrite(115200, data, out internalTXD);
                }

                byte sum = 0;
                for (int i = 0; i < buff.Length; i++)
                {
                    data = buff[i];
                    sum += data;
                }

                UART.RegisteredWrite(115200, sum, out internalTXD);
            };

            const bool trigger = true;

            FPGA.Config.OnSignal(trigger, mainHandler);
        }
        public static async Task Aggregator(
            FPGA.InputSignal <bool> RXD,
            FPGA.OutputSignal <bool> TXD
            )
        {
            bool internalTXD = true;

            FPGA.Config.Link(internalTXD, TXD);

            Sequential mainHandler = () =>
            {
                byte   data = 0;
                byte[] buff = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7 };

                UART.Read(115200, RXD, out data);

                for (byte i = 0; i < buff.Length; i++)
                {
                    byte tmp = 0;
                    tmp     = buff[i];
                    tmp    += data;
                    buff[i] = tmp;

                    UART.RegisteredWrite(115200, tmp, out internalTXD);
                }

                for (byte jjj = 0; jjj < buff.Length; jjj++)
                {
                    buff[jjj] = jjj;
                }
                ;
            };

            const bool trigger = true;

            FPGA.Config.OnSignal(trigger, mainHandler);
        }
示例#9
0
        public static void DeviceControl(
            FPGA.OutputSignal <bool> DOUT,
            FPGA.InputSignal <bool> RXD,
            FPGA.OutputSignal <bool> TXD
            )
        {
            bool internalTXD = true;

            FPGA.Config.Link(internalTXD, TXD);
            object commsLock = new object();

            bool internalDOUT = false;

            FPGA.Config.Link(internalDOUT, DOUT);

            const uint baud = 115200;

            FPGA.SyncStream <uint> heartBeat = new FPGA.SyncStream <uint>();

            const int servosCount = 5;

            byte[] servosBuff = new byte[servosCount];

            Sequential servosHandler = () =>
            {
                FPGA.OutputSignal <bool> ServoItem = new FPGA.OutputSignal <bool>();
                bool servoOut = false;
                FPGA.Config.Link(servoOut, ServoItem);

                while (true)
                {
                    uint idx       = FPGA.Config.InstanceId();
                    byte servoData = 0;
                    servoData = servosBuff[idx];

                    MG996R.Write(servoData, out servoOut);
                }
            };

            FPGA.Config.OnStartup(servosHandler, servosCount);


            // SERVOs driver
            Sequential <uint> servosDataHandler = (iteration) =>
            {
                byte data = 0;

                lock (commsLock)
                {
                    UART.RegisteredWrite(baud, 2, out internalTXD);

                    for (int i = 0; i < servosCount; i++)
                    {
                        data          = UART.Read(baud, RXD);
                        servosBuff[i] = data;
                    }
                }
            };

            FPGA.Config.OnStream(heartBeat, servosDataHandler);

            // LED driver
            Sequential <uint> ledHandler = (iteration) =>
            {
                uint   data = 0;
                uint[] buff = new uint[64];

                lock (commsLock)
                {
                    UART.RegisteredWrite(baud, 1, out internalTXD);

                    for (int i = 0; i < buff.Length; i++)
                    {
                        UART.ReadUnsigned32(baud, RXD, ref data);
                        buff[i] = data;
                    }
                }

                WS2812B.SyncWrite(buff, 0, buff.Length, out internalDOUT);
            };

            FPGA.Config.OnStream(heartBeat, ledHandler);


            // main application driver
            uint       beat             = 0;
            Sequential heartBeatHandler = () =>
            {
                heartBeat.Write(beat);
                beat++;
            };

            FPGA.Config.OnTimer(TimeSpan.FromMilliseconds(100), heartBeatHandler);
        }
示例#10
0
        public static async Task Aggregator(
            FPGA.OutputSignal <bool> TXD,
            FPGA.InputSignal <bool> RXD
            )
        {
            const uint baud       = 115200;
            const uint tasksCount = 10;

            ushort[]           buff         = new ushort[tasksCount];
            FPGA.Signal <bool> tasksTrigger = false;
            object             buffLock     = new object();
            uint        completedTasks      = 0;
            Func <bool> tasksCompleted      = () => completedTasks == tasksCount;
            bool        internalTXD         = true;

            FPGA.Config.Link(internalTXD, TXD);

            Sequential onStartup = () =>
            {
                while (true)
                {
                    byte cmd = UART.Read(baud, RXD);
                    lock (buffLock)
                    {
                        completedTasks = 0;
                        tasksTrigger   = true;
                    }

                    FPGA.Runtime.WaitForAllConditions(tasksCompleted);

                    for (uint idx = 0; idx < buff.Length; idx++)
                    {
                        ushort data = 0;
                        data = buff[idx];
                        UART.RegisteredWrite(baud, (byte)data, out internalTXD);
                        UART.RegisteredWrite(baud, (byte)(data >> 8), out internalTXD);
                    }
                }
            };

            FPGA.Config.OnStartup(onStartup);

            Sequential taskHandler = () =>
            {
                uint taskIndex = FPGA.Config.InstanceId();

                FPGA.OutputSignal <bool> ADC1NCS  = new FPGA.OutputSignal <bool>();
                FPGA.OutputSignal <bool> ADC1SLCK = new FPGA.OutputSignal <bool>();
                FPGA.OutputSignal <bool> ADC1DIN  = new FPGA.OutputSignal <bool>();
                FPGA.InputSignal <bool>  ADC1DOUT = new FPGA.InputSignal <bool>();

                ushort adcChannel1Value = 0, adcChannel2Value = 0;
                ADC102S021.Read(out adcChannel1Value, out adcChannel2Value, ADC1NCS, ADC1SLCK, ADC1DIN, ADC1DOUT);

                lock (buffLock)
                {
                    // TODO: inline expression in memory accessor
                    uint offset1 = taskIndex * 2, offset2 = offset1 + 1;
                    buff[offset1] = adcChannel1Value;
                    buff[offset2] = adcChannel2Value;
                    completedTasks++;
                }
            };

            FPGA.Config.OnSignal(tasksTrigger, taskHandler, tasksCount);
        }