返回信息流做VGA显示控制器遇到问题。
设计分为了3个component,由于需要共享信号,而且共享很多,所以我定义了一个package,把全局使用的信号,比如clk25m,clk100hz,clk1hz,state(s0,s1,s2,s3)等定义在里面了,然后在component中引入package。
问题是这样的,我在寝室的quartus9.2里面编译没有任何问题,可是到实验室的7.2版本编译一堆错误,都是“不能引用全局信号。。。”,英文的提示大致是“cannot reference to global signal”。
有一种可能的解决方法是每个上层模块把信号都传递过去,但是传递的实在太多了,写起来很乱。我想应该有共享或者说共用信号的机制吧,但是package的方式貌似行不通,不知有它法不?求达人指点,非常感谢!
帖关键代码如下:
--顶层模块
entity vga is --VGA entity definition
port
(clk50m : in std_logic;
sw0,sw1,sw2,sw3,sw4,sw5,sw6,sw7: in std_logic;
reset,ld,rd,up,down,modecnt: in std_logic;
hs,vs,r0,r1,g0,g1,b0,b1:out std_logic);
end vga;
architecture arch of vga is
component vgamodule --Define vag interface as a module
port
(clk: in std_logic;
hsync,vsync,henable,venable : out std_logic;
hcntout,vcntout : out std_logic_vector(9 downto 0));
end component;
component vgastate --Define vag state implement
port
(clk: in std_logic;
sw2,sw3,sw4,sw5,sw6,sw7 : in std_logic);
end component;
--package的定义
package vgapack is
type states is (s0,s1,s2,s3);
signal clk25m,clk1hz,clk100hz : std_logic;
constant max1:integer := 24999999;
constant max2:integer := 249999;
signal counter1:integer range 0 to max1;
signal counter2:integer range 0 to max2;
signal hpos,vpos : std_logic_vector(9 downto 0);
signal hen,ven : std_logic;
signal colors : std_logic_vector(5 downto 0);
signal state:states :=s0;
signal resetm,leftm,rightm,upm,downm,scountm : std_logic;
end vgapack;
错误:
在component vgastate中使用clk25m、clk1hz、clk100hz、hpos、vpos等就有错误,难道非得在port中传递吗?
这是一条镜像帖。来源:北邮人论坛 / circuit / #16018同步于 2010/12/30
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Circuit机器人发帖
【求助】Quartus中使用全局信号
michael2008
2010/12/30镜像同步3 回复
订阅后,新回复会通过你的通知中心匿名送达。
3 条回复
从电路的角度来说,没有所谓全局信号局部信号之分,所有的信号(verilog中的wire型一定综合成线,reg型可以综合成寄存器,也可以综合成信号线)都是全局存在的。如果需要的话,就拉到输入输出就行了。
从语言描述角度来说,信号需要一个名字。而这个名字在同一个模块中不能重名,否则就没有办法区分那个是那个了。
好吧,发点儿牢骚。其实我知道你用的是VHDL,我接触VHDL只用过前后不到一星期。
VGA显示器的话,我记得我做的时候不过开了两个计数器而已,没有那么多的信号要共享的呀。而且如果引用package的方法,我不知道VHDL中是做如何处理的,感觉不同的模块应该能够区分出来。不过问题是所有引用package的模块是不是处理同一个信号。比如package a中定义s信号,compoent b & c中各引用一次。那么b中的s和c中的s是否为同一个信号呢?如果是的话,会存在同一信号多驱动的错误,如果不是的话,那么共享又是如何做到呢?
+--------------------- + +-------------------------- +
| +--------- + | | +------------- + |
| | s | | | | s | |
| +--------- + | | +------------- + |
| | | b |
| a | +-------------------------- +
+--------------------- +
【 在 lanphon 的大作中提到: 】
: 从电路的角度来说,没有所谓全局信号局部信号之分,所有的信号(verilog中的wire型一定综合成线,reg型可以综合成寄存器,也可以综合成信号线)都是全局存在的。如果需要的话,就拉到输入输出就行了。
: 从语言描述角度来说,信号需要一个名字。而这个名字在同一个模块中不能重名,否则就没有办法区分那个是那个了。
: 好吧,发点儿牢骚。其实我知道你用的是VHDL,我接触VHDL只用过前后不到一星期。
: ...................
我是按照袁东明老师的讲解的设计思路去设计的,他要求状态机的设计,我就设计了顶层模块,有四种显示模式,负责综合各子模块,然后一个子模块负责计数产生同步和消隐信号,一个子模块根据计数值来计算像素点,绘制出图形,再有一个更加底层的模块,连接到绘图的模块,负责产生用户设计的图形,在这个用户图形模块,再设计了4种状态,可通过按键来切换不同的显示图形,这样的设计顶层基本不用修改了,扩展起来比较方便,只要改用户控制的底层模块就好。但这样的模块耦合很麻烦了,由于第二次用vhdl写代码且第一次设计状态机和用模块化的设计,对模块的耦合,信号的传递不是很清楚。产生了信号共享的问题,因为类似于多个频率的时钟信号和像素位置的计数值多个模块都要用,我就想“共享”之,而不是每次都在port里传递。
应该不存在多驱动的问题,我是在一个模块中写,其他模块都是读。
package a中定义s信号,compoent b & c中各引用一次。那么b中的s和c中的s是否为同一个信号?我觉得是。但是7.2的quartus不认,9.2的可以。