VHDL。本设计中有2个无负载信号

时间:2016-11-30 10:38:03

标签: warnings vhdl

我刚刚启动VHDL编码,我使用XILINX Artix-7 / NEXYS 4进行练习。 我只想设计七段显示,然后将数字从0到9重新分配。 我的英语不是很好,请原谅我,我试着表达我的问题。

在我的代码中,我将架构分为四个步骤。 首先,我将clk(100MHZ)降至1hz。其次,我使用计数器来计算从0到9的数字然后使用双重dabble算法分开数字。最后,我写了一个BCD到7段解码器并选择第一个阳极。

问题是当我实现电路时会出现警告,即使合成很好(但RTL显示信号显然没有连接)。 问题似乎在双重算法和计数器之间? (因为添加此代码后出错了) 我真的想知道我怎么能解决这个问题?什么时候出现这个警告?也许我的代码有大错?

  

警告:参数:288 - 信号clk_IBUF无负载。 PAR不会尝试路由此信号。

     

完成初始时序分析。警告:参数:288 - 信号btnD_IBUF无负载。 PAR不会尝试路由此信号。

     

警告:参数:283 - 此设计中有2个无负载信号。这种设计将导致Bitgen发出DRC警告。

顺便说一下,我知道有很多方法可以实现我的目标,但我真的想知道这有什么不妥。 如果有人可以帮助我,感谢很多。

这是我的代码:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
USE ieee.std_logic_unsigned.all;
use IEEE.numeric_std.all;


-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--use IEEE.NUMERIC_STD.ALL;

-- Uncomment the following library declaration if instantiating
-- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity top is
    Port ( clk : in  STD_LOGIC;
           btnD : in  STD_LOGIC;
           an : out  STD_LOGIC_VECTOR (7 downto 0);
           seg : out  STD_LOGIC_VECTOR (6 downto 0));
end top;

architecture Behavioral of top is

signal clk_1hz_s : STD_LOGIC := '1';
signal clk_1hz : STD_LOGIC;
signal counter_clock : integer range 0 to 5000000 := 0;
signal sec_turth : STD_LOGIC_VECTOR (7 downto 0);
signal sec_1 : STD_LOGIC_VECTOR (3 downto 0);

begin

--new clk--
process(clk,btnD)
begin

    if (clk' event and clk='1') then
        if (btnD = '1') then
            counter_clock <= 0;
            clk_1hz_s <= '1';
        elsif (counter_clock = 5000000 - 1 ) then
            counter_clock <= 0;
            clk_1hz_s <= NOT(clk_1hz_s);
        else 
            counter_clock <= counter_clock + 1;
        end if;
    end if;

end process;
clk_1hz <= clk_1hz_s;

--counter--

process(clk_1hz)

variable sec :integer range 0 to 9 :=0;

begin

    if (clk_1hz' event and clk_1hz='1') then
        if sec > 8 then
            sec := 0;
        else
            sec := sec + 1;
        end if;
    end if;

sec_turth <= STD_LOGIC_VECTOR(to_unsigned(sec,8)(7 downto 0));
end process;

--double dabble algorithm--

process(sec_turth)

variable temp_sec : STD_LOGIC_VECTOR (7 downto 0);
variable bcd_sec : unsigned (7 downto 0):= (others => '0');

begin

temp_sec := sec_turth;
bcd_sec := (others => '0');

    for i in 0 to 7 loop

    if bcd_sec(3 downto 0) > 4 then
        bcd_sec(3 downto 0) := bcd_sec(3 downto 0) + 3;
    end if;

--  if bcd_sec(7 downto 4) > 4 then
--      bcd_sec(7 downto 4) := bcd_sec(7 downto 4) + 3;
--  end if;

    bcd_sec := bcd_sec(7 downto 1) & temp_sec(7);
    temp_sec := temp_sec(7 downto 1) & '0';

    end loop;

sec_1 <= STD_LOGIC_VECTOR(bcd_sec(3 downto 0));
--sec_2 <= STD_LOGIC_VECTOR(bcd_sec(7 downto 4));

end process;

--decoder--

with sec_1  select
    seg <= "1000000" when "0000",--0
             "1111001" when "0001",--1
             "0100100" when "0010",--2
             "0110000" when "0011",--3
             "0011001" when "0100",--4
             "0010010" when "0101",--5
             "0000010" when "0110",--6
             "1011000" when "0111",--7
             "0000000" when "1000",--8
             "0011000" when "1001",--9
             "0001110" when "1111",--F
             "1111111" when others;--close all

an <= "11111110";--choose the first anode

end Behavioral;

1 个答案:

答案 0 :(得分:0)

警告意味着在您的代码中,两个输入都不会影响任何输出,因此不值得连接到任何内部组件。

请更熟悉变量的概念。特别是对于sec - 计数器进程,您应该知道您不能假设变量在两个进程运行之间保存其值,即clk_1hz上的每个上升沿重置变量{{1} }。最好将其声明为与sec一样的信号。那么你当然也需要在柜台过程中重置一个例程:

counter_clock

对于介于0和9之间的单位数字,您的双重涉及算法及其所有变量是不必要的,因为这些值已经存在于BCD中。如果我删除了该过程,只需将-- In the architecture header: signal current_value: integer range 0 to 9; -- one-digit counter -- process(clk_1hz) begin if (clk_1hz'event and clk_1hz='1') then if (btnD = '1') then current_value <= 0; elsif current_value > 8 then current_value <= 0; else current_value <= current_value + 1; end if; end if; end process; -- I assume, you really need 8 bits here: sec_turth <= STD_LOGIC_VECTOR(to_unsigned(current_value,8)); 的低4位连接到sec_turth,警告就会消失,我可以查看原理图:

sec_1

其他一些问题:

您的时钟分频器进程被定义为对sec_1 <= sec_turth(3 downto 0); clk输入敏感。这通常是异步重置行为的情况,该行为未在进程内实现。如果您想要异步重置,请执行以下操作:

btnD

如果那应该是时钟同步复位,请像我在第一个代码清单中那样从敏感度列表中删除clk_div: process(clk,btnD) begin if btnD = '1' then -- do the reset counter_clock <= 0; clk_1hz_s <= '1'; elsif clk'event and clk = '1' then -- do the synchronous operations if (counter_clock = 5000000 - 1 ) then counter_clock <= 0; clk_1hz_s <= NOT(clk_1hz_s); else counter_clock <= counter_clock + 1; end if; end if; end process clk_div;

另外,我已经看到在btnD属性中勾选'之后有一个空格,至少使得代码突出显示的方式与没有空格的方式不同。纠正这一点,你可能会摆脱与clk'event相关的警告。 编辑:不,如果删除了变量,则空格无关紧要。

希望我能提供帮助,如果我能改进答案,请告诉我!