我在FPGA套件上运行我的第一个VHDL代码。我是一个简单的外部ADC(AD574A),它与FPGA套件接口。我在下面粘贴的代码看起来在模拟中给出了很好的结果,但在套件中没有任何东西可以正常工作。代码中的第一个进程(进程(clk))将时钟频率降低了有限的时间。并且生成的低频方波用于驱动第二过程(PROCESS(rst,clk_out))。 clk_out被定义为程序中的缓冲区。亲切地告诉我,如果使用不同时钟源驱动两个进程的过程是否正确?我知道这就是问题所在,因为虽然这两个部分模拟正确,但在套件中第一个过程有效,第二个过程没有。
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity newADC is
port ( clk: in std_logic;
rst: in std_logic;
R_C: buffer std_logic;
clk_out : buffer STD_LOGIC;
STS: in std_logic;
data: in std_logic_vector(4 downto 0);
data_out: out std_logic_vector(4 downto 0)
);
end newADC;
architecture Behavioral of newADC is
signal temp: std_logic_vector(4 downto 0):=(others => '0');
signal i: integer range 0 to 2:=0;
signal j: integer range 0 to 10:=0;
TYPE state IS (reading, converting);
SIGNAL pr_state, nx_state: state;
begin
----------------reduce clock frequency-------------------------
PROCESS (clk)
VARIABLE count_clk : INTEGER RANGE 0 TO 10;
BEGIN
IF (clk'EVENT AND clk='1') THEN
count_clk := count_clk + 1;
IF (count_clk = 7 ) THEN -------- clk_out time period=
clk_out <= NOT clk_out; -------- clk*count*2
count_clk := 0; -------- board 'clk' is 40MHz/25ns time period
END IF;
END IF;
END PROCESS;
----- Synchronous section: ----------------------------------------------
PROCESS (rst, clk_out)
BEGIN
IF (rst='1') THEN
pr_state <= reading;
ELSIF (clk_out'EVENT AND clk_out='1') THEN
pr_state <= nx_state;
END IF;
END PROCESS;
---------- Cmbinational section: ------------------------------------------
PROCESS (clk_out,STS,data,pr_state)
BEGIN
CASE pr_state IS
WHEN reading =>
temp <= data;
case i is
when 0=> R_C <= '1';
when 1=> R_C <= '0';
when 2=> R_C <= '1';
end case;
i <= i+1;
if (i = 3)then
i <= 0;
end if;
IF (STS='1') THEN nx_state <= converting;
ELSE nx_state <= reading;
END IF;
WHEN converting =>
R_C <= '1';
IF (STS='0') THEN nx_state <= reading;
ELSE nx_state <= converting;
END IF;
END CASE;
data_out <= temp;
END PROCESS;
---------------------------------------------------------------------------
end Behavioral;
期待这项急需的帮助 - By-Tapabrata Sen
答案 0 :(得分:0)
首先,要充分关注时钟。当您更熟悉硬件设计时,可以使用多个时钟。
使用时钟启用,我也希望同步复位。
PROCESS (clk)
VARIABLE count_clk : INTEGER RANGE 0 TO 10;
BEGIN
IF (clk'EVENT AND clk='1') THEN
count_clk := count_clk + 1;
clk_en <= '0';
IF (count_clk = 7 ) THEN -------- clk_out time period=
clk_en <= '1'; -------- clk*count*2
count_clk := 0; --------
END IF;
END IF;
END PROCESS;
PROCESS (clk)
BEGIN
IF (rising_edge(clk)) THEN
IF (rst='1') THEN
pr_state <= reading;
ELSIF (clk_en='1') THEN;
pr_state <= nx_state;
END IF
END IF;
END PROCESS;
最后一个过程中的敏感度列表也是错误的,所有对过程的更改输入都必须是敏感列表的一部分,并且clk_out不应该在那里
答案 1 :(得分:0)
i
不在组合部分流程的敏感性列表中。 clk_out
似乎没有必要写入敏感列表中。
i
在pr_state
的转换时递增,并且可能容易受到组合/路径延迟的影响,您可能希望使用clk_out
计时。每当敏感度列表中的任何信号发生事件时,i都会递增,基本上是clk_out
的两个边,data
或pr_state
中的任何变化。这可能是模拟和实施性能差异的原因。
R_C是AD754A Read_Convert,它可能行为不端。在综合期间,您应该至少看到一条关于i
计数器如何计时的警告消息。如果我不得不在没有看到你的综合报告的情况下冒险,我敢打赌R_C是静态的('1')。如果您有示波器,请查看AD754A发生的情况。
您的VHDL设计规范可能存在其他问题,j
未在任何地方分配,您有两个不需要的使用条款:
-- use ieee.std_logic_arith.all;
-- use ieee.std_logic_unsigned.all;
在你声称纯粹是组合的过程中增加i
计数器似乎是违反直觉的。单独的流程或在评论中删除声明可能已经成熟。
我没有尝试使用i
计数器修复程序运行“修补”版本。它需要一个测试平台来确定你认为可以开始的东西。
数据表随时可供有兴趣的人使用,请参阅AD574A (Rev. B)数据表。