我的输入在VHDL中一直被忽略

时间:2014-09-29 12:09:30

标签: vhdl compiler-warnings

我是VHDL的新手,我想为编码器信号编程一个简单的计数器,每100个周期计数(duh)到1000。我使用莱迪思ispMACH 4000ZE Pico DevKit和软件ispLEVER Classic Project Navigator进行编程。

我的代码是:

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
use IEEE.std_logic_unsigned.all;

entity Counter_10B is 
    port (
       reset        : in  std_ulogic := '0';
       updown       : in  std_ulogic := '0';
       clk          : in  std_ulogic := '0';
       cnt_out      : out std_ulogic_vector(9 downto 0) := (others => '0')

     ); 
 end Counter_10B;

 architecture behavior of Counter_10B is

signal int_cnt : unsigned(9 downto 0)  := (others => '0');

begin              


Counter : process(clk, updown, reset)

variable temp1 : unsigned(4 downto 0) := (others => '0'); 
variable temp2 : unsigned(9 downto 0) := (others => '0'); 

begin
    if (reset = '0') then
        temp2 := (others => '0');
    end if;

    if ((clk'event AND clk='1')) then

        temp1 := temp1 + 1; 

        if(temp1 >= 100) then
            if(updown = '0') then

                if(temp2 >= 1000) then
                    temp2 := (others => '0');
                end if;

                temp2 := temp2 + 1;

            elsif(updown = '1') then

                if(temp2 = 0) then
                    temp2 := (others => '1');
                end if;

                temp2 := temp2 - 1;
            end if ;

            temp1 := 0;
        end if;

        int_cnt <= temp2;

    end if;

end process;
        cnt_out <= std_ulogic_vector(int_cnt);
end behavior;

我的问题是,每次编译时,我都没有任何编译错误,但有很多警告,例如:

  

对Counter.temp2(0)的所有可达分配赋值为'0';通过优化删除寄存器

  

修剪int_cnt(9 downto 0)的寄存器位9到1

但我最大的问题是:

  

输入clk / reset / updown未使用

我真的需要最后警告的帮助,我不明白为什么我有这个错误。它没有任何意义,不是吗?

谢谢!

编辑30.09

Counter : process(clk, updown, reset)

variable temp1 : natural range 0 to 100 := 0; 

begin
    if (reset = '0') then
        int_cnt <= (others => '0');

    elsif ((clk'event AND clk='1')) then

        temp1 := temp1 + 1; 

        if(temp1 >= 100) then
            if(updown = '0') then

                if(int_cnt >= 1000) then
                    int_cnt <= (others => '0');
                end if;

                int_cnt <= int_cnt + 1;

            elsif(updown = '1') then

                if(int_cnt = 0) then
                    int_cnt <= 1000;
                end if;

                int_cnt <= int_cnt - 1;
            end if ;

            temp1 := 0;
        end if;

    end if;

end process;

cnt_out <= std_ulogic_vector(int_cnt);

2 个答案:

答案 0 :(得分:3)

更好地使用数据类型! VHDL有一个不错的类型系统:不要忽视它!

而不是

variable temp1 : unsigned(4 downto 0) := (others => '0');

variable temp1 : natural range 0 to 31 := 0;

更简单,更清洁,同样得到大多数综合工具的支持。

当你写下

if(temp1 >= 100) then

你可能会抓住你的头并在问题发生之前解决问题......

(应该清楚为什么不使用updown;很遗憾,工具不是非常具体的WHICH信号未被使用。)

只有当你的synth工具限制太强而无法支持这一点时才会妥协,并且只有足够的妥协才能满足有缺陷的工具,并且还会向供应商报告工具缺陷,以便他们能够修复它!

答案 1 :(得分:0)

您的流程不是以通常对合成有效的样式编写的。你需要一个&#34; else&#34;,而不是两个单独的if块:

if (reset = '0') then
  temp2 := (others => '0');
elsif (clk'event AND clk='1') then
  ...

你所写的内容可能在模拟中起作用,但是模拟工具通常按字面意思执行一个过程,如编写的那样,综合工具推断出物理逻辑元素,并且更加挑剔风格。

如果综合工具优化temp2,则整个过程变得无关紧要,因此输入将不会被使用(因为它们不再连接到任何东西)。