【问题标题】:Bitwise ANDING Of Two STD_LOGIC_VECTORS两个 STD_LOGIC_VECTORS 的按位与运算
【发布时间】:2012-06-14 05:35:43
【问题描述】:

嘿,我想知道在 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)));

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

谢谢

【问题讨论】:

  • 谢谢大家的建议。你们都对解决我的问题很有帮助!

标签: controller vhdl vga


【解决方案1】:

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

当然有 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 来执行此操作。

【讨论】:

  • VHDL 2008 添加了对归约运算符的支持,因此您可以编写:bit &lt;= and vector; 这与bit &lt;= vector(0) and vector(1) and ... and vector(n); 相同
【解决方案2】:

如果您只想在 VHDL 中对两个 std_logic_vector 进行按位与运算,可以这样做:

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

上面提到的principals可以扩展到原帖中提到的其他操作,比如:

other_value <= "0111011111";
output <= '1' when ((PixelRow AND (NOT(other_value))) = "111111111") else '0'

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

【讨论】:

    【解决方案3】:

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

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

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

    让合成器弄清楚逻辑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-28
      • 2012-09-06
      • 1970-01-01
      • 1970-01-01
      • 2011-03-26
      • 1970-01-01
      • 2023-04-04
      相关资源
      最近更新 更多