VHDL语言Process

FPGA编程, VHDL语言, 芯片ALTERA Cyclone EP1C60240C8, UP3-1C6实验板, Quartus II.

VHDL语言中一般定义一个Entity, Entity中定义引脚之类的与其他模块交互的接口. 一个Entity可能对应N个Architecture, 并且具体的对应可以定义Configuration进行配置.

一个Architecture可以包含多个Process, 这些Process是并行的, Process由其后括包里的任一Signal触发, 触发点是在这个Process结尾的End Process处, 也就是在程序运行完即运行到End Process了才能被触发, 这就保证了一个过程被运行完 (Process也可以由其包含的 Wait 语句触发, 此时触发点在 Wait 语句处). 各Process之间的数据传递由Architecture头部声明的Signal传递, 而对Signal的赋值一般用>=进行, 个人的理解是这个赋值允许延迟, 即没执行完便执行下一个语句, 但它会尽量早的执行. 赋值语句若要立即执行需用:=, 一般Variable变量都这样赋值.

如果在不同进程中对同一信号量进行赋值, 就会出现如下错误(Quartus II), 因为两处赋值由于是同步的, 会冲突:

Error: Can't resolve multiple constant drivers for net  " SHOW_MODE[3] "  at UP3_CLOCK.vhd( 462 )
Error: Constant driver at UP3_CLOCK.vhd(
498 )
Error: Can't elaborate top-level user hierarchy
Error: Quartus II Analysis & Synthesis was unsuccessful. 
3  errors ,   6  warnings
    Error: Processing ended: Sun Sep 
03   11 : 16 : 41   2006
    Error: Elapsed time: 
00 : 00 : 02
Error: Quartus II Full Compilation was unsuccessful. 
3  errors ,   6  warnings

代码如:

SIGNAL SHOW_MODE: STD_LOGIC_VECTOR( 3  DOWNTO  0 );

PROCESS (MODE_SWITCH)
BEGIN
    SHOW_MODE 
<=  X " 1 " ;
END PROCESS;

PROCESS (MODE_SWITCH)
BEGIN
    SHOW_MODE 
<=  X " 0 " ;
END PROCESS;

有的时候两个Process要同步, 只要在一个Process中加一个Signal, 比如:sig <= NOT sig; 再由sig触发另一个Process即可.

 

你可能感兴趣的:(嵌入式)