【问题标题】:fpga can't get simple register outputfpga 无法获得简单的寄存器输出
【发布时间】:2018-06-30 03:03:30
【问题描述】:

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

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;

【问题讨论】:

  • 除了您的问题不清楚之外,如果您是读者,如果您是一个简单的测试台复制波形中显示的输入,他们将得到输出在 30 ns 时从所有“U”变为所有“0”(when the first rising_edge(clk) is recognized ),这表明您要么遇到工具问题,要么没有显示minimal reproducible example 能够重现您的结果。
  • 对不起,我只是不明白为什么我没有得到任何输出。我将“InputBuffer”设置为顶部并尝试运行我添加的测试台。

标签: vhdl fpga lattice


【解决方案1】:

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

对于我们这些无法准确解释您的波形显示的人,彩色版本以及显示移动到波形关键部分的值的光标可能会有所帮助:

在此波形显示中,我们看到标量信号(clk 等)在 Lattice 工具链中显示为“X”,为“X”的红色矩形(上述波形由 gtkwave 和 ghdl 完成)。

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

驱动程序是通过分配给进程中的信号来创建的。

并发信号分配被详细说明为等效过程(IEEE Std 1076-2008 11.6 Concurrent signal assignment statements “并发信号赋值语句代表了一个等效的过程语句,它为信号赋值。”其敏感度列表由 10.2 等待语句确定“该规则还用于为并发过程调用语句 (11.4)、并发断言语句 (11.5) 和并发信号赋值语句构建等效过程语句中的等待语句的敏感度集(11.6)。”。

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

e) 如果 S 是基本信号:

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

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

那么 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 的并发信号分配,您的测试平台可以工作:

【讨论】:

    猜你喜欢
    • 2013-01-09
    • 2010-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-04
    相关资源
    最近更新 更多