我对CPLD编程完全陌生,我想使用VHDL语言在Xilinx ISE Project Navigator中编程一个latch +计数器。这是它必须工作的方式,它必须只有这样:这种设备获得2个时钟信号。当其中一个从高状态变为低电平状态时,数据输入位将被传输到输出并被锁存。当第二个时钟从低电平变为高电平状态时,输出位增加1.不幸的是我的代码并不想工作....
CustomCell
有没有其他方法可以实现这一目标?请回复。任何形式的帮助/建议都将受到强烈赞赏。非常感谢提前!!
答案 0 :(得分:0)
根据对计数器的补充评论,我提出了以下想法。它是否能在现实中工作很难确定,因为我需要一个适当的EPROM接口时序图。 重要,可能存在时钟域交叉问题,具体取决于对两个时钟信号的断言有何限制;如果CLKLD
的下降沿接近CLKDA
的上升沿,则设计可能无法可靠地工作。
signal new_start_address : std_logic := '0';
signal start_address : std_logic_vector(D'range) := (others => '0');
...
process (CLKLD, CLKDA)
begin
if (CLKDA = '1') then
new_start_address <= '0';
elsif (falling_edge(CLKLD)) then
start_address <= D;
new_start_address <= '1';
end if;
end process;
process (CLKDA)
begin
if (rising_edge(CLKDA)) then
if (new_start_address = '1') then
tmp <= start_address;
else
tmp <= tmp + 1;
end if;
end if;
end process;
我在界面上并不完全清楚,但可能是tmp <= start_address;
行应该成为tmp <= start_address + 1;
您可能还需要将Q
的作业替换为:
Q <= start_address when new_start_address = '1' else tmp;
同样,如果没有时序图,很难确定。