Пример #1
0
        public void Lib_Sin()
        {
            float stepDelta = FPGATrigonometryConstants.TwoPI / Steps;

            var posError = double.MinValue;
            var negError = double.MaxValue;
            var absError = 0d;

            // able to achieve about this accuracy
            var eps = 3.7e-6;

            for (var step = 0; step < Steps; step++)
            {
                var rad = step * stepDelta;

                // calculate sin
                var taylorSin     = FPGATrigonometry.Sin(rad);
                var calculatedSin = Math.Sin(rad);
                var sinDelta      = taylorSin - calculatedSin;

                absError = Math.Max(absError, Math.Abs(sinDelta));
                posError = Math.Max(sinDelta, posError);
                negError = Math.Min(sinDelta, negError);

                Assert.IsTrue(sinDelta < eps, $"Failed for sin({rad})");
            }
        }
Пример #2
0
        public void Sin()
        {
            using (var port = new QuokkaPort())
            {
                var rnd = new Random(Environment.TickCount);

                foreach (var idx in Enumerable.Range(-5000, 10000))
                {
                    var value = (float)(idx * rnd.NextDouble() * FPGATrigonometryConstants.TwoPI);
                    port.WriteFloat(value);

                    var expected    = FPGATrigonometry.Sin(value);
                    var actualBytes = port.Read(4, true, port.DefaultTimeout);
                    var actual      = TestConverters.FloatFromByteArray(actualBytes);

                    Assert.AreEqual(expected, actual, $"Failed for {value}");
                }
            }
        }
Пример #3
0
        public static async Task Aggregator(
            FPGA.InputSignal <bool> RXD,
            FPGA.OutputSignal <bool> TXD
            )
        {
            Sequential handler = () =>
            {
                FPU.FPUScopeNoSync();

                while (true)
                {
                    float data = 0;
                    UART.ReadFloat(115200, RXD, out data);

                    data = FPGATrigonometry.Sin(data);

                    UART.WriteFloat(115200, data, TXD);
                }
            };

            FPGA.Config.OnStartup(handler);
        }