抗击疫情,在家办公,第二天

2.10 今天继续回顾基础.

案例一:序列检测

案例二:状态机

状态机描述时关键是要描述清楚几个状态机的要素,即如何进行
状态的转移,每个状态的输出是什么,状态转移的条件。具体描述时
方法各种各样,最常见的有三种描述方式:

1. 一段式:整个状态机写到一个 always 模块里面,在该模块中
即描述状态转移,又描述状态的输入和输出。
2. 两段式:用两个 always 模块来描述状态机,其中一个 always
模块采用同步时序描述状态转移,另一个模块采用组合逻辑判
断状态转移条件,描述状态转移规律以及输出。
3. 三段式:在两个 always 模块描述的方法基础上,使用三个
always 模块,一个 always 模块采用同步时序描述状态转移,
一个 always 模块采用组合逻辑判断状态转移条件,描述状态
转移规律,另一个 always 模块描述状态输出(可以用组合逻
辑电路输出,也可以用时序逻辑电路输出)。
 

一般而言,推荐的 FSM(有限自动状态机)描述方法是后两种。
这是因为: FSM 和其他的设计一样,最好使用同步时序方式设计,以
提高设计的稳定性,消除毛刺。状态机实现后,一般来说,状态转移
 

部分是同步时序电路而状态的转移条件的判断是组合逻辑。
第二种描述方法同第一种描述方法相比,将同步时序和组合逻辑
分别放到不同的 always 模块中实现,这样做的好处不仅仅是便于阅
读、理解、维护,更重要的是利于综合器优化代码,利于用户添加合
适的时序约束条件,利于布局布线器实现设计。在第二种方式的描述
中,描述当前状态的输出用组合逻辑实现,组合逻辑很容易产生毛刺,
造成设计的不稳定。
第三种描述方式与第二种相比,关键在于根据状态转移规律,在
上一状态根据输入条件判断当前状态的输出,从而在不插入额外时钟
节拍的前提下,实现了寄存器输出
 

按键的抖动的处理:

1按键抖动带来的危害
键抖动会引起一次按键被误读多次。为确保 CPU 对键的一次闭
合仅作一次处理,必须去除键抖动。在键闭合稳定时读取键的状
态,并且必须判别到键释放稳定后再作处理。
2. 抖动的一些参数
抖动时间的长短由按键的机械特性决定,一般为 5ms~10ms。
这是一个很重要的时间参数,在很多场合都要用到。 按键稳定闭
合时间的长短则是由操作人员的按键动作决定的,一般为零点几
秒至数秒。
3. 解决办法
一是延时重采样;二是持续采样。 从理论上来说,延时(如10ms)重采样的准确率肯定低于持续采样。 笔者采用持续采样


Verilog HDL 语言中存在两种赋值语言:
● 非阻塞型赋值语句
● 阻塞型赋值语句

1. 非阻塞型语句
以赋值操作符“ <=”来标识的赋值操作称为“ 非阻塞型过程赋值
(Nonblocking Assignment)”。 非阻塞型过程赋值语句的特点是:
(1) 在 begin-end 串行语句块中,一条非阻塞过程语句的执行不会阻塞下一条
语句的执行,也就是说在本条非阻塞型过程赋值语句对应的赋值操作执行
完之前,下一条语句也可以开始执行。
(2) 仿真过程在遇到非阻塞型过程赋值语句后首先计算其右端赋值表达式的
值,然后等到仿真时间步结束时再将该计算结果赋值变量。也就是说,这
种情况下的赋值操作是在同一仿真时刻上的其他普通操作结束后才得到
执行的。
如以下语句的程序 1:
Initial
begin
A<=B;//语句 S1
B<=A; //语句 S2
end
上述语句中包含了两条非阻塞型过程赋值语句 S1 和 S2,当仿真进程遇到
Initial 过程块后(0 时刻),语句 S1 首先开始执行,赋值表达式“B”的值得到
计算(但是对被赋值变量 A 的赋值操作要等到当前时间步结束才执行),同时由
于 S1 是一条非阻塞型赋值语句,所以 S1 的执行不会阻塞 S2 的执行;由于 S2
也随即开始执行,其对应的赋值表达式“A”的值得到计算,由于这时 S1 对 A
的赋值操作还没有执行,所以此时计算得到的赋值表达式取值是 A 的初值。由于
S2 也是一条非阻塞型赋值语句,它对应的为变量 B 进行赋值操作也要等到当前
时间步结束时才会得到执行;所以在当前时间步结束时, S1、 S2 两条语句对应的赋值操作同时执行,分别将计算得到的 A 和 B 初值赋给变量 B 和 A,这样就交
换了 A 与 B 的取值。
2. 阻塞型语句
以赋值操作符“=”来标识的赋值操作称为“阻塞型过程赋值( blocking
Assignment)”。非阻塞型过程赋值语句的特点是:
(1) 串行块(begin-end)中的各条阻塞型过程赋值语句将以它们在顺序块后排
列次序依次得到执行。
(2)阻塞型过程赋值语句的执行过程是:首先计算右端赋值表达式的值,然后
立即将计算结果赋值给“=”左端的被赋值变量。
阻塞型过程赋值语句的这两个特点表明:仿真进程在遇到阻塞型过程赋值
语句时将计算表达式的值并立即将其结果赋给等式左边的被赋值变量;在串行语
句块中,下一条语句的执行会被本条阻塞型过程赋值语句所阻塞,只有在当前这
条阻塞型过程赋值语句所对应的赋值操作执行完后下一条语句才能开始执行。
例如语句程序 2:
initial
begin
a=0;//语句 S1
a=1;//语句 s2
end
在这段语句中包含两条阻塞型过程赋值语句 S1 和 S2,它们都是在仿真零时
刻得到执行的,其对应的赋值操作也都是在 0 时刻进行的。但由于它们是阻塞型
赋值语句,所以在执行 S1 语句是 S2 被阻塞而不能得到执行;只有在 S1 执行完,
a 被赋值 0 之后, S2 才能开始执行。而 S2 的执行将使 a 被重新赋值 1,所以上
面这个过程块执行后变量 a 的值终取值为 1.


关系运算符:

所有的关系运算符都有着相同的优先级别。关系运算符的优先级别低于
算数运算符的优先级别。


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值