这个VHDL代码如何工作?

时间:2017-04-21 09:54:57

标签: vhdl

我会在下面的来源帖子中发表评论,但我还没有这个特权,所以我想我可能只是问一个问题,以便我能得到一些澄清。

how to delay a signal for several cycles in vhdl

基本上我需要对我的VHDL项目的行为中的这个过程实现2个时钟周期延迟(代码如下所示):

  process(font_address(0), font_address(1), font_address(2), font_address(3),font_address(4), font_address(5), font_address(6), font_address(7),vga_hcount(0), vga_hcount(1),vga_hcount(2),CLK)

begin




--if (CLK'event and CLK = '1') then
  -- a_store <= a_store(1 downto 0) & a;
  -- a_out <= a_store(1 downto 0);
 --end if;

if (CLK'event and CLK = '1') then
case vga_hcount(2 downto 0) is
when "000" => font_bit <= font_data(7);
when "001" => font_bit <= font_data(6);
when "010" => font_bit <= font_data(5);
when "011" => font_bit <= font_data(4);
when "100" => font_bit <= font_data(3);
when "101" => font_bit <= font_data(2);
when "110" => font_bit <= font_data(1);
when "111" => font_bit <= font_data(0);
when others => font_bit <= font_data(0);
end case;
end if;



end process;

正如你所看到的,我已经做到这样,在进程中的信号分配是由if语句提供的信号分配所提供的之前需要一个时钟周期延迟,但我似乎无法创建一个可合成的尽管阅读了上面链接的已回答问题,但仍有2个时钟脉冲延迟

当我评论围绕案例的if语句并取消注释以下代码块

 if (CLK'event and CLK = '1') then
 a_store <= a_store(1 downto 0) & a;
 a_out <= a_store(1 downto 0);
 end if;

这是从这个问题开头给出的链接中得到的,我得到以下错误:

[Synth 8-690]赋值宽度不匹配; target有2位,source有3位[“U:/ Computer organization lab / vga / vga_prac.vhd”:304]

此错误消息中引用的目标是a_store向量,源是a_store和a的连接。

这是在我将逻辑1分配给a并将a_store和a_out创建为具有2个元素的std_logic_vectors之后(因为我希望延迟两个时钟周期)。我认为我得到这个错误的原因是因为即使在阅读了这个问题几个小时后,我仍然无法理解它实际上应该如何产生2个时钟周期的延迟。

我一开始认为可能是1位通过a_store向量迭代,直到MSB为1,然后将此向量应用于a_out,但是看到它在if语句中的所有内容我无法看到这两行代码如何甚至不止一次执行。如果这甚至是真的,我将不得不进行一些测试以确保a_out在其MSB中具有1。

通常我会继续前进,但经过广泛搜索后,我找不到比这更简单的解决方案,尽管事实上我并不完全理解它应该如何工作。

如果有人可以澄清这一点或建议修改我的程序,这将产生所需的延迟,这将是很好的。

提前致谢,

西蒙。

1 个答案:

答案 0 :(得分:2)

首先,第一个代码效率不高,可以简化为

use ieee.numeric_std.all;
[...]

process(CLK)
begin
    if rising_edge(CLK) then
        font_bit <= font_data(7 - to_integer(unsigned(vga_hcount(2 downto 0))));
    end if;
end process;

对于第二部分,错误说明了一切。你说a_store有2位(或#34;元素&#34;你所说的),那么你可以想象a_store(1 downto 0) & aa_store的两位+ 1位{ {1}} = 3位。您不能将3位分配给2位。那怎么样?分配a的问题相同:2位如何适合1位?

因此:

a_out