********************
一段式
有限状态机
********************
青创的 1602 驱动代码 是 标准的 一段式 有限状态机,即 时序和组合逻辑都放在 一段内 (always)描述。
网上吐字比较清晰的视频 是 华清的
http://my.tv.sohu.com/us/82053896/29155722.shtml
*********************************
再来复习一下 1602 的状态:
除了初始化外,还有 9种状态,而且是无条件的转移;
另外 根据定义
•moore有限状态机:输出仅依赖于内部状态,跟输入无关。
属于比较简单 的 moore 状态机。
在每个 状态 中, 又包含了一系列 时序 操作,所以 赋值 都是 利用了 非阻塞模式(这个是 一定要理解的概念,否则白学)。
- begin
- delay_cnt<=delay_cnt+1;
- if (delay_cnt<=2)
- begin
- lcd_rs<=1'b0;
- lcd_rw<=1'b0;
- lcd_e<=1'b1;
- end
- else if (delay_cnt<=4)
- lcd_data<=8'h01;
- else if (delay_cnt<=6)
- lcd_e<=1'b0;//下降沿产生
- else if (delay_cnt>=50) //等待>40us时间,使指令写入完毕
- begin
- delay_cnt<=0;
- lcd_state<=set_Func;
- end
- end
复制代码
好在 这几个状态 的格式 都差不多,变化主要 集中在 lcd_data (命令或数据),lcd_state(依次转变,有规律可循)。虽然 代码很长,但是只要理解了其中一个状态,其他的状态都可以理解。 这也是没有 把 所有 状态代码 都复制到 帖子上 的原因;一下子代码太多 反而 会 乱了手脚,不如 一段代码理解透彻,其他代码自然也跟着明白了。
case(状态)
状态1:一堆代码(理解透彻);
状态2:一堆代码;
状态3:一堆代码;
。。。
状态9:一堆代码;
**************************************
**************************************
关于初学 FPGA 的术语,
术语很 唬人,初学者 很容易 被吓到。
例如 one-hot编码
第一眼看,感觉 高上大,其实理解很简单,就是
parameter set_Func=8'b0000_0001,
set_DispSwitch=8'b0000_0010,
set_EntryMd=8'b0000_0100,
clr_Disp=8'b1000_1000,
set_DDAd1=8'b0001_0000,
set_DDAd2=8'b0010_0000,
Display1=8'b0100_0000,
Display2=8'b1000_0000,
Over=8'b0000_0000;
状态编码 只有 1 个 1。对照下面看 很简单。
十位数 | 二进制码 | 格林码 | 独热码 | 约翰逊 | 0 | 0000 | 0000 | 0000_0000_0000_0001 | 0000_0000 | 1 | 0001 | 0001 | 0000_0000_0000_0010 | 0000_0001 | 2 | 0010 | 0011 | 0000_0000_0000_0100 | 0000_0011 | 3 | 0011 | 0010 | 0000_0000_0000_1000 | 0000_0111 |
************************
阻塞 赋值 和 非阻塞 赋值 ,则需要 很多精力 理解 和记忆。
感觉 解释 阻塞和非阻塞 比较好 的 是 “FPGA Protoyping by Verilog Examples” 这本书 P175,
7.1 BLOCKING VERSUS NONBLOCKING ASSIGNMENT |