VHDL-寄存器写入

VHDL-寄存器写入,vhdl,Vhdl,我想使用四个按钮作为输入,三个七段LED显示屏作为输出。两个按钮应在16个闸板位置上下移动;另外两个应该递增和递减当前显示的内存位置的内容。一个七段显示器应显示当前地址(0-F),另外两个应以十六进制(00-FF)显示该位置的内容。这是我尝试这样做的代码(我还没有实现显示): 这显然是因为我已经将每个实体映射到了另一个实体中,但我不知道还有什么其他方法可以实现我想要实现的目标。有人能提出替代方案吗?这是一个猜测,因为你想做什么还不太清楚。似乎问题在于设计:你对最终结果应该做什么有一个很好的想法,

我想使用四个按钮作为输入,三个七段LED显示屏作为输出。两个按钮应在16个闸板位置上下移动;另外两个应该递增和递减当前显示的内存位置的内容。一个七段显示器应显示当前地址(0-F),另外两个应以十六进制(00-FF)显示该位置的内容。这是我尝试这样做的代码(我还没有实现显示):


这显然是因为我已经将每个实体映射到了另一个实体中,但我不知道还有什么其他方法可以实现我想要实现的目标。有人能提出替代方案吗?

这是一个猜测,因为你想做什么还不太清楚。似乎问题在于设计:你对最终结果应该做什么有一个很好的想法,但不清楚如何将其分解为组件,这些组件以最简单的方式交互以实现目标

我的猜测是基于这样一个事实,即“raminfr”中的活动代码存储和加载的数据独立于其他悄悄进入的内容

所以我建议将“raminfr”作为一个内存组件进行清理,而不使用任何其他东西。然后,它可以嵌入到“lab1”组件中,该组件处理键,并存储和显示来自正确寄存器的值。它也可以在任何需要内存的地方重用

让我们看看raminfr

entity raminfr is
    port (
        clk : in std_logic;
        we : in std_logic;
        do : out unsigned(7 downto 0)
    );
end raminfr;
它有一个时钟、一个写启用输入和一个数据输出。但奇怪的是,没有地址或数据输入!现在,内存是一种标准的“设计模式”,偏离它可能是不明智的,所以让我们添加它们

entity raminfr is
    port (
        clk  : in std_logic;
        we   : in std_logic;
        addr : in unsigned(3 downto 0);
        di   : in  unsigned(7 downto 0);
        do   : out unsigned(7 downto 0)
    );
end raminfr;
记忆模式的一些变体具有其他特征;读取启用、输出启用、单独的读取和写入时钟等,但这个简单的时钟在这里就可以了

您还可以使用泛型自定义其大小,修改其数据和地址总线宽度以匹配。这使得它更加有用,并避免了类似但不同模块的激增

让我们清理架构以匹配

architecture rtl of raminfr is
   type ram_type is array (0 to 15) of unsigned(7 downto 0);
   signal RAM    : ram_type;
   signal read_a : unsigned(3 downto 0);
begin
process (clk)
...
end process;
do <= RAM(to_integer(read_a));
end rtl;
以及对lab1的其余部分进行任何支持性更改


这并不是唯一合理的分解:您还可以使“lab1”成为一个没有自身存储的简单组件,并将其他必要的信号作为端口输出。然后,您需要第三个“顶级”实体,其体系结构将lab1和raminfr连接起来。

试着描述一下您想要完成的任务怎么样?在您的示例中,我们将把一个寄存器映射到寄存器计数器,将di映射到值计数器。然而,在我看来,由于a和di是RAM的输入,我们应该做相反的事情,不是吗?我的印象是,映射只有一种方式有效,在这种情况下,如果我错了,请纠正我。为输入错误道歉:我在端口列表中称地址为“addr”,在端口映射中称地址为“a”-现在已修复-这不会帮助您理解。。。端口映射的工作方式与端口是in、out、inout还是buffer(形式=>actual)的工作方式相同。我希望这能澄清问题。因此,如果我们将寄存器计数器映射到寄存器计数器,我们实际上也将寄存器计数器映射到?我们将它们连接在一起。这是让我困惑的部分-我认为这只是单向关系,这就是为什么我将两个实体映射到另一个实体中。
entity raminfr is
    port (
        clk  : in std_logic;
        we   : in std_logic;
        addr : in unsigned(3 downto 0);
        di   : in  unsigned(7 downto 0);
        do   : out unsigned(7 downto 0)
    );
end raminfr;
architecture rtl of raminfr is
   type ram_type is array (0 to 15) of unsigned(7 downto 0);
   signal RAM    : ram_type;
   signal read_a : unsigned(3 downto 0);
begin
process (clk)
...
end process;
do <= RAM(to_integer(read_a));
end rtl;
    U1: entity work.raminfr port map (
        addr => register_counter,   -- was "a", typo
        di   => value_counter,
        do   => value_in_ram,
        clk  => clk,
        we   => we
    );