gpt4 book ai didi

VHDL:如何在进程中使用 CLK 和 RESET

转载 作者:行者123 更新时间:2023-12-04 17:25:51 27 4
gpt4 key购买 nike

我已经为 spartan 3E 板的 VGA Controller 编写了 VHDL 代码。该代码在没有下面代码中的 reset 和 clk 过程的情况下模拟并运行良好。但是在插入 process(reset,clk) 之后,h_count 和 v_count 计数器停止计数并被驱动到模拟中未定义的 XXXXX。我哪里错了。该代码在没有 clk、reset 过程(以粗体注释的过程)的情况下完美运行,我也在硬件上测试了该代码。

VGA Controller 代码

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity vga_controller is
port(clk : inout std_logic;
clk_50 : in std_logic;
hsync, vsync : out std_logic;
video_on : out std_logic;
x_pos, y_pos : out std_logic_vector(9 downto 0);
sw : in std_logic_vector(2 downto 0) := "100";
rgb : out std_logic_vector(2 downto 0)
);

end vga_controller;

architecture Behavioral of vga_controller is
signal h_count, v_count : unsigned(9 downto 0) := (others => '0');

begin
-- Frequency divider to get 25 MHz clk from 50 MHz clock of Spartan 3E **
freq_dividr : entity work.t_ff port map(clk_50, clk);
-- If i remove this process everyting works fine. Why ????**
process(clk, reset)
begin
if reset = '1' then
h_count <= (others => '0');
v_count <= (others => '0');
video_on <= '0';
elsif clk'event and clk = '1' then
h_count <= h_count;
v_count <= v_count;
end if;
end process;

process(clk) -- Process for horizontal counter
begin
if clk'event and clk = '1' then
if h_count = 799 then
h_count <= (others => '0');
else
h_count <= h_count + 1;
end if;
end if;
end process;

process(clk) -- Process for vertical counter
begin
if clk'event and clk = '1' and h_count = 799 then
if v_count = 524 and h_count = 799 then
v_count <= (others => '0');
else
v_count <= v_count + 1;
end if;
end if;
end process;

hsync <= '0' when (h_count >= 656 and h_count <= 751) else '1';
vsync <= '0' when (v_count >= 490 and v_count <= 491) else '1';
video_on <= '1' when (h_count <= 649 and v_count <= 479) else '0';
rgb <= sw when (h_count <= 649 and v_count <= 479) else "000";

x_pos <= std_logic_vector(h_count);
y_pos <= std_logic_vector(v_count);

end Behavioral;

最佳答案

你应该只从一个进程驱动一个信号。只需将您的重置功能放入计数器进程中,它应该可以工作。例如:

process(clk) -- Process for horizontal counter
begin
if(rising_edge(clk)) then
if(rst = '1') then
h_count <= 0;
else
if h_count = 799 then
h_count <= (others => '0');
else
h_count <= h_count + 1;
end if;
end if;
end if;
end process;

其他一些注意事项:

如您所见,我在上面的代码片段中使用了同步重置。除非您绝对需要异步重置,否则请改用同步重置。它有助于合成器,因为有一些特殊结构不能使用异步复位,并且有助于防止设计变大时出现问题(由于信号偏斜,触发器在不同时间突然开始复位)。

此外,不要在时钟进程的初始 if 语句中检查边缘(或重置)以外的任何内容。对于您的垂直计数器,您可以检查 h_count = 799。请改为执行以下操作:
process(clk)
begin
if(rising_edge(clk)) then
if(h_count = 799) then
(...)

它更清晰,而且不容易出错。

最后,我更改了 clk'event and clk=1更现代的做法, rising_edge(clk) .它应该没有太大区别(除非在模拟中的某些情况下),但是 rising_edge内置了一些额外的检查,以确保您确实拥有优势。

关于VHDL:如何在进程中使用 CLK 和 RESET,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9989913/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com