我做了一个计数器,就像我通常在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
。然后倒计时到零。