SPI를 통해 LTC2426 DAC와의 통신을 시도 했으므로 missrebly에 실패했습니다. 지금 나는 도움을 구하고있다. 누군가 내 코드가 작동하지 않는 이유를 말해 줄 수 있습니까? CSDAC가 올바르게 작동하고 SCLK가 생성되고 32 비트가 전송되지만 여전히 타이밍을 망칠 수 있습니다. 누군가가 제가 코드를 수정하도록 도와 주신다면 매우 감사 할 것입니다.vhdl에서 SPI 버스를 구현하려고 시도했습니다.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity DAC is
port
(
CLK : in STD_LOGIC;
SCLK : out STD_LOGIC;
MOSI : out STD_LOGIC;
CSDAC : out STD_LOGIC := '1'
);
end DAC;
architecture Behavioral of DAC is
Signal Counter : Integer range 0 to 32 := 0;
Signal CurrentBit : Integer range 0 to 32 := 0;
Signal DataSent : STD_LOGIC := '1';
Constant Data : STD_LOGIC_VECTOR(31 downto 0) := X"0030FFF0";
Signal Slope : STD_LOGIC := '0';
begin
Prescaler : process(CLK)
begin
if rising_edge(CLK) then
if Counter = 5 then
Slope <= not(Slope);
Counter <= 0;
else
Counter <= Counter + 1;
end if;
end if;
end process;
SCLK <= SLOPE;
WriteDac : process(CLK)
begin
if rising_edge(CLK) then
if DataSent = '1' then
if CurrentBit <= 31 then
CSDAC <= '0';
MOSI <= Data(CurrentBit);
CurrentBit <= CurrentBit +1;
else
CSDAC <= '1';
DataSent <= '0';
end if;
end if;
end if;
end process;
end Behavioral;
편집 : NEW CODE
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity DAC is
port
(
CLK : in STD_LOGIC;
SCLK : out STD_LOGIC;
MOSI : out STD_LOGIC;
DEBUG : out STD_LOGIC := '1';
CSDAC : out STD_LOGIC := '1'
);
end DAC;
architecture Behavioral of DAC is
Signal Counter : Integer range 0 to 6 := 0;
Signal Counter2 : Integer range 0 to 33 := 0;
Signal CurrentBit : Integer range 0 to 33 := 0;
Signal Fixed : STD_LOGIC := '0';
Signal DataSent : STD_LOGIC := '0';
Constant Data : STD_LOGIC_VECTOR(31 downto 0) := X"0FFF0C00";
Signal Slope_last : STD_LOGIC := '0';
Signal Slope : STD_LOGIC := '0';
Signal MSS : STD_LOGIC := '0';
begin
WriteDac : process(CLK)
begin
if rising_edge(CLK) then
if Counter = 5 then
Slope_last <= Slope;
Slope <= not(Slope);
if Slope_last = '1' and Slope = '0' then
if Fixed = '1' then
if DataSent = '0' then
if CurrentBit <= 31 then
CSDAC <= '0';
DEBUG <= '0';
MOSI <= Data(CurrentBit);
CurrentBit <= CurrentBit +1;
else
MOSI <= '0';
CSDAC <= '1';
DEBUG <= '1';
DataSent <= '1';
end if;
end if;
else
if Counter2 <= 31 then
CSDAC <= '1';
DEBUG <= '1';
Counter2 <= Counter2 + 1;
MSS <= not(MSS);
MOSI <= MSS;
else
Fixed <= '1';
MOSI <= '0';
end if;
end if;
end if;
else
Counter <= Counter + 1;
end if;
end if;
end process;
SCLK <= SLOPE;
end Behavioral;
내가 SCLK가 회복 비트의 몇 가지를 보낼 때 때문에이 MOSI을 펄싱하고 있습니다. 첫 번째 SCLK는 약 1.4 mhz에서 작동합니다. 모스를 펄스하면 4.167MHZ로 복구됩니다. 1.4mhz가되면 1.5mhz가 될 수 있으므로 너무 좋지 않습니다.
@baldyHDL이 더 좋은 답변입니다. 하나의 프로세스에 코드를 추가하는 것이 좋습니다. FSM을 구축하는 것도 생각할 수 있습니다. 약간의 과장이 현재의 필요하지만, 솔루션은 항상 좀 더 복잡한 시간이 지나면 :-) – vermaete