【发布时间】:2017-04-09 01:36:49
【问题描述】:
我有 VHDL 代码,我试图将像素值相乘。我有以下实体:
entity xGradient is
port(
clk : in std_logic;
x11, x12, x13, x21, x22, x23, x31, x32, x33 : in integer range 0 to 255;
gradientInX : out integer range 0 to 255
);
end xGradient;
我对这些做了如下操作:
gradientInX <= x11 + 2*x21 + x31 - x13 - 2*x23 - x33;
您可能注意到的问题是,从操作中获得的值超出了我的输出整数的可能值范围。发生这种情况时,我的模拟会崩溃。我不知道我想要做什么的正确词,因此似乎无法弄清楚如何解决这个问题,这让我发疯。我基本上只是想截断或减小输出的大小以确保它适合 gradientInX 输出端口。我尝试使用这样的进程块:
-- declared signals
signal gradientMem: integer;
--beginning of my architecture
begin
SobelOperator : process(gradientMem)
begin
gradientMem <= x11 + 2*x21 + x31 - x13 - 2*x23 - x33;
if (gradientMem > 255) then
gradientMem <= 255;
elsif (gradientMem < 0) then
gradientMem <= 0;
end if;
end process SobelOperator;
然后将 gradientMem 分配给 gradientInX 但由于某种原因它不起作用。任何帮助将不胜感激。注意:我没有包含所有的 VHDL 代码,因为我认为它会不必要地长。我得到的错误消息是操作的信号结果值超出范围(因为结果值为负并且输出的范围仅为 0 到 255)。
马修
【问题讨论】:
-
您的问题遗漏了两个重要部分:1)
gradientMen的声明和 2)错误消息。 VHDL 检查分配的范围界限。你想创建一个饱和算法。所以用更大的范围定义gradientMem。 -
我刚刚对其进行了编辑以包含这些内容。我想我的主要问题是敏感度列表不正确。我还想知道 VHDL 是否具有整数特定操作,可以强制结果进入某个范围,但我想不存在这样的功能或操作,所以我只需要自己实现它。无论哪种方式,我的问题似乎都解决了。感谢您的回复,并随时添加任何其他内容。
标签: vhdl