Vhdl fpga可以';无法获得简单的寄存器输出

Vhdl fpga可以';无法获得简单的寄存器输出,vhdl,fpga,lattice,Vhdl,Fpga,Lattice,我知道这是基本的,但我很难让它发挥作用。我正在“读取”IO引脚,我希望将这些位“保存”在一个简单的缓冲区中。由于某种原因,我在输出中没有得到任何东西。这是我正在运行的代码和lattice的网表分析器,以及我通过运行测试台得到的波形。我试着应用我在其他代码中看到的东西,但没有成功 library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity InputBuffer is generic( n: natural := 4 ); Port (

我知道这是基本的,但我很难让它发挥作用。我正在“读取”IO引脚,我希望将这些位“保存”在一个简单的缓冲区中。由于某种原因,我在输出中没有得到任何东西。这是我正在运行的代码和lattice的网表分析器,以及我通过运行测试台得到的波形。我试着应用我在其他代码中看到的东西,但没有成功

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity InputBuffer is
    generic( n: natural := 4 );
    Port (    
        clk    : in STD_LOGIC;
        CLK65  : IN STD_LOGIC;
        En     : in STD_LOGIC;
        STRT   : OUT STD_LOGIC;
        Ipin   : in  STD_LOGIC_VECTOR (n-1 downto 0);
        Output : out  STD_LOGIC_VECTOR (n-1 downto 0)
        );
end InputBuffer;

architecture Behavioral of InputBuffer is
    signal temp : STD_LOGIC_VECTOR(n-1 downto 0);
    SIGNAL CLK2 : STD_LOGIC;
begin
    -- invert the signal from the push button switch and route it to the LED
    process(clk, En)
    begin
        if( En = '1') then
            temp <= B"0000";
        elsif rising_edge(clk) then
            temp <= Ipin; 
        end if;
    end process;
    Output <=  temp;
    STRT <= CLK65;
end Behavioral;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
实体输入缓冲区为
一般(n:自然:=4);
港口(
clk:标准逻辑中;
CLK65:标准逻辑中;
En:标准逻辑;
STRT:输出标准逻辑;
Ipin:标准逻辑向量(n-1向下至0);
输出:输出标准逻辑向量(n-1到0)
);
终端输入缓冲区;
InputBuffer的行为体系结构是
信号温度:标准逻辑向量(n-1向下至0);
信号CLK2:STD_逻辑;
开始
--反转按钮开关的信号并将其发送至LED
过程(clk,En)
开始
如果(En='1'),则

temp将测试台添加到您的问题中提供了一个解决方案

对于那些无法准确解释波形显示的人,彩色版本以及光标(显示移动到波形关键部分的值)可能有助于:

在这个波形显示中,我们看到标量信号(clk等)显示为“X”,就像在晶格工具链中显示为“X”的红色矩形一样(上面的波形是用gtkwave和ghdl完成的)

时钟在“X”和“0”之间变化,这表明测试台上有两个clk驱动程序,当两个驱动程序都驱动“0”时,“0”显示

驱动程序是通过在一个过程中分配给一个信号而创建的

并行信号分配详细说明为等效过程(IEEE Std 1076-2008 11.6并行信号分配声明 “并发信号分配语句表示为信号分配值的等效过程语句。“其灵敏度列表由10.2 Wait语句确定”此规则还用于为并发过程调用语句(11.4)在等效过程语句中构造等待语句的灵敏度集、并发断言语句(11.5)和并发信号分配语句(11.6)。”

具有多个驱动器的信号值按照14.7.3.2驱动值的规定确定:

e) 如果S是基本信号:


-如果S是一个解析信号,并且有一个或多个源,则检查S源的驱动值。如果这些驱动值中的任何一个是复合的,其中一个或多个子元素值由空事务确定(见10.5.2.2),而一个或多个子元素值不由空事务确定,则为错误。如果S是信号类型寄存器,并且S的所有源都具有由null事务确定的值,则S的驱动值与其以前的值相同。否则,通过执行与S相关联的解析函数来获得S的驱动值,其中该函数使用由S源的驱动值的串联组成的输入参数来调用,但其当前值由null事务确定的任何S源的值除外

其中,类型std_逻辑的解析函数可在IEEE软件包std_逻辑_1164中找到

那么,clk(和clk64)的两个驱动程序在哪里


En除了您的问题不清楚之外,如果您的读者使用一个简单的测试台来复制波形中显示的输入,他们将以30 ns()的速度从所有“U”输出到所有“0”,这表明你要么有工具问题,要么没有显示出复制结果的能力。对不起,我不明白为什么我没有得到任何输出。我将“InputBuffer”设置为top,并尝试运行我添加的测试台。
    En <= '0';
    clk <= '0';
    clk65 <= '0';
    Ipin <= B"0000";
-- *** Test Bench - User Defined Section ***
   tb : PROCESS
   BEGIN  
      wait for delay;
      clk <='1'; 
      clk65 <='1';
      wait for delay;
      clk <='0';


      wait for delay;
      clk <='1';
      clk65 <='0';

      wait for delay;
      clk <='0';
      --wait; -- will wait forever
   END PROCESS;