【发布时间】:2012-12-14 02:11:39
【问题描述】:
我在使用移位器模块时遇到了一些问题,该模块将移位由字节组成的数组的索引。
shifter.vhd:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use work.mypackage2.all; -- contains the type reg array
entity shifter is
generic ( REGSIZE : integer := 8);
port(clk : in std_logic;
Scan_Dav : in std_logic;
Data_in : in std_logic_vector(7 downto 0);
Data_out : out reg_array );
end shifter;
architecture bhv of shifter is
signal shift_reg : reg_array;
begin
process (clk) begin
if rising_edge(clk) then
if Scan_Dav = '1' then
shift_reg <= shift_reg(shift_reg'high-1 downto 0) & Data_in;
end if;
end if;
end process;
Data_out <= shift_reg;
end bhv;
这是一个移位器,它将保存来自键盘的扫描码,输出数组将用于在七段显示器上滚动文本。我的包包含用于定义移位器输出的类型声明:
mypackage2.vhd:
-- Package File Template
--
-- Purpose: This package defines supplemental types, subtypes,
-- constants, and functions
library IEEE;
use IEEE.STD_LOGIC_1164.all;
package mypackage2 is
subtype reg is std_logic_vector(7 downto 0); -- a byte
type reg_array is array (7 downto 0) of reg; -- array of bytes
end mypackage2;
package body mypackage2 is
end mypackage2;
不过我遇到了问题。此代码的 RTL 示意图如下所示:
我很困惑为什么会发生这种情况,有人可以帮我解决这个问题吗?
【问题讨论】:
-
您使用什么工具来生成和查看 RTL 原理图?根据我的经验,查看 RTL 原理图很少有用,而且——也许是因为它们很少使用——它们往往是错误的。我会更加关注您的 VHDL 代码在模拟中的作用。编写一个测试台并模拟它...
-
对我来说看起来完全没问题,除了丢失的时钟,这可能是您的原理图工具的一个功能。 VHDL 代码看起来也不错。你到底对什么感到困惑?
-
问题正是那个BennyBarns,原理图和代码不一致。应该有 3 个输入和 1 个输出,它们的名称应该与我在代码中分配的名称相同,并且逻辑向量的宽度应该在原理图中可见。我正在使用 Xilinx ISE @Brian。例如,当我将此设备放在顶部模块中时,它的行为不正常:(i.imgur.com/QoOPQ.jpg?1) 看看其他组件是如何正确绘制的。
-
尝试一个实验:用“my_shifter”替换您设计中所有出现的名称“shifter”。查看“my_shifter”是否出现在 RTL 视图中(您可能需要执行一些“清理项目”步骤来实现这一点)。这至少会消除 Xilinx ISE 具有相同名称和不同引脚名称的某些固有部分的可能性......
-
我尝试了您的建议,但正如我所料,这不是问题所在。但是,我扩展了您提出的测试,并更改了模块输出以查看算法是否正常。这个问题似乎与我用来定义 reg 数组的包有关,或者换句话说,编译器很难解释“字节数组”。除了定义这种用作输出的类型之外,还有其他选择吗?
标签: arrays scroll byte vhdl shift