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