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), 因为两处赋值由于是同步的, 会冲突:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
代码如:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
有的时候两个Process要同步, 只要在一个Process中加一个Signal, 比如:sig <= NOT sig; 再由sig触发另一个Process即可.