lcytms
发表于 2017-4-19 22:30:33
1133
2005以后,用localparam来代替parameter。
为什么这么做?
这个道理是非常简单的。
因为localparam是常数,parameter是参数,2005之前verilog是没有常数的,常数参数是不分的。
所以说业界一直对它持批评,因为变量名的分配是不应该被传递出去的。
我们学过C语言就知道,参数有个传值的概念,这一段是应该被封装住的。
用户经意或不经意地修改了s0分配的变量,这个系统变得不稳定,不能正确地运行,这是它要封装的理由之一。
lcytms
发表于 2017-4-19 22:33:10
1134
它不应该被用户修改,被分频器的用户修改。
要封装起来。
第二个理由就更重要了,写了复杂的代码以后,有知识产权,如果你没有带封装,很容易被别人窥视,你的核心机密。
所以说一定要封装出来。
我们之前的代码是不得已而为之,没有这个功能,没有这个localparam。
2005以后有了,再这么写你就是西施效颦了。
人家是不得已而为之,现在你能够写常数你不写。
接下来,我来写它的状态机,用一个always语句块来写。
那么如果我们绘制了刚才一段式背下来的代码模型,我们就知道,它是一个闭节点。
信号敏感表里面必须出现一个沿信号,并且不会被引用。
lcytms
发表于 2017-4-19 23:11:03
1135
这个clk绝对不会出现在我们的begin end块里面。
没有被引用,有且有一个未被引用,就会得到闭节点。
我们也可以给它做一个块名,fsm_1s_cn。
lcytms
发表于 2017-4-19 23:12:02
1136
编写代码。
lcytms
发表于 2017-4-19 23:13:11
1137
编写代码。
我们在不同的状态执行不同的动作,我们用case语句写。
用轻量级的条件分支是case,重量级的条件分支是if。
If也可以写,但是它是重量级,它对应的面积结构会更大一些。
以后我们在CSS的课程我们会讨论,根据谁来做对应的输出呢?
肯定是状态state。
这就意味着这个state是出现在了,它是被引用的还是被驱动的,在第24行他被引用了,在第21行它被驱动了。
我们先写,写完了以后,我们统一来分析。
lcytms
发表于 2017-4-19 23:15:06
1138
编写代码。
lcytms
发表于 2017-4-19 23:16:22
1139
编写代码。
Count<=count+1;这一行我们看见在赋值号的两侧,都有同名信号,所以说呢,在这种情况之下,闭节点是允许迭代的。
因为它有寄存器来隔离。
组合电路那就麻烦了。
lcytms
发表于 2017-4-19 23:17:58
1140
编写代码。
State<=s0;,写了是安全,不写当然也指向s0,写了以后除了安全还增加可读性。
这样的话呢,我们就写完了。
直接写else对应相对的条件。
lcytms
发表于 2017-4-19 23:19:38
1141
编写代码。
像简单的逻辑,不要状态转移图我们也能写,更复杂的没有图几乎是寸步难行。
我们注意到国外有些教材里面,凡是稍微大一点的,就必定会有状态转移图,而且会有更现代的一种方式,就是算法流程图ASMc。
稍后会向大家介绍,后续的课程。
lcytms
发表于 2017-4-21 16:56:57
1142
编写代码。