嘿,我想知道在 VHDL 中是否有可能将两个STD_LOGIC_VECTORS
放在一起。例如,我正在编写一个 VHDL 程序,该程序将字符输出到 VGA 监视器。我有一个矢量PixelRow: IN STD_LOGIC_VECTOR(9 DOWNTO 0)
和PixelColumn: IN STD_LOGIC_VECTOR(9 DOWNTO 0)
.我正在尝试做的是有一个STD_LOGIC
输出,它采用两个像素向量并用另一个向量 AND 将它们与另一个向量(例如)。
Output <= (PixelRow AND NOT "0000000000") OR (PixelColumn AND NOT "0000000000") OR
(PixelRow AND NOT "0111011111") OR (PixelColumn AND NOT "1001111111");
我希望这段代码可以用来简化以下代码:
Output <= ((NOT PixelRow(0) AND NOT PixelRow(1) AND NOT PixelRow(2) AND NOT
PixelRow(3) AND NOT PixelRow(4) AND NOT PixelRow(5) AND NOT PixelRow(6)
AND NOT PixelRow(7) AND NOT PixelRow(8) AND NOT PixelRow(9)))
OR ((NOT PixelRow(0) AND PixelRow(1) AND PixelRow(2) AND PixelRow(3) AND
NOT PixelRow(4) AND PixelRow(5) AND PixelRow(6) AND PixelRow(7) AND
PixelRow(8) AND PixelRow(9)))
OR ((NOT PixelColumn(0) AND NOT PixelColumn(1) AND NOT PixelColumn(2) AND
NOT PixelColumn(3) AND NOT PixelColumn(4) AND NOT PixelColumn(5) AND NOT
PixelColumn(6) AND NOT PixelColumn(7) AND NOT PixelColumn(8) AND NOT
PixelColumn(9)))
OR ((PixelColumn(0) AND NOT PixelColumn(1) AND NOT PixelColumn(2) AND
PixelColumn(3) AND PixelColumn(4) AND PixelColumn(5) AND PixelColumn(6)
AND PixelColumn(7) AND PixelColumn(8) AND PixelColumn(9)));
较大的代码块在屏幕周围绘制一个框。我希望有一种更简单的方法可以做到这一点。有人知道如何简化这段代码吗?
谢谢
我不清楚你需要什么和/或,以及你需要减少到一点。
当然,有and
和or
位向量运算符返回相同大小的向量。
如果你需要测试PixelRow
和"0000000000"
之间的相等/不等式,那么你可以写:PixelRow /= "0000000000"
或PixelRow = "0000000000"
。
如果您需要将向量vect : std_logic_vector(7 downto 0)
简化为单个比特bit : std_logic
,最简单的方法可能是使用过程:
process (vect) is
variable tmp : std_logic;
begin
tmp := '1';
for I in 7 downto 0 loop
tmp := tmp and vect(I);
end loop;
bit <= tmp;
end process;
如果您需要经常执行此操作,则可以定义一个function
而不是一个process
来执行此操作。
如果您只想在 VHDL 中按位和两个std_logic_vectors,它将按如下所示:
signal a : std_logic_vector(15 downto 0);
signal b : std_logic_vector(15 downto 0);
signal x : std_logic_vector(15 downto 0);
x <= a AND b;
谷歌可以帮助你解决其余的按位运算符(它们非常直观,AND,NAND,OR,NOR,NOT,等等)
如果您想减少这种情况:
Output <= ((NOT PixelRow(0) AND NOT PixelRow(1) AND NOT PixelRow(2) AND NOT
...
AND PixelColumn(7) AND PixelColumn(8) AND PixelColumn(9)));
那么这很容易。
查看 AND 运算符真值表,您会发现唯一的情况是:
output <= PixelRow(0) AND PixelRow(1) AND
... AND PixelRow(8) AND PixelRow(9)
简化为"1"是 PixelRow = "1111111111";
因此,异步地,代码可以替换为:
output <= '1' when (PixelRow = "1111111111") else '0'
同时列和行:
output <= '1' when (PixelRow = "1111111111") OR
(PixelColumn = "1111111111") else
'0';
上述原则可以扩展到原帖中提到的其他操作,例如:
other_value <= "0111011111";
output <= '1' when ((PixelRow AND (NOT(other_value))) = "111111111") else '0'
将列添加到公式中和/或同步执行操作留给读者作为练习。
,您实际上想做的是将PixelRow
和PixelCol
与一些数值进行比较?
让它成为一个unsigned
向量并做类似的事情(我组成了数字 100 和 200 - 你可能最好为它们定义整数常量,以使你的代码自我记录):
output <= '1' when pixelRow = 0 or pixelCol = 0 or pixelRow = 100 or pixelCol = 200
else '0';
让合成器弄清楚逻辑。