Eri*_*end 3 controller vhdl vga
嘿,我想知道在 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");
Run Code Online (Sandbox Code Playgroud)
我希望这段代码可用于简化以下代码:
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)));
Run Code Online (Sandbox Code Playgroud)
较大的代码块在屏幕周围绘制一个框。我希望有一种更简单的方法来做到这一点。有人知道如何简化此代码吗?
谢谢
我不清楚您需要和/或什么,以及您需要将什么减少到一点。
当然有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;
Run Code Online (Sandbox Code Playgroud)
如果您需要经常这样做,那么您可以定义 afunction而不是 aprocess来执行此操作。
如果您只想在 VHDL 中按位 AND 两个 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;
Run Code Online (Sandbox Code Playgroud)
Google 可以帮助您解决其余的按位运算符(它们非常直观,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)));
Run Code Online (Sandbox Code Playgroud)
那么就非常容易了。
查看 AND 运算符真值表,您会发现唯一的情况是:
output <= PixelRow(0) AND PixelRow(1) AND
... AND PixelRow(8) AND PixelRow(9)
Run Code Online (Sandbox Code Playgroud)
减少到 '1' 是 PixelRow = "1111111111";
因此,异步地,代码可以替换为:
output <= '1' when (PixelRow = "1111111111") else '0'
Run Code Online (Sandbox Code Playgroud)
同时列和行:
output <= '1' when (PixelRow = "1111111111") OR
(PixelColumn = "1111111111") else
'0';
Run Code Online (Sandbox Code Playgroud)
上面提到的原则可以扩展到原帖中提到的其他操作,例如:
other_value <= "0111011111";
output <= '1' when ((PixelRow AND (NOT(other_value))) = "111111111") else '0'
Run Code Online (Sandbox Code Playgroud)
将列添加到等式中和/或同步执行操作留给读者作为练习。