Binary VHDL计数器返回';X';,未知值

Binary VHDL计数器返回';X';,未知值,binary,vhdl,counter,vlsi,digital-design,Binary,Vhdl,Counter,Vlsi,Digital Design,我试图用实例化的组件创建一个4位计数器,如下所示。当我进行模拟时,输出在0和X(未知信号)之间切换。我不确定出了什么问题。 模拟、电路图和代码如下所示 4位模计数器 位片 library ieee; use ieee.std_logic_1164.all; use IEEE.std_logic_unsigned.all; use ieee.numeric_std.all; use IEEE.std_logic_unsigned.all; --==

我试图用实例化的组件创建一个4位计数器,如下所示。当我进行模拟时,输出在0和X(未知信号)之间切换。我不确定出了什么问题。 模拟、电路图和代码如下所示

4位模计数器

位片

    library ieee;
    use ieee.std_logic_1164.all;
    use IEEE.std_logic_unsigned.all;
    use ieee.numeric_std.all;
    use IEEE.std_logic_unsigned.all;
    --======================================================================
    entity counter_BitSlice is
      port (
        CLK    : in  std_logic;
        En     : in  std_logic;
        reset  : in  std_logic;

    OUTPUT   : out std_logic;
    AND_En  : out std_logic
    );
end counter_BitSlice;
--====================================================================
architecture struc of counter_BitSlice is
    signal XOr_En   : std_logic;
    signal En_In    : std_logic;
    signal Result   : std_logic;

begin

counter : process(CLK,XOr_En,reset,Result)
begin

If reset='1' then
XOr_En <='0';
OUTPUT <='0';
AND_En <='0';
Result <='0';
elsif rising_edge(CLK) then
    Result <= XOr_En;
end if;

XOr_En <= En_In XOR Result;
AND_En <= En_In AND Result;
OUTPUT <= Result;

En_In <= En;

end process counter;
end struc;
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use IEEE.std_logic_unsigned.all;

entity tb_counter_BlitSlice is
end tb_counter_BlitSlice;

architecture tb_behav of tb_counter_BlitSlice is

  component counter_BlitSlice
    port(
      CLK                 : in  std_logic;
      En                 : in  std_logic;
      reset         : in std_logic;
      OUTPUT  : out std_logic;
      AND_En : out std_logic
      );
    end component;

  constant t_BitLength : natural :=8;
  signal t_En :std_logic := '0';
  signal t_CLK : std_logic :='0';
  signal t_reset : std_logic :='0';
  signal t_OUTPUT : std_logic :='0';
  signal t_AND_En  : std_logic :='0';

  begin

    U1: counter_BlitSlice
      port map ( 
        CLK => t_CLK,
        reset => t_reset,
        En => t_En,
        OUTPUT => t_OUTPUT,
        AND_En => t_AND_En
        );


    t_CLK <= not t_CLK after 20 ns;
    test : process
    begin
      t_En <= '0';
      t_reset <='0';
      wait for 20 ns;
      t_reset <='1';
      wait for 20 ns;
      t_reset <='0';
      wait for 20 ns;
      t_En <= '0';
      wait for 40 ns;
      t_En <= '1';
      wait for 20 ns;
      wait;
      end process test;
    end architecture tb_behav;
ieee库;
使用ieee.std_logic_1164.all;
使用IEEE.std_logic_unsigned.all;
使用ieee.numeric_std.all;
使用IEEE.std_logic_unsigned.all;
--======================================================================
实体计数器\u位片为
港口(
CLK:标准逻辑中;
En:标准逻辑;
复位:在标准逻辑中;
输出:输出标准逻辑;
和_En:out std_逻辑
);
结束计数器\u位片;
--====================================================================
计数器位片的结构结构是
信号异或:标准逻辑;
信号输入:标准逻辑;
信号结果:std_逻辑;
开始
计数器:进程(时钟、异或、复位、结果)
开始
如果reset='1',则
异或和进位(1),
输出=>输出进位(1)
);
CCHV_3:计数器_位片
港口地图(
时钟=>CLK,
重置=>重置,
En=>和_En_进位(1),
和_En=>和_En_进位(2),
输出=>输出进位(2)
);
CCHV_4:计数器_位片
港口地图(
时钟=>CLK,
重置=>重置,
En=>和_En_进位(2),
和_En=>和_En_进位(3),
输出=>输出进位(3)
);
--最终生成CCHV\u发电机;
输出t_重置,
En=>t_En,
输出=>t_输出,
和_En=>t_和_En
);
时钟输出,
A_进位=>t_进位
);

t_CLK我在修改slice_计数器代码后使其工作

counter : process(CLK,reset)
begin

If reset='1' then
    OUTPUT <='0';
    Result <='0';
elsif rising_edge(CLK) then
    OUTPUT <= XOr_En;
   Result <= XOr_En;
end if;

end process counter;

XOr_En <= En XOR Result;
AND_En <= En AND Result;

end struc;
计数器:进程(时钟、复位)
开始
如果reset='1',则

输出我在修改slice\u计数器代码后使其工作

counter : process(CLK,reset)
begin

If reset='1' then
    OUTPUT <='0';
    Result <='0';
elsif rising_edge(CLK) then
    OUTPUT <= XOr_En;
   Result <= XOr_En;
end if;

end process counter;

XOr_En <= En XOR Result;
AND_En <= En AND Result;

end struc;
计数器:进程(时钟、复位)
开始
如果reset='1',则

在计数器代码中输出,是否可以尝试删除此部分:如果reset='1',则和_En_carry'0');输出_进位“0”);如果结束;它看起来像是一个多源。这消除了未知的数字!但是,它没有正确计数。见上图。谢谢你的帮助;DR.Multple分配/驱动程序错误。切换到
std_ulogic
types,这样你就可以看到你在哪里出错了。在计数器代码中,你能试着删除这个部分吗:如果reset='1',那么和_En_carry'0');输出_进位“0”);如果结束;它看起来像是一个多源。这消除了未知的数字!但是,它没有正确计数。见上图。谢谢你的帮助;DR.Multple分配/驱动程序错误。切换到
std_ulogic
类型,这样您就可以看到错误发生的地方。如果能够准确地解释原始代码的错误以及建议的更改产生差异的原因,那么这个答案将得到很大的改进。您忽略了删除计数器位片(输出)和计数器中原理图中不需要的寄存器(删除主进程、寄存器和_En_进位和输出_进位),这将为您提供帮助。如果能够准确解释原始代码的错误以及建议的更改产生差异的原因,则此答案将得到显著改进。您忽略了删除计数器位片(输出)和计数器位片(输出)中原理图中不需要的寄存器(移除进程主、寄存器和进位以及输出进位),这将为您提供。
counter : process(CLK,reset)
begin

If reset='1' then
    OUTPUT <='0';
    Result <='0';
elsif rising_edge(CLK) then
    OUTPUT <= XOr_En;
   Result <= XOr_En;
end if;

end process counter;

XOr_En <= En XOR Result;
AND_En <= En AND Result;

end struc;