fpga无法获得简单的寄存器输出

时间:2018-06-30 03:03:31

标签: vhdl fpga lattice

我知道这是基本知识,但是我很难把它付诸实践。我正在从IO引脚“读取”,我想将这些位“保存”在一个简单的缓冲区中。由于某种原因,我在输出中没有得到任何东西。这是我正在运行的代码和点阵式的网表分析器,以及通过运行测试台获得的波形。我尝试应用在其他代码中看到的内容,但是没有用。

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;

这是我正在使用的测试平台。

     -- VHDL Test Bench Created from source file InputBuffer.vhd -- Fri Jun 29 22:45:57 2018

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;

ENTITY testbench IS
END testbench;

ARCHITECTURE behavior OF testbench IS 

    COMPONENT InputBuffer
    PORT(
        clk : IN std_logic;
        CLK65 : IN std_logic;
        En : IN std_logic;
        Ipin : IN std_logic_vector(3 downto 0);          
        STRT : OUT std_logic;
        Output : OUT std_logic_vector(3 downto 0)
        );
    END COMPONENT;

    SIGNAL clk :  std_logic;
    SIGNAL CLK65 :  std_logic;
    SIGNAL En :  std_logic;
    SIGNAL STRT :  std_logic;
    SIGNAL Ipin :  std_logic_vector(3 downto 0);
    SIGNAL Output :  std_logic_vector(3 downto 0);  

    constant delay : time := 10 ns;

BEGIN

-- Please check and add your generic clause manually
    uut: InputBuffer PORT MAP(
        clk => clk,
        CLK65 => CLK65,
        En => En,
        STRT => STRT,
        Ipin => Ipin,
        Output => Output
    );

    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;
-- *** End Test Bench - User Defined Section ***

END;

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:1)

将测试平台添加到您的问题中提供了Minimal, Complete and Verifiable example

对于我们中那些无法准确解释波形显示的人来说,将彩色版本与光标一起显示移至波形关键部分的值可能会有所帮助:

testbench.jpg

在此波形显示中,我们看到标量信号(clk等)在您的莱迪思工具链中显示为``X'',并显示为``X''的红色矩形(上面的波形由gtkwave和ghdl完成)。 / p>

时钟在“ X”和“ 0”之间变化,这告诉我们测试台中有两个clk驱动程序,而当两个驱动程序都驱动“ 0”时显示“ 0”。

通过在过程中分配信号来创建驱动程序。

并发信号分配被细化为等效过程(IEEE Std 1076-2008 11.6并发信号分配语句 “并发信号分配语句表示为信号分配值的等效过程语句。”其敏感度列表由10.2 Wait语句确定“此规则还用于在并发过程调用语句(11.4),并发断言​​语句(11.5)和并发信号分配语句的等效过程语句中构造wait语句的敏感性集。 (11.6)。”。

具有多个驱动器的信号值由14.7.3.2驱动值中确定:

  

e)如果S是基本信号:

     
    

...
    —如果S是一个已分解的信号且具有一个或多个信号源,则将检查S信号源的驱动值。如果这些驱动值中的任何一个是一个组合,其中一个或多个子元素值由空事务确定(请参见10.5.2.2),而一个或多个子元素值不是由空事务确定,则这是错误的。如果S是信号种类寄存器,并且S的所有源都具有由空事务确定的值,则S的驱动值与其先前值保持不变。否则,通过执行与S关联的分辨率函数来获得S的驱动值,其中使用输入参数调用该函数,该输入参数由S来源的驱动值的级联组成,任何来源的值除外的S,其当前值由无效交易确定。

  

在IEEE软件包std_logic_1164中找到了std_logic类型的解析函数。

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

    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;

在进程tb的紧上方,有四个并发的赋值语句。可以将引起多个驱动程序的两个注释(clk和clk64)注释掉,而无需在信号声明中使用初始值,因为您是在过程中强制使用它们的值。

如果我们注释掉clk和clk65的并发信号分配,则您的测试台可以工作:

testbench_fixed.jpg