尝试用vhdl实现spi总线

尝试用vhdl实现spi总线,vhdl,fpga,spi,dac,spartan,Vhdl,Fpga,Spi,Dac,Spartan,我一直在尝试通过SPI与LTC2426 DAC通信,但我的通信错误。现在我正在寻求帮助。有人能告诉我为什么我的代码不起作用吗。CSDAC工作正常,生成SCLK并发送32位,但我可能仍然拧紧了计时。如果有人帮我修改代码,我会非常感激的 library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity DAC is port

我一直在尝试通过SPI与LTC2426 DAC通信,但我的通信错误。现在我正在寻求帮助。有人能告诉我为什么我的代码不起作用吗。CSDAC工作正常,生成SCLK并发送32位,但我可能仍然拧紧了计时。如果有人帮我修改代码,我会非常感激的

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;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
使用IEEE.STD_LOGIC_ARITH.ALL;
使用IEEE.STD_LOGIC_UNSIGNED.ALL;
实体DAC是
港口
(
CLK:标准逻辑中;
SCLK:输出标准逻辑;
MOSI:输出标准逻辑;
CSDAC:输出标准逻辑:='1'
);  
结束DAC;
DAC的体系结构是
信号计数器:整数范围0到32:=0;
信号CurrentBit:整数范围0到32:=0;
信号数据源:标准逻辑:='1';
常数数据:标准逻辑向量(31向下至0):=X“0030FFF0”;
信号斜率:标准逻辑:='0';
开始
预分频器:进程(CLK)
开始
如果上升沿(CLK),则
如果计数器=5,则

斜率是否第二个过程对SCLK(或斜率)i.s.o.CLK敏感?
您可以查看一些SPI模块的示例。即使是用Verilog编写的,这也不是一个很好的例子。您必须更新与SCK相关的位计数器(CurrentBit)。 e、 g:

。。。
WriteDac:进程(CLK)
开始
如果上升沿(CLK),则

斜坡_last@baldyHDL我有更好的答案。将代码放在一个进程中会更好。你也可以考虑建立一个FSM。对于您当前的需求来说,这有点过头了,但解决方案在一段时间后总是变得更加复杂:-)我已经根据您的建议编写了我的代码。我的逻辑分析器解码spi总线,但lt2624仍然无法工作。我的新代码将在几分钟内发布你使用模拟器吗?例如,您可以使用包含lite模拟器的Xilinx WebPack(免费)。模拟有助于发现明显的错误;在您的新代码中,例如,您必须在“if Counter=5 then”行之后将“Counter”重置为0。我直接对电路板编程并连接logic8逻辑分析仪。我还使用前面提到的示波器对其进行了检查。。。在“如果计数器=5那么”行之后重置计数器。模拟可以让您深入了解代码。检查范围是伟大的。。。在模拟之后,将其用作第二步!
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;
...
WriteDac : process(CLK) 
begin
   if rising_edge(CLK) then
      slope_last<=slope;

      if slope_last='1' and slope='0' then -- e.g. falling edge!
          if DataSent = '1' then
 ...