3、时序逻辑设计

所谓时序逻辑,简而言之,就是CLK驱动,不来时钟不干活,同时能自我保持。
最简单的例子,跑马灯

model led_led(input rst, input clk, output out0, output out1, output out2, output out3);
reg ary[3:0];

assign out0 = ary[0];
assign out1 = ary[1];
assign out2 = ary[2];
assign out3 = ary[3];
always @(clk)
begin
    if(rst)
        ary <= 4'h00;
    else
    begin
        ary[3] <= ary[2];
        ary[2] <= ary[1];
        ary[1] <= ary[0];
        ary[0] <= ary[3];
    end
end
endmodele

有人会说那个ary的“中间变量”是不是可以省掉,还真省不了,因为它不仅仅是“临时变量”。
它是个锁存器,寄存器-----------数据保持是它的特点。而wire信号是无法保持的。

当然那4个信号单独赋值,挺形象,但是不够紧凑,C语言可以用ary = ary<<1来表示,那Verilog就如下:
model led_led(input rst, input clk, output out[3:0]);
reg ary[3:0];
assign out = ary;
always @(clk)
begin
    if(rst)
        ary <= 4'h00;
    else
        ary <= {ary[2:0],ary[3]};
end

跑马灯,用组合逻辑做不出来,是因为它的输出不仅仅跟输入有关,也跟前一个状态有关。

看到时序逻辑,很多人发现了无比强大的clk信号,到处都有他的影子,他才是真正的到处留种的风流才子。

“输出不仅仅跟输入有关,也跟前一个状态有关”,这句话,应该很熟悉吧。 -----没错,就是状态机。
后面有个专门贴讲FSM,这是一个非常有效的解决问题的工具------智商99的人可以做到智商120的设计。
如果天才用了,那肯定要更加newbility了。

下面看个十进制的计数器,是前几天给一个初学者的sample,但愿这小哥真的去看懂了,而不是搞完毕设就完蛋鸟。

module bcd_counter(rst, clk, qout);
    input rst;
    input clk;
    output[7:0] qout;

reg [3:0] low;
    reg [3:0] high;

assign qout ={high,low};

always @(posdge clk)
        if(rst)
            begin
                low <= 4'h0;
                high <= 4'h0;
            end
        else
            begin
                case(low)
                0,1,2,3,4,5,6,7,8:
                    low <= low+4'h1;
                9:
                    begin
                        low <= 4'h0;
                        case(high)
                            0,1,2,3,4,5,6,7,8:
                                high <= high+4'h1;
                            9:
                                high <= 0;
                        endcase
                    end
                endcase
            end
    end module

这里面有2个十进制数据,分别占用一个nibble---4个bit,其实就是BCD码。
使用了case语句来完成,而且两个case还套起来用了,跟C语言一个样,照猫画虎即可。

细心的文艺青年,应该发现了,module的定义貌似跟以前不一样了。
不用貌似,就是不一样了,这是2种风格,其实苦B的C语言也有这个风格的。
bool fun1(X,Y)
int X, Y;
{
}
C语言的古老风格,现在很少人用了,毕竟多敲键盘,不代表多干活。
那时候C语言还没有国际标准,此K&R C是以2个工程师的名字首字母命名的。
后来才有ANSI C和ISO C(C89/C90/C99),这巨人的肩膀好高啊,搞技术就不能有恐高症。

Verilog亦是如此,建议使用输入输出定义在括号里面的风格,至少要少码好几个字母不是。

不知道有没有人注意到,上面几个帖子用的都是always @(posdge clk),敏感信号列表中不见rst的身影。
下面的判断rst的信号,决定复位还是干活,这叫做同步复位。

同步复位,你要理解成rst一有效就复位就错了。同步的含义,与CLK同步,类似于与裆中央保持一致。

异步复位,是立即的。异步复位,同步释放。这个话题就比较远了,后面有个帖子,会专门说这个话题。

4、阻塞和非阻塞

话说大禹治水,因为他老爹治水失败被咔咔了,他不得已去顶缸。
他也琢磨啊,其父也不是等闲之辈,没搞定,说明必须得换个法子,否则自己也得被大哥给嗝屁了。
大禹父子治水,分别用的是阻塞和非阻塞的方法,下面我们就扯一下逻辑电路中的阻塞和非阻塞。

通常所说的阻塞和非阻塞,指的是always块中的语句。
always语句中有时序逻辑,也有组合逻辑。前者用非阻塞,后者用阻塞。
其实“阻塞”这个术语,也是专门给软件出身的电工看的,硬电工才懒得管你阻不阻的呢。

