detstorabla skrev: ↑07 feb 2022, 21:09
Så jag har börjat med att implementera lite enkel logik. Jag har i nuläget fokuserat på själva konceptet och har inte alls hunnit verifiera allt. Men grunden verkar iallafall fungera när jag simulerar.
Så förutom klocka och reset så kommer det inte 4 digitala signaler från mikrofonerna (antar att vi har någon form av komparator där). Signalerna måste vara minst 1 klockcykel lång. Dessa signaler klockas om för att undvika metastabilitet då de är asynkrona. Sen låser vi signalerna internt tills vi har gått igenom tillståndsmaskinen.
Eftersom det är enklare att vara kritisk än korrekt så kommer jag med följande förslag istället för att sätta mig in i alla detaljerna i din lösning.
Det blir lite komplikationer iom att du startar räknaren på första signalen från mikrofon, utan att kunna veta vilken mikrofon det här. (I mina kronografer så slipper man det problemet iom att man alltid vet vilken sensor som kommer först, vilket förenklar avsevärt).
MEN, du har ju en hel stor FPGA. Så istället så skulle jag låta klockan köra räknarna "free running" direkt från reset och helt enkelt ha större räknare. Med exv. 64 bitars räknare så kan man ju räkna på i drygt 500 år med 1 GHz-klocka innan man får overflow, så det finns ju stora marginaler att ta av. Om man inte får iväg skottet på (säg) ett år efter att man startat systemet, eller från förra skottet, så tycker jag man kan få skylla sig själv.
Då får man istället fyra helt separata och parallella kanaler där riskerna för interaktioner (exv. om två skott kommer "samtidigt") är obefintliga. Om man dessutom lägger en vippa på ingången som låser den hög när man fått "stopp-signal" på den kanalen (här kan man ju meckla med hysteres osv.) så blir avbrottslogiken till resten av processorn trivial; en fyra ingångars AND-grind med "stopp" signalerna från mikrofonerna som ingång. (Ja, man kan ta den signalen från själva räknaren med, dvs ta ut en stopp-signal där).
Med en dylik lösning så försvinner i stort sett hela styrlogiken, till en kostnad av högre energiåtgång (fyra räknare skall klockas kontinuerligt), men det kan man nog leva med här. Det blir också trivialt att skala upp eller ner till fler eller färre kanaler eftersom de är helt separata och bara består av ingång (stopp från extern sensor) och en räknare som stoppar när den får signal.
Det enda man saknar i en dylik lösning (även din om jag inte ser fel, och även i mina kronografer, så jag är inte bättre själv) är någon form av time-out som kan återställa ifall man bara får signal på en, eller två, men inte samtliga mikrofoner i rimlig tid.
Det hade jag löst genom att dra stoppsignalerna/ingångarna till en OR-grind som jag dragit ut som ytterligare ett interrupt till extern processor. Då får man en signal man kan starta en timeout med, och om man inte fått "färdigt"-avbrottet inom rimlig tid så resettar man, lämnar felmeddelande till användaren, och kör igen.
Det är naturligtvis trivialt att göra detta på FPGA:n med; bara starta en räknare och trigga en reset om den hinner räkna klart (den måste naturligtvis stoppas av "färdig"-signalen). Nackdelen med det är att man inte kan ändra sin timeout enkelt, och man måste fortfarande lämna en separat signal ut för att tala om att något gick fel. (Ja, dvs, man kan naturligtvis göra den räknaren programmerbar utifrån genom att låta extern processor ladda ett register, och man måste iofs ha buss osv. ändå, men det blir extra krångel, helt klart).