vhdl - 图像 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;
解决方案
IEEE Std 1076-2008
12.4 使用条款
使用子句实现了通过选择可见的声明的直接可见性。
...
为了确定哪些声明在给定位置通过 use 子句直接可见,请考虑由其范围包围该位置的所有 use 子句标识的声明集。此集合中的任何声明都是潜在的可见声明。除了以下三种情况外,潜在可见的声明实际上是直接可见的:a) 如果考虑的位置在声明的同形异义词的直接范围内,则潜在可见声明不会直接可见。
b) 如果两个可能可见的声明是同形异义词,一个是显式声明的,另一个是隐式声明的,则隐式声明不是直接可见的。
c) 具有相同指示符且未包含在案例 b) 中的潜在可见声明不会直接可见,除非它们中的每一个都是枚举文字说明或子程序的声明。
还有
12.3 可见性,第 7 段(部分)
...当且仅当两个声明具有相同的指示符,并且它们表示不同的命名实体,并且最多允许两个声明中的一个重载,或者重载是两种声明都允许,并且它们具有相同的参数和结果类型配置文件(参见 4.5.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。
推荐阅读
- php - Yii2 无法将本地时间转换为 GMT 时区
- postgresql - 创建的 Postgresql 视图在 Npgsql 中不起作用
- django - 安装 webpack_loader (webpack-template-loader) 在 assignment_tag 上出现属性错误
- php - 我想根据动态下拉列表中的 id 选择显示名称
- ios - (iOS react-native) Vimeo 视频在 react-native-webview 中全屏显示后的内容覆盖状态栏
- elasticsearch - Elasticsearch 聚合桶总是只显示 10 个结果
- node.js - 编译器无法从 node_modules/@types 中找到类型
- microsoft-graph-api - 在向 o365 日历创建新事件时向与会者发送通知电子邮件
- interpolation - 使用 openmodelica 进行插值的函数
- ios - 在 .xib 中使用自定义 UIView 作为 IBOutlet