reg[7:0] in1;
    reg[7:0] out;

always @ (posedge clk)
    begin
        in1 <= in1+8'h01;
        out <= in1;
    end
endmodule

先从容易的下刀,我们先看看这个非阻塞的语句,它很简单,就是in1的自身完成一个自加一
注意这个“<=”,是不是又想起了C语言里用来搞指针的“->”,不过真的没有一毛钱的关系。

in1拿到的是clk上升沿之前的“in1”值再加1,跟clk上升沿之后的in1没有关系了。

正如,已毕业的小明的时候对还在读大四GF小芳承诺说,哥等你大学毕业就讨你做LP了。
时光如箭,日月如梭,时间如白驹过隙,学校7月份小芳走出了象牙塔的大学校门。
小明履行承诺,娶小芳为妻。话说,无巧不成书。
小芳大学毕业了,但大三的同学也该升级读大四了,正好里面也有个女娃的名字也叫小芳。
抢答开始,问:小明,娶的是哪个小芳?

答案是,去年读大四今年毕业的那个小芳,而不是去年大三今年大四的那个小芳。
您感觉拗口吗,反正我有点绕口令的感觉了。

非阻塞操作也是这个效果,你娶的是毕业(clk上升沿)之前的那个大四的小芳。

我们知道硬件是并行执行的,所以,上面的代码,这么写,效果一样。
        out <= in1;         //小明娶老婆
        in1 <= in1+8'h01;   //老小芳毕业,新小芳升级大四

但,如果把非阻塞改为阻塞的,那小明娶的老婆,到底是谁?且看分析。
        in1 <= in1+8'h01;   //老小芳毕业,新小芳升级大四
        out <= in1;         //小明娶老婆
所谓阻塞,就是一步一步来,就是写软件的那个思路,小明顺利娶他昔日的恋人为妻。

我们要调整语句顺序了,再看看小明的执行结果咋样
        in1 = in1+8'h01;    //老小芳毕业,新小芳升级大四
        out = in1;          //小明娶老婆

要顺序执行的哦,先完成“老小芳毕业,新小芳升级大四”,然后“小明娶老婆”。
小明娶到了刚刚大三升大四的小芳,你完全可以认定,小明是一个喜新厌旧的文艺青年。

而如果,做下语句的调整,就像下面这样
        out = in1;          //小明娶老婆
        in1 = in1+8'h01;    //老小芳毕业,新小芳升级大四
小明喜新厌旧的企图,被强大的阻塞语句,给堵回去了。

一般用阻塞语句来实现assign语句描述困难的组合逻辑,一般情况下代码块会比较小。
非阻塞的一般是用于时序逻辑,时序逻辑往往比较复杂,有时候复杂得有些变态。
如果月老执行Verilog语句的时候,一不小心,小明就娶错了老婆。

阻塞,有个地方用起来很方便,也许你也猜到了,testbench

tb代码本身,就不被用来综合到电路,所以,可以大胆使用阻塞语句
        #10 rst = 1;
        #10 clk = 0;
        #10 clk = 1;
        #10 clk = 0;
        #10 clk = 1;
        #10 rst = 0;
        repeat(100)
        begin
            #10 clk = 0;
            #10 clk = 1;
        end

这是一段,模拟单片机复位释放以及振荡器启动的激励。
反正是顺序执行的,就拿这写软件的脑袋来理解就够了,估计软电工都喜欢。

