在VHDL中无法使用2个时钟信号创建锁存器和计数器

时间:2015-08-18 12:55:41

标签: vhdl xilinx

我对CPLD编程完全陌生,我想使用VHDL语言在Xilinx ISE Project Navigator中编程一个latch +计数器。这是它必须工作的方式,它必须只有这样:这种设备获得2个时钟信号。当其中一个从高状态变为低电平状态时,数据输入位将被传输到输出并被锁存。当第二个时钟从低电平变为高电平状态时,输出位增加1.不幸的是我的代码并不想工作....

CustomCell

有没有其他方法可以实现这一目标?请回复。任何形式的帮助/建议都将受到强烈赞赏。非常感谢提前!!

1 个答案:

答案 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;

同样,如果没有时序图,很难确定。