使用VHDL移动8位图像

时间:2019-04-02 17:33:53

标签: vhdl modelsim

我有一个大学的求职信,其中有以下内容

目标:在屏幕上移动图像。

输入:8 x 8图像

命令:00 –向右移动图像; 01-向右移动图像; 10-向上移动图像; 11-向下移动图像。

根据插入的命令,图像沿插入命令的方向移动一个像素。

EDIT1 :我编写了以下内容,代码编译无误,但输出为空

LIBRARY IEEE;
USE IEEE.std_logic_1164.all;
USE IEEE.numeric_std.all;

ENTITY image_bit IS
    PORT   (bv1, bv2, bv3, bv4, bv5, bv6, bv7, bv8  : IN  UNSIGNED (7 DOWNTO 0);
        sel                                     : IN  UNSIGNED (1 DOWNTO 0);
        ot1, ot2, ot3, ot4, ot5, ot6, ot7, ot8  : OUT UNSIGNED (7 DOWNTO 0));
END image_bit;

ARCHITECTURE img_trans OF image_bit IS

BEGIN

    mover_direita: PROCESS(sel)
    BEGIN
        IF (sel = "00") THEN
            ot1 <= bv1 srl 1;
            ot2 <= bv2 srl 1;
            ot3 <= bv3 srl 1;
            ot4 <= bv4 srl 1;
            ot5 <= bv5 srl 1;
            ot6 <= bv6 srl 1;
            ot7 <= bv7 srl 1;
            ot8 <= bv8 srl 1;
        END IF;
    END PROCESS mover_direita;

    mover_esquerda: PROCESS(sel)
    BEGIN
        IF (sel = "01") THEN
            ot1 <= bv2;
            ot2 <= bv3;
            ot3 <= bv4;
            ot4 <= bv5;
            ot5 <= bv6;
            ot6 <= bv7;
            ot7 <= bv8;
            ot8 <= "00000000";
        END IF;
    END PROCESS mover_esquerda;

    mover_cima: PROCESS(sel)
    BEGIN
        IF (sel = "10") THEN
            ot1 <= bv2;
            ot2 <= bv3;
            ot3 <= bv4;
            ot4 <= bv5;
            ot5 <= bv6;
            ot6 <= bv7;
            ot7 <= bv8;
            ot8 <= "00000000";
        END IF;
    END PROCESS mover_cima;

    mover_baixo: PROCESS(sel)
    BEGIN
        IF (sel = "11") THEN
            ot1 <= "00000000";
            ot2 <= bv1;
            ot3 <= bv2;
            ot4 <= bv3;
            ot5 <= bv4;
            ot6 <= bv5;
            ot7 <= bv6;
            ot8 <= bv7;
        END IF;
    END PROCESS mover_baixo;


END img_trans;

1 个答案:

答案 0 :(得分:0)

您有4个不同的过程试图驱动ot*的值。将这些组合到一个过程中,并使用CASE语句(如果需要,也可以使用IF ... ELIF)根据您的sel输入选择不同的状态。例如:

--snip
move: PROCESS(sel)
BEGIN
    CASE sel IS
        WHEN "00" =>
            ot1 <= bv1 srl 1;
            ot2 <= bv2 srl 1;
            --etc.
        WHEN "01" =>
            ot1 <= bv2;
            ot2 <= bv3;
            --etc.
        WHEN "10" =>
            --etc.
        WHEN "11" =>
            --etc.
        WHEN OTHERS =>
            --one bit of sel is X, Z, H, L or U.
            --this should be an invalid state
    END CASE;

END PROCESS move;
--snip

顺便说一句,在进程敏感度列表中仅包含sel意味着如果仅更改bv*输入,则输出不会更改。这可能不是您的预期行为。如果不希望这样做,请将bv1, bv2, bv3, etc.添加到您的过程敏感性列表中。