VHDL写数模转换芯片的控制电路问题,仿真和实际信号不一样
时间:10-02
整理:3721RD
点击:
求大神!
FPGA入门不久,在写一个SPI 串口协议的 DAC 芯片控制模块,觉得仿真得到的结果没有问题,但是上了板子之后就各种不对。困在这个问题上好几天了,求大神帮忙看一眼啊,就是这段代码:
architecture Behavioral of DtoA_unit2 is
constant data1 : std_logic_vector(11 downto 0) := "110011001100"; --12位的数字电压值输入
constant address:std_logic_vector(3 downto 0) := "0101"; --16通道的通道选择
signal DATA:std_logic_vector(23 downto 0) := "0000"& address &"11" & data1 & "00";--24位的SPI控制字
signal count_clk: std_logic_vector(9 downto 0):="0000000000";
begin
process (CLK,RESET)
begin
if (CLK'event and CLK='0') then
if (RESET='0') then
count_clk = "0000110011" then
count_clk<=count_clk;
else
count_clk<=count_clk+'1';
end if;
if count_clk<"0000000011" then
SYNC_LOW<='1';
else
SYNC_LOW<='0';
end if;
if count_clk<"0000000100" then
SCLK<='1';
SDIN<=DATA(23);
elsif count_clk<"0000000101" then
SCLK<='0';
SDIN<=DATA(23); --翻一下SCLK,载入第二十三位命令
elsif count_clk<"0000000110" then
SCLK<='1';
SDIN<=DATA(22);
elsif count_clk<"0000000111" then
SCLK<='0';
SDIN<=DATA(22); --翻一下SCLK,载入第二十二位命令
。中间就是不断重复这个过程,直到第一位
elsif count_clk<"0000110010" then
SCLK<='1';
SDIN<=DATA(0);
elsif count_clk<"0000110011" then
SCLK<='0';
SDIN<=DATA(0); --翻SCLK,载入最后一位命令
end if;
end if;
end process;
end Behavioral;
仿真如图片所示,,但是上到板子之后,逻辑分析仪看到的基本上就是噪声,只有reset起作用。改过一些地方之后,变成不理会reset, 而是不断地送命令出来。请问是因为这种写法有问题吗? 这段码是参照网上的一个example写的,是不是有什么功能只可仿真不能综合?
先谢过!
FPGA入门不久,在写一个SPI 串口协议的 DAC 芯片控制模块,觉得仿真得到的结果没有问题,但是上了板子之后就各种不对。困在这个问题上好几天了,求大神帮忙看一眼啊,就是这段代码:
architecture Behavioral of DtoA_unit2 is
constant data1 : std_logic_vector(11 downto 0) := "110011001100"; --12位的数字电压值输入
constant address:std_logic_vector(3 downto 0) := "0101"; --16通道的通道选择
signal DATA:std_logic_vector(23 downto 0) := "0000"& address &"11" & data1 & "00";--24位的SPI控制字
signal count_clk: std_logic_vector(9 downto 0):="0000000000";
begin
process (CLK,RESET)
begin
if (CLK'event and CLK='0') then
if (RESET='0') then
count_clk = "0000110011" then
count_clk<=count_clk;
else
count_clk<=count_clk+'1';
end if;
if count_clk<"0000000011" then
SYNC_LOW<='1';
else
SYNC_LOW<='0';
end if;
if count_clk<"0000000100" then
SCLK<='1';
SDIN<=DATA(23);
elsif count_clk<"0000000101" then
SCLK<='0';
SDIN<=DATA(23); --翻一下SCLK,载入第二十三位命令
elsif count_clk<"0000000110" then
SCLK<='1';
SDIN<=DATA(22);
elsif count_clk<"0000000111" then
SCLK<='0';
SDIN<=DATA(22); --翻一下SCLK,载入第二十二位命令
。中间就是不断重复这个过程,直到第一位
elsif count_clk<"0000110010" then
SCLK<='1';
SDIN<=DATA(0);
elsif count_clk<"0000110011" then
SCLK<='0';
SDIN<=DATA(0); --翻SCLK,载入最后一位命令
end if;
end if;
end process;
end Behavioral;
仿真如图片所示,,但是上到板子之后,逻辑分析仪看到的基本上就是噪声,只有reset起作用。改过一些地方之后,变成不理会reset, 而是不断地送命令出来。请问是因为这种写法有问题吗? 这段码是参照网上的一个example写的,是不是有什么功能只可仿真不能综合?
先谢过!
仿真结果
友情帮顶~~~~~~~~~~~~~~~~~~~~~
我觉得你用状态机写吧,这个好难看懂
状态机可能因为不够熟练,开始写的状态机,总是莫名其妙的原因编译都过不了,,然后找了这个例子,写出来还靠谱点。上了板子之后以后能输出电压一会又不行的。
状态机还在接着研究。