跟着我从零开始入门FPGA(一周入门系列)第三天相关推荐

  1. 从零开始搭建一个8位计算机系列(三):利用LM555定时器构建稳定的时钟脉冲

    RS触发器(锁存器),又称SR触发器介绍 RS锁存器分为两种 或非门锁存器 真值表 与非门锁存器 真值表 LM555芯片 芯片结构简图及引脚 1脚是接地的 2脚是作为触发的输入端口 3脚是作为输出的端 ...

  2. 从零开始学习ASP.NET MVC 入门

    <从零开始学习ASP.NET MVC 1.0> 文章导航 (一) 开天辟地入门篇 (二) 识别URL的Routing组件 (三) Controller/Action 深入解析与应用实例 ( ...

  3. 真正从零开始,TensorFlow详细安装入门图文教程!(linux)

    读懂智能&未来 首页 专栏 专题 公开课 AI慕课学院 爱搞机 极客购 申请专栏作者 业界人工智能智能驾驶AI+Fintech未来医疗网络安全AR/VR机器人开发者智能硬件物联网GAIR 业界 ...

  4. TensorFlow 真正从零开始,TensorFlow详细安装入门图文教程

    https://www.leiphone.com/news/201606/ORlQ7uK3TIW8xVGF.html 读懂智能&未来 首页 专栏 专题 公开课 AI慕课学院 爱搞机 极客购 申 ...

  5. 【PaddlePaddle学习笔记】从零开始学习图像分类01——图像处理入门基础

    本系列文章链接 [PaddlePaddle学习笔记]从零开始学习图像分类01--图像处理入门基础 未完待续...... 目录 一.关于图像的几个基本概念 1. 像素及其坐标 2. 图像的四种基本类型 ...

  6. FPGA极易入门教程----汇总篇(直达链接)

    为什么要写这个系列? 根据费曼学习法,最好的学习方法就是教会一个外行人(初学者).知识分享,独乐乐不如众乐乐.现在FPGA市场巨大,人才缺口很大.我本着能拉一个上贼船就拉一个上贼船的想法来写这个系列文 ...

  7. python建站部署_SpringBoot入门建站全系列(三十二)接入xxl-job分布式任务调度平台...

    SpringBoot入门建站全系列(三十二)接入xxl-job分布式任务调度平台 一.概述 XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速.学习简单.轻量级.易扩展.现已开放源 ...

  8. spring boot 入门_SpringBoot入门建站全系列(三十)Mybatis多数据源进行数据库操作

    SpringBoot入门建站全系列(三十)Mybatis多数据源进行数据库操作 一.概述 多数据源,就是有多个数据库的配置. 多数据源配置并不麻烦,使用起来和单数据源基本相同,但是,重要的是事务的控制 ...

  9. Cordova入门系列(三)Cordova插件调用 转发 https://www.cnblogs.com/lishuxue/p/6018416.html...

    Cordova入门系列(三)Cordova插件调用 版权声明:本文为博主原创文章,转载请注明出处 上一章我们介绍了cordova android项目是如何运行的,这一章我们介绍cordova的核心内容 ...

  10. python爬虫入门实战---------一周天气预报爬取_Python爬虫入门实战--------一周天气预报爬取【转载】【没有分析...

    Python爬虫入门实战--------一周天气预报爬取[转载][没有分析 Python爬虫入门实战--------一周天气预报爬取[转载][没有分析] 来源:https://blog.csdn.ne ...

最新文章

  1. 教你如何运用可视化理解卷积神经网络(CNNs)的指南
  2. /proc文件夹介绍
  3. 【转】linux tar.gz zip 解压缩 压缩命令
  4. 使用remi安装php70,Linux下使用yum安装LNMP环境
  5. python平台软件下载_Thonny(免费Python编程学习平台)V3.3.1 最新版
  6. oracle执行外部sql_增强的PolyBase SQL 2019-Oracle DB的外部表
  7. 网络通信框架 HP-Socket v5.5.1,支持可靠 UDP
  8. 蓝牙BT射频测试(转发)
  9. Killer Names( 容斥定理,快速幂 )
  10. python笔记本电脑推荐2020_最新版:2020年适合程序员的推荐笔记本电脑
  11. 杭漂多年是时候画个句号呢
  12. python中将数字转换为字符串
  13. 重启oracle服务后无法连接,解决oracle服务器重启之后连接报错的问题
  14. 《设计模式之禅》-策略模式
  15. JDK的下载,安装与配置(Win10安装方法)
  16. 【重读.转】黑客帝国中的佛法义理
  17. Python+PySide2:Label 插入动态GIF图片
  18. hrbust 1424 哈理工oj 1424 Hrbust的校车【水题】【思维】
  19. 黄峥解读巴菲特:把资本主义倒过来
  20. 《钻哥学管理之开启篇:技术+业务+管理》(Yanlz+Unity+SteamVR+云技术+5G+AI=VR云游戏=技术+业务+管理+使命必达+DF17+立钻哥哥+==)

热门文章

  1. 每个人都会经历一段迷茫
  2. 链接、图像、列表、计数器
  3. 推荐书单——不定时更新
  4. matlab零极点图程序,Matlab绘制数字滤波器零极点图
  5. admin是谁,以及如何修改admin密码
  6. 心理很难受,无法平静!
  7. 免费图片素材网站收集
  8. 强制关闭计算机窗口,windows系统怎么取消关机时强制关闭程序提示窗口?
  9. 升级iOS13后悔怎么办?手把手教你iOS系统降级,只要简单几步就可以!
  10. uniapp封装方法