首页 > 解决方案 > 图像 ROM 显示 VGA

问题描述

我正在使用 VHDL FPGA 编写代码代码内容第 3 部分第一个 VGA,第二个是 rom 代码,第三个绘制图像一个是图像 rom 显示 vga 的保存并得到他的问题

错误 (10621): VHDL Use Clause error at vga.vhd(230): more than one Use Clause import a declaration of simple name "unsigned" -- 没有一个声明是直接可见的

提前致谢。

 LIBRARY ieee;
            USE ieee.std_logic_1164.all;
            USE ieee.std_logic_arith.all;
            use IEEE.STD_LOGIC_UNSIGNED.ALL;
            use IEEE.NUMERIC_STD.ALL;
            LIBRARY lpm;
            USE lpm.lpm_components.all;
            ----------------------------------------------------------
            ENTITY vga IS
            GENERIC (
            Ha: INTEGER := 96; --Hpulse
            Hb: INTEGER := 144; --Hpulse+HBP
            Hc: INTEGER := 784; --Hpulse+HBP+Hactive
            Hd: INTEGER := 800; --Hpulse+HBP+Hactive+HFP
            Va: INTEGER := 2; --Vpulse
            Vb: INTEGER := 35; --Vpulse+VBP
            Vc: INTEGER := 515; --Vpulse+VBP+Vactive            vbp
            Vd: INTEGER := 525); --Vpulse+VBP+Vactive+VFP
            PORT (
            clk: IN STD_LOGIC; --50MHz in our board
            red_switch, green_switch, blue_switch: IN STD_LOGIC;
            pixel_clk: BUFFER STD_LOGIC;
            Hsync, Vsync: BUFFER STD_LOGIC;
            R, G, B: OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
            nblanck, nsync : OUT STD_LOGIC);
            END vga;
            ----------------------------------------------------------
            ARCHITECTURE vga OF vga IS
            SIGNAL Hactive, Vactive, dena: STD_LOGIC;
            SIGNAL address: STD_LOGIC_VECTOR(9 DOWNTO 0);
            SIGNAL intensity: STD_LOGIC_VECTOR(7 DOWNTO 0);
            SIGNAL hPos: integer;
            SIGNAL vPos : integer;
            SIGNAL videoOn : STD_logic;
            constant picture_size : Integer:=9000; 
            begin
            -------------------------------------------
            --ROM instantiation:
            myrom: lpm_rom
            GENERIC MAP (
            lpm_widthad => 10, --address width
            lpm_outdata => "UNREGISTERED",
            lpm_address_control => "REGISTERED",
            lpm_file => "2colom.mif", --data file
            lpm_width => 8) --data width 
            PORT MAP (
            inclock=>NOT pixel_clk, address=>address, q=>intensity);
            --Create address (row number):
            PROCESS (Vsync, Hsync)
            VARIABLE line_counter: INTEGER RANGE 0 TO Vd;
            BEGIN
            IF (Vsync='0') THEN
            line_counter := 0;
            ELSIF (Hsync'EVENT AND Hsync='1') THEN
            IF (Vactive='1') THEN
            line_counter := line_counter + 1;
            END IF;
            END IF;
            -- address <= conv_std_logic_vector(line_counter , 16);
            --  address <= conv_std_logic_vector(line_counter , 10);
            end process;
            ---------------------------------------------
            Horizontal_position_counter:process(pixel_clk)
            begin   
            if(pixel_clk'event and pixel_clk = '1')then
            if (hPos = (Ha + Hb + Hc + Hd)) then
            hPos <= 0;
            else
            hPos <= hPos + 1;
            end if;
            end if;
            end process;
            Vertical_position_counter:process(pixel_clk, hPos)
            begin
            if(pixel_clk'event and pixel_clk = '1')then
            if(hPos = (Ha + Hb + Hc + Hd))then
            if (vPos = (Va + Vb + Vc + Vd)) then
            vPos <= 0;
            else
            vPos <= vPos + 1;
            end if;
            end if;
            end if;
            end process;
            Horizontal_Synchronisation:process(pixel_clk, hPos)
            begin
            if(pixel_clk'event and pixel_clk = '1')then
            if((hPos <= (Ha + Hb)) OR (hPos > Ha + Hb + Hc))then
            Hsync <= '1';
            else
            Hsync <= '0';
            end if;
            end if;
            Vertical_Synchronisation:process(pixel_clk, vPos)
            begin
            if(pixel_clk'event and pixel_clk = '1')then
            if((vPos <= (Va + Vb)) OR (vPos > Va + Vb + Vc))then
            Vsync <= '1';
            else
            Vsync <= '0';
            end if;
            end if;
            end process;
            video_on:process(pixel_clk, hPos, vPos)
            begin
            if(pixel_clk'event and pixel_clk = '1')then
            if(hPos <= Ha and vPos <= va)then
            videoOn <= '1';
            else
            videoOn <= '0';
            end if;
            end if;
            end process;
            draw:process(pixel_clk, hPos, vPos, videoOn)
            begin
            if(pixel_clk'event and pixel_clk = '1')then
            if(videoOn = '1')then
            if (unsigned(address)<picture_size) then
            R<=intensity(11 downto 8);
            G<=intensity(7 downto 4);
            B<=intensity(3 downto 0);
            address<= STD_LOGIC_VECTOR (unsigned(address)+1);
            else
            R<=(others=>'0');
            G<=(others=>'0');
            B<=(others=>'0');
            end if;
            else
            R<=(others=>'0');
            G<=(others=>'0');
            B<=(others=>'0');
            address<=(others=>'0');
            end if;
            end if;
            end process;
            ---- 
            END vga;

标签: vhdl

解决方案


IEEE Std 1076-2008
12.4 使用条款

使用子句实现了通过选择可见的声明的直接可见性。
...
为了确定哪些声明在给定位置通过 use 子句直接可见,请考虑由其范围包围该位置的所有 use 子句标识的声明集。此集合中的任何声明都是潜在的可见声明。除了以下三种情况外,潜在可见的声明实际上是直接可见的:

a) 如果考虑的位置在声明的同形异义词的直接范围内,则潜在可见声明不会直接可见。

b) 如果两个可能可见的声明是同形异义词,一个是显式声明的,另一个是隐式声明的,则隐式声明不是直接可见的。

c) 具有相同指示符且未包含在案例 b) 中的潜在可见声明不会直接可见,除非它们中的每一个都是枚举文字说明或子程序的声明。

还有

12.3 可见性,第 7 段(部分)

...当且仅当两个声明具有相同的指示符,并且它们表示不同的命名实体,并且最多允许两个声明中的一个重载,或者重载是两种声明都允许,并且它们具有相同的参数和结果类型配置文件(参见 4.5.1)。

定义同形异义词和

  1. 声明
    6.1 总则第 3 段

对于每种形式的声明,语言规则定义了一个特定的文本区域,称为声明的范围(见 12.2)。每种形式的声明都将标识符、运算符符号或字符文字与命名实体相关联。标识符、运算符符号或字符文字称为声明的指示符。只有在其范围内,才有可能使用指示符来指代关联的声明实体;这些地方由可见性规则定义(见 12.3)。在这些地方,代号被称为实体的名称;据说该名称表示关联实体。

它定义了指示符

对于特定错误

错误 (10621): VHDL Use Clause error at vga.vhd(230): more than one Use Clause import a declaration of simple name "unsigned" -- 没有一个声明是直接可见的

对于使用条款集:

            USE ieee.std_logic_1164.all;
            USE ieee.std_logic_arith.all;
            use IEEE.STD_LOGIC_UNSIGNED.ALL;
            use IEEE.NUMERIC_STD.ALL;

包 std_logic_arith 和 numeric_std 都提供无符号类型的声明。

unsigned 的两个声明是同形异义词,具有相同的指示符 b) 不适用,两者都是显式声明的。

虽然您不依赖于问题显示的代码包 std_logic_unsigned 的 use 子句,但可以删除或注释掉包 numeric_std 或包 std_logic_arith 的 use 子句之一(与 std_logic_unsigned 一起)。(包 numeric_std 包含函数rising_edge 和falling_edge,它们对于评估时钟边沿更为紧凑,并且需要从非元值转换为“1”或“0”)。

当您尝试使用类型 unsigned (in process draw) 时,应显示报告的错误。想必

           address<= STD_LOGIC_VECTOR (unsigned(address)+1);

是第 230 行。

(您的第一个额外错误是缺少end;or end process;end process Horizontal_Synchronisation;缩进和您的代码一致,连贯地使用分隔符,这些突出就像拇指酸痛一样。)

这些

           R<=intensity(11 downto 8);
           G<=intensity(7 downto 4);
           B<=intensity(3 downto 0);

R, G, B: OUT STD_LOGIC_VECTOR(7 DOWNTO 0);在信号分配目标 ( , SIGNAL intensity: STD_LOGIC_VECTOR(7 DOWNTO 0);)的右侧表达式中没有匹配的元素。

大多数综合工具 -1993 兼容并且

        PORT MAP (
           inclock=>NOT pixel_clk, address=>address, q=>intensity);

正式的实际inclock不是静态表达式。解决此问题的方法是将声明的信号关联为分配的实际信号not pixel_clk(如果您确定要首先反转时钟)。

在符合 -2008 的 VHDL 工具中,作为关联元素中的实际值的非静态表达式将声明一个隐式信号。目前任何 FPGA 综合工具都不支持此功能。

在模拟器中修复所有这些代码分析(编译)之后。对合成或功能不提供任何担保。

vga端口pixel_clk似乎不需要成为模式缓冲区。它仅被评估(读取)并且可能应该是模式 IN。


推荐阅读