lcytms
发表于 2019-1-9 14:17:01
1331
VHDL我给大家做一个时序逻辑,做一个计数器。
状态机做一个。
然后我们就布置下午的练习。
下午的练习也很简单,就是把我们以前写过的流水灯也好,七段数码管也好,把它翻成VHDL。
lcytms
发表于 2019-1-10 14:09:21
1332
做一个计数器,做一个状态机。
我们可以比较这两种方法,这两种语言。
特别是关于行为的相同和不同之处。
lcytms
发表于 2019-1-10 14:10:53
1333
同样是新建工程向导,取名counter_vh。
然后新建VHDL文件,另存为counter_vh.vhd。
库声明。
lcytms
发表于 2019-1-10 14:11:44
1334
实体。
端口。
lcytms
发表于 2019-1-10 14:14:01
1335
写结构体。
肯定是用行为写。
Ctrl-S、Ctrl-K。
检查一下框架。
我们来写一个计数器的行为。
大家注意VHDL和Verilog的一些重要区别。
行为语句我们用像if、case的一些语句来写。
这是行为的描述。
lcytms
发表于 2019-1-19 11:47:49
1336
VHDL的信号敏感表,严格地遵循非综合的目的。
哪些信号列出来,变更的时候会处理。
时钟变更会处理。
在VHDL里面没有沿事件。
Q发生变化,我们也要讨论,因为q要加一。
所以说是所有的信号。
If是一个架构。
如果我们要写一个同步复位,沿敏感的信号,在Verilog里面,会出现在信号敏感表里面,它跟综合有关。
lcytms
发表于 2019-1-19 11:48:48
1337
VHDL的信号敏感表,跟综合无关。
综合的意义一定用条件来叙述。
它可以这么来写。
Clk的事件,同时clk为高,1就是一个上升沿,写成0就是下降沿。
嵌套在沿事件里面的结构全部是同步的。
如果你写同步复位,它的里面的是同步。
它的外面的是异步。
lcytms
发表于 2019-1-19 11:50:09
本帖最后由 lcytms 于 2019-1-22 21:15 编辑
1338
我先这样写,然后我们会给出VHDL的经典使用的方法。
Q清零。
或者直接写16个0,更常用的写法是others。
这样不论多少位都清零。
置位以后q让它加一。
我们先这样写,然后分析综合。
它一定会报错。
lcytms
发表于 2019-1-19 11:52:05
本帖最后由 lcytms 于 2019-1-22 21:14 编辑
1339
本身这种写法,在Verilog里面是没有任何问题的。
但VHDL它不干。
它为什么不支持这种写法呢?
就是由于它是强数据类型。
分析综合。
它直接报错。
报q这个错。
它说,q这个对象不能被读。
Q这个对象它是一个输出类型。
VHDL是强数据类型。
强数据类型就要求,赋值号左右两侧的数据类型的属性要完全一致。
Q的属性是输出,而这边是输入。
解决的方案,可以把它改成buffer。
但是VHDL典型的有一种处理方法,输出有的时候是不能改成buffer的。
输出就是输出。
Buffer是一个双向的嘛,一个缓冲器。
它这个端口就是输出端口。
lcytms
发表于 2019-1-19 11:53:18
本帖最后由 lcytms 于 2019-1-22 21:14 编辑
1340
这个时候改成buffer是有条件的。
现在我们这个条件如果不允许它改成buffer,怎么做?
VHDL想出一个办法。
声明一个中间信号,int_q。
绑定它的数据类型为向量,15:0。
中间信号没有声明方向。
既可以用作输入,也可以用作输出。
然后我们来驱动中间类型的q。
中间类型的的q,它怎么变成端口呢?
很简单。
将q引出来即可。