两个STD_LOGIC_VECTORS的按位ANDING

时间:2012-06-14 05:35:43

标签: controller vhdl vga

嘿,我想知道在VHDL中是否完全可以将两个STD_LOGIC_VECTORS放在一起。例如,我正在编写一个将字符输出到VGA监视器的VHDL程序。我有一个向量PixelRow: IN STD_LOGIC_VECTOR(9 DOWNTO 0)PixelColumn: IN STD_LOGIC_VECTOR(9 DOWNTO 0)。我要做的是有一个STD_LOGIC输出,它取两个像素向量,并用另一个向量与它们对比,例如。

    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)));

更大的代码块在屏幕周围绘制一个框。我希望有更简单的方法来做到这一点。有人知道如何简化这段代码吗?

由于

3 个答案:

答案 0 :(得分:4)

我不清楚你需要什么和/或什么,你需要减少到一个位。

当然有andor位向量向量运算符,它们返回相同大小的向量。

如果您需要测试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来执行此操作。

答案 1 :(得分:3)

如果您只想在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;

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)));

然后这很容易。

看一下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'

将列添加到等式中和/或同步执行操作留给读者练习。

答案 2 :(得分:0)

在我看来,您真正想要做的是将PixelRowPixelCol与一些数值进行比较?

使它成为unsigned向量并执行类似的操作(我编写了数字100和200 - 您可能最好为它们定义整数常量以使代码自我记录):

output <= '1' when pixelRow = 0 or pixelCol = 0 or pixelRow = 100 or pixelCol = 200
          else '0';

让合成器找出逻辑。