Da meine Verilog/VHDL-Kenntnisse sehr gering sind (also eher 0) , dachte ich, dass ich es mit Copilot versuchen könnte.
Ich habe also Copilot angewiesen, ein VHDL-Programm zu für mein Problem zu erstellen. Er hat dann tatsächlich auch eines erstellt, das mir plausibel vorkam und syntaktisch korrekt war. In der IDE (Quartus) kamen dann aber Fehler, die ich sukzessive mit Copilot wegbekommen habe. Das Programm habe ich dann auf den CPLD gebrannt und ein entsprechendes Arduino-Programm dazugestrickt.
Und dann kam nach anfänglicher Euphorie die erwartungsgemäße Enttäsuchung. Es hat nicht funktioniert.

Aber das stimmt leider nicht, da es tatsächlich sehr gravierende Unterschiede gibt. Und dann kämpft man gegen die Lmitationen der Hardware: Eine Variable oder ein if-Block mehr und schon kann das ganze nciht mehr synthetisiert werden, was wohl an meinem schwachbrüstigen Device liegt.
Aber immerhin habe ich nach einiger Mühe tatsächlich eine Lösung gefunden, die allerdings mit der Copilot-Version nicht mehr viel gemein hat.
Und ab und zu habe ich Copilot gefragt wie z.B. welcher GND-Pin ist bei dem CPLD in der Nähe von Pin 64.
Und hier also mein erstes VHDL-Programm, das ich hingedengelt habe bis es funktioniert (die Profis wissen sicher, wie man so was besser machen kann, ich bin aber sehr froh, dass es überhaupt geklappt hat):
Code: Alles auswählen
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity TimeMeasurementCounter is
Port (
COUNT_CLK : in STD_LOGIC; -- 16 MHz clock for time measurement
READ_CLK : in STD_LOGIC; -- Clock signal for micro controller read out
READ_RES : in STD_LOGIC; -- READ_RES='0' + one READ_CLK resets read counter
READ_INC : in STD_LOGIC; -- READ_INC='1' + one READ_CLK incements read counter
TRIG : in STD_LOGIC; -- start the measurement
SIG : in STD_LOGIC; -- signals 1-0-Transition to be measured
A : in STD_LOGIC_VECTOR (1 downto 0); -- Nibble address
D : out STD_LOGIC_VECTOR (3 downto 0) -- DAta port for nibble
);
end TimeMeasurementCounter;
architecture Behavioral of TimeMeasurementCounter is
signal TC : STD_LOGIC_VECTOR (11 downto 0) := (others => '0'); -- Timer Counter
type reg_array is array (0 to 3) of STD_LOGIC_VECTOR (11 downto 0);
signal R : reg_array := (others => (others => '0')); -- Register for measured times
signal RC : STD_LOGIC_VECTOR (2 downto 0) := (others => '0'); -- Index for registration process
signal RC2 : STD_LOGIC_VECTOR (1 downto 0) := (others => '0'); -- Index for readout process
signal sig_state: STD_LOGIC := '0'; -- state is 1 to indicate that a signal was registered
-- will go back to 0 when SIG gets back to 1
constant DEAD_TIME : INTEGER := 250; -- Pulses registered after XXus * 16MHz
begin
-- Counter and Signal registration process
process (COUNT_CLK,SIG,sig_state)
variable counter : unsigned(11 downto 0);
begin
if rising_edge(COUNT_CLK) then
if TRIG = '0' then -- Initialization and start of measurement
TC <= (others => '0');
RC <= (others => '0');
--count_enable <= '1';
R(0) <= (others => '0');
R(1) <= (others => '0');
R(2) <= (others => '0');
R(3) <= (others => '0');
sig_state <='0';
else -- Counting
counter := unsigned(TC);
counter := counter +1;
TC <= std_logic_vector(counter);
end if;
if SIG = '0' and (sig_state='0') and counter > DEAD_TIME then -- Signal registration
if unsigned(RC) < 4 then -- register up to 4 signals
R(to_integer(unsigned(RC))) <= std_logic_vector(counter);
RC <= std_logic_vector(unsigned(RC) + 1);
end if;
sig_state <= '1'; -- prevent multiple registrations whil SIG is 0
elsif SIG = '1' then -- SIG went to 1 => get prepared for a new measurement
sig_state <= '0';
end if;
end if;
end process;
-- Readout process
process (READ_CLK) --- is clocked with a READ_CLK
begin
if falling_edge(READ_CLK) then
if READ_RES='0' then --- Reset the Read Counter
RC2 <= (others => '0');
elsif READ_INC ='1' then --- Increment Read Counter
RC2 <= std_logic_vector(unsigned(RC2) + 1);
else --- Copy adressed Nibble into D
D <= R(to_integer(unsigned(RC2)))(4 * to_integer(unsigned(A)) + 3 downto 4 * to_integer(unsigned(A)));
end if;
end if;
end process;
end Behavioral;
Es kommen schnelle Ergebnisse, die aber nur ansatzweise brauchbar sind
Man muss viel iterieren bis es nervt
Bei den Iterationen kommt man manchmal zu Schleifen. Hat man zwei Probleme, können nicht immer beide gelöst werden. Die AI hat mir immer wieder Codes generiert, die das alte Problem wieder drin hatten
Zum Nachschlagen ist Copilot sehr gut geeignet, da es sehr schnell Resultate generiert
Um die eigene Einarbeitung in das Thema kommt man hier nicht umhin, aber da kann die AI auch unterstützen.
Vom Mythos: "Ich spezifiziere, die AI kondiert" sind wir noch weit entfernt.