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