Mein VHLD Programm soll 35 bit (jetzt aber erstmal 7) seriell übertragen nach dem die Run-Taste und der Modus abgefragt wurde. Ich wollte erst die beiden Eingänge abfragen und dann mit jedem Clockzyklus ein bit übertragen. Es werden später beim Sender und Empfänger die gleiche Clock benutzt. Bei ansteigender Flanke werden die Daten geschrieben und bei fallender dann gelesen. Damit das ganze statisch bleibt. Ich habe schon folgendes geschrieben:
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity Sender is Port ( Reset : in std_logic; Run : in std_logic; Mode : in std_logic_vector(1 downto 0); clock : in std_logic; Data : out std_logic); end Sender;
architecture Behavioral of Sender is begin
process (Mode, Run, clock) variable shift_reg: std_logic_vector(6 downto 0):= "1111111"; begin if Run = '1' then case Mode is when "00" => -- good header, data segment 1 and checksum Data <= '1'; for I in 0 to 6 loop shift_reg := "0010010"; if (clock'event and clock = '1') then shift_reg(6 downto 1) := shift_reg (5 downto 0); Data <= shift_reg(6); end if; end loop; when "01" => -- good header, data segment 2 and checksum Data <= '1'; when "10" => -- invalid header, data segment 1, checksum Data <= '1'; when "11" => -- good header, datasegment 2, invalid checksum Data <= '1'; when others => Data <= 'X'; end case; end if; end process; end Behavioral;
Nur leider bekommen ich immer folgende Fehlermeldung: Signal Data cannot be synthesized, bad synchronous description.
Kennt jemand Abhilfe?
Gruss
Marcus
Re: VHDL Schieberegister
Probier mal das:
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity Sender is Port ( Reset : in std_logic; Run : in std_logic; Mode : in std_logic_vector(1 downto 0); clock : in std_logic; Data : out std_logic); end Sender;
architecture Behavioral of Sender is begin
process (Mode, Run, clock) variable shift_reg: std_logic_vector(6 downto 0):= "1111111"; begin if (clock'event and clock = '1') then if Run = '1' then case Mode is when "00" => -- good header, data segment 1 and checksum Data <= '1';
for I in 0 to 6 loop shift_reg := "0010010";
shift_reg(6 downto 1) := shift_reg (5 downto 0); Data <= shift_reg(6); end loop; when "01" => -- good header, data segment 2 and checksum Data <= '1'; when "10" => -- invalid header, data segment 1, checksum Data <= '1'; when "11" => -- good header, datasegment 2, invalid checksum Data <= '1'; when others => Data <= 'X'; end case; end if; end if; end process; end Behavioral;
Gruesse,
Michael
Re: VHDL Schieberegister
Vielen Dank es klappt.
Gruss
Marcus
Re: VHDL Schieberegister
Meine Vorfreude war vielleicht etwas zu früh. Den Fehler habe ich nicht mehr aber es werden leider auch meine Daten nicht mit der Clock übertragen. Ich den Code abgeändert und versucht die Daten im Takt der Clock zu übertragen. Nur leider klappt es nicht so wie ich mir das so vorstelle. Vielleicht kann jemand mir helfen.
Hier mein jetzige Code:
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity Sender is Port ( Reset : in std_logic; Run : in std_logic; Mode : in std_logic_vector(1 downto 0); clock : in std_logic; Data : out std_logic); end Sender;
begin if (clock'event and clock = '1') then if Run = '1' then case Mode is when "00" => -- good header, data segment 1 and checksum -- send the header first shift_reg_h := "0010010"; for I in 0 to 6 loop shift_reg_h (6 downto 1) := shift_reg_h (5 downto 0); if (clock'event and clock = '0') then Data <= shift_reg_h (6); end if; end loop; -- send the datasegment next shift_reg_d := "001001100100011101000100"; --Marcus number for I in 0 to 23 loop shift_reg_d (23 downto 1) := shift_reg_d (22 downto 0); Data <= shift_reg_d (23); end loop; -- send the checksum last
when "01" => -- good header, data segment 2 and checksum -- send the header first shift_reg_h := "0010010"; for I in 0 to 6 loop shift_reg_h (6 downto 1) := shift_reg_h (5 downto 0); Data <= shift_reg_h (6); end loop; -- send the datasegment last shift_reg_d := "000110011001010000001000"; -- Johns number for I in 0 to 23 loop shift_reg_d (23 downto 1) := shift_reg_d (22 downto 0); Data <= shift_reg_d (23); end loop; -- send the checksum last
when "10" => -- invalid header, data segment 1, checksum -- send the invalid header first shift_reg_h := "0000000"; -- INVALID HEADER for I in 0 to 6 loop shift_reg_h (6 downto 1) := shift_reg_h (5 downto 0); Data <= shift_reg_h (6); end loop; -- send the datasegment last shift_reg_d := "001001100100011101000100"; --Marcus number for I in 0 to 23 loop shift_reg_d (23 downto 1) := shift_reg_d (22 downto 0); Data <= shift_reg_d (23); end loop; -- send the checksum last
when "11" => -- good header, datasegment 2, invalid checksum -- send the header first shift_reg_h := "0010010"; for I in 0 to 6 loop shift_reg_h (6 downto 1) := shift_reg_h (5 downto 0); Data <= shift_reg_h (6); end loop; -- send the datasegment next shift_reg_d := "000110011001010000001000"; -- Johns number for I in 0 to 23 loop shift_reg_d (23 downto 1) := shift_reg_d (22 downto 0); Data <= shift_reg_d (23); end loop; -- send the checksum last (INVALID)
when others => Data <= 'X'; end case; end if; end if; end process; end Behavioral;