VHDL计数器问题及其仿真



我做了一个计数器,就像我通常在VHDL(Modelsim)上做的那样,当我用测试台模拟我的代码时,所有计数器都根本不工作。它们停留在0。这是计数器的代码:

process(CLK)
begin
if (CLK'event AND CLK='1') then
if (RST='1') then
cont_presc_spi_clk <=  "0000000000000";
elsif (RST='0') then
if presc_spi_cs = '1' then
cont_presc_spi_clk <= cont_presc_spi_clk;
elsif presc_spi_cs = '0' then
if (cont_presc_spi_clk = "1001110000111") then 
cont_presc_spi_clk <= "0000000000000";
else
cont_presc_spi_clk <= cont_presc_spi_clk + "0000000000001";
end if;
end if;
end if;
end if;
end process;
Q_spi_clk <= cont_presc_spi_clk;
presc_spi_clk <= Not presc_spi_clk when (cont_presc_spi_clk = "1001110000111"); 

这是程序给出的警告:警告:算术操作数中有一个"U"|"X"|"W"|"Z"|"-",结果将是"X"。

我已经阅读了多个关于警告消息的网页,但他们所说的关于它的所有内容在我的代码中都很好。我已经在我的测试台上初始化了所有的信号。我的代码有问题吗?或者这是modelsim中的常见警告,代码可能在fpga上工作?

presc_spi_clk <= Not presc_spi_clk when (cont_presc_spi_clk = "1001110000111"); 

这是一个顺序语句,您将它放在并发上下文中。这将产生一个问题,只要cont_presc_spi_clk = "1001110000111"presc_spi_clk就会明显地切换。

您希望在时钟部分(在if (CLK'event AND CLK='1')主体中)中包含这样的语句。

(类似

process(CLK)
begin
if rising_edge(CLK) then
if RST = '1' then
cont_presc_spi_clk <=  "0000000000000";
elsif presc_spi_cs = '0' then
if (cont_presc_spi_clk = "1001110000111") then 
cont_presc_spi_clk <= "0000000000000";
presc_spi_clk <= not presc_spi_clk;
else
cont_presc_spi_clk <= cont_presc_spi_clk + "0000000000001";
end if;
end if;
end if;
end process;

实际上,我看不出"算术操作数中存在"U"|"X"|"W"|"Z"|"-",结果将为"X">,所以这是你没有显示的代码。也许您没有在声明中将"0000000000000"分配给cont_presc_spi_clk?与presc_spi_clk相同?

p.s.我只想用integer代替cont_presc_spi_clk。然后倒计时到零。

最新更新