查看: 2099|回复: 0

【小脚丫STEP-MXO2】学习1 ——阻塞赋值与非阻塞赋值

[复制链接]
  • TA的每日心情

    2017-12-13 09:01
  • 签到天数: 152 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2016-12-6 09:00:19 | 显示全部楼层 |阅读模式
    分享到:

    • 前几天收到了小脚丫STEP-MXO2开发板,拿到手之后发现这个板子真的是很迷你。之前看的是图片,见到实物之后才发现是如此的精致。板子的做工看起来就不错。小脚丫二代增加了板载的下载器以及一些功能外设,二代同时保持了一代的身材,板卡尺寸为52mm X 18mm,依然小巧精致(引用)。板子到手了,肯定得一番“折腾”。先上几张图看看。
    板子大小就是这么大,是不是很迷你。不过板子虽小,五脏俱全。性能强悍就看怎么发挥了。
    关于板子的基本介绍这里不再多说,详细可看https://www.eeboard.com/evaluation/step-mxo2gen2-2/

    • 板子还没到手之前我就已经把开发环境弄好,可以参考https://www.eeboard.com/bbs/thread-44647-1-1.html。软件的使用和Quartus差不多,FPGA的开发流程大同小异。找了相关的资料大体看了一下,芯片手册没有中文的,看英文费时间啊。跑了个流水灯程序算是对软件使用入门了。在这个网址https://stepfpga.ecbcamp.com/doc/fpga%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8有一些FPGA的入门教程,也有相关的例程,有兴趣的可以自己阅读。
    • 下面以简单的代码示例来说明一下阻塞赋值和非阻塞赋值的区别。
           阻塞赋值模块代码:      
    module D1( input clk,input D_in, output reg D_out1,output reg D_out2);always@(posedge clk)begin        D_out1 = D_in;        D_out2 = D_out1;        endendmodule代码很简单,2-5行是端口声明,6-10行是always语句块。我们来看一下生成的RTL图:


           非阻塞赋值模块代码:   
    module D1( input clk,input D_in, output reg D_out1,output reg D_out2);always@(posedge clk)begin        D_out1 <= D_in;        D_out2 <= D_out1;        endendmodule生成的RTL图:

    使用非阻塞赋值生成的是两个串联的D触发器,使用阻塞赋值在Quartus里仿真是两个并联的D触发器,两个输出都是只与输入有关;

                                                    Quarturs II下阻塞赋值的RTL图
    所以在lattice Diamond被综合成一个触发器了,只是引了两个输出端,和上图的输出结果是一样的。

    • 通过RTL图可以看到阻塞赋值(=)语句是顺序执行的,前面的语句没有完成之前,后面的语句不能报被执行,仿佛被阻塞了一样。这种一般用于逻辑组合电路。在上面的图可以看到两个输出是同步的。
    • 非阻塞赋值(<=)是并行执行的,所有赋值是在所在块语句结束之后才赋值。一般用于时序逻辑电路。而且非阻塞赋值只能用于寄存器赋值。在非阻塞赋值的RTL图可以看出D_out2输出要比D_out1落后一个时钟。


    • 最后用分频器加上面的代码下载到板子上,用LED作输出,直观的的去表现。可以看到在非阻塞赋值的情况下,led2要比led1落后一个时钟。最终分频是1Hz。

                                    非阻塞赋值测试

                                    阻塞赋值测试


    • 再上面的GIF动画中可以看到,在按下key1 按键时,阻塞赋值在时钟上升沿两个数据同时输出,也就是led同时灭;非阻塞赋值是在led1灭后led2才灭。在此之前先把两个灯都弄量。拨码开关1向下,按住key1不放。然后拨码开关1向上,再按住key1即可看到现象。
    • module D1(input  clk,input D_in,input reset,input  clk_div_in,output reg D_out1,output reg D_out2,output reg clk_div);reg [31:0] cnt; always@(posedge clk or posedge reset)begin        if(reset)                begin                        cnt<=0;                        clk_div<=0;                end        else                 begin                        if(cnt==6000000)                        begin                                clk_div<=!clk_div;                                cnt<=0;                        end                        else                                 cnt<=cnt+1;                        endendalways@(posedge clk_div_in)begin        D_out1 <= D_in;        D_out2 <= D_out1;        endendmodule
    • 这里说明一下为什么刚才是在按下key1才开始分频,因为在上面Verilog语句中的第8行,如果reset为1的话就复位为0,无输出,而板子上按键默认连接的是高电平。所以要按下key1使reset为0,开始分频输出。
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-11-18 20:46 , Processed in 0.122650 second(s), 18 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.