Menu Close
%title缩略图

Verilog状态机设计与应用-2

线性序列机LSM(Linear sequence machine)可以看作是有限状态机的一种特例,当所描述的状态转移与时钟呈现出一种线性规律时,我们可以直接用时钟计数作为当前状态。

%title缩略图

Verilog状态机设计与应用-1

序列检测机在通信中应用非常广泛,尤其是在串行通信中,如何在一串连续01序列中找出需要通信帧的帧头,从而使整个数据帧同步起来。简单如UART找出start位,以太网通信中如何找到PREAMBLE和SFD等从而确定一个帧的开始。

%title缩略图

权值变换法实现16进制到BCD码转换-2

无论采用哪种变换,基本要求是转换后的数值与转换前的数值表达的含义不变,如X=4’b1111,转换成BCD码后为15,用两个4位二进制表示为 A=4’b0101, B =4’b0001, 其中A为低位, B为高位;B的权值为10,A的权值为1。

%title缩略图

权值变换法实现16进制到BCD码转换-1

加减计数法实现二进制(16进制)到BCD码(十进制)的转换,实现方法非常简单,但是其缺点也很明显,(1)计算速度慢,特别在利用软件进行计算式时速度更慢,(2)功耗大,由于计算速度慢,当数值较大时,无论硬件(FPGA或ASIC)还是软件,系统长期处在计算中,因此动态平均功耗都比较大。在数值较大要求快速计算或低功耗系统中时不能满足要求,因此提出一种快速算法–权值变换法。

%title缩略图

仿真工程中$readmemh 使用-4

使用xsim目录的缺点是每次仿真复位后(右键点击SIMULTAION,选择Reset,如图2所示),会删除led_sim.sim 文件,用户需要重新制作文件,再次放入的xsim 这个目录中,比较麻烦; 如果将led_sim.sim 放到其他的目录下,可以避免这个问题的出现。

%title缩略图

仿真工程中$readmemh 使用-3

例化一个 8-bit 宽的ram存储器,深度为128。 将文本文件test.txt 文件中每一行最后一个byte 数据,存储到ram中, 从ram[0] 开始, 直到test.txt 文件的最后一行结束,或者是读出的数据达到 ram 的最大深度。文本文件的格式需要注意只能使用0-9,a-f,每一行的末尾需要以回车换行结束。

%title缩略图

仿真工程中$readmemh 使用-2

$readmemh 系统函数就是用来帮助开发者加载仿真数据的。$readmemh系统函数本身具有文件操作功能,因此不需要$fopen等文件操作。通常来说 , $readmemh 也被归为文件操作类型的系统函数。

%title缩略图

仿真工程中$readmemh 使用-1

在verilog 仿真中,有时会使用$readmemh系统函数,帮助仿真者快速装载仿真所使用的数据。在一些简单的仿真中, 我们可以通过initial 来加载仿真的数据,但是当仿真数据比较多的情况下, 就需要使用系统函数加载数据了。

%title缩略图

状态机分段描述方法-3

三段式状态机将二段式状态机的第二段再进行拆分,将次态的实现作为状态机的第二段,将输出逻辑作为状态机的第三段。伴随着三段状态机的可能还有其它与状态转移相关的逻辑,该部分内容不属于三段式状态机本身的内容,可以分开描述,也可以合并到对应的状态机的各个段中。

%title缩略图

状态机分段描述方法-2

经过改写之后可以看出,按键去抖程序的状态转换更加清晰。而且从上例的最后可以看出按键最后的输出不仅与状态有关(RLS_DEBOUNCING),而且与按键的输入有关,因此该状态机是梅利机。而且上面是标准的一段式状态机。

%title缩略图

状态机分段描述方法-1

上几节内容介绍了状态机建模以及摩尔机、梅利机的描述,状态机的编码格式等内容,本节内容着重介绍状态机的分段描述方法。按照状态机的分段描述方法,状态机可分为一段式状态机,二段式状态机,三段式状态机。

%title缩略图

状态机的编码格式-3

由格雷码到自然二进制码转换,保留格雷码的最高位,二进制码次高位由二进制码最高位与格雷码次高位异或得到,之后的各位的计算结果由二进制码上一位的计算结果与格雷码本位相异或得到。