zoukankan      html  css  js  c++  java
  • 【连载】【FPGA黑金开发板】Verilog HDL那些事儿倾向并行操作(三)

    声明:本文为原创作品,版权归akuei2及黑金动力社区共同所有,如需转载,请注明出处http://www.cnblogs.com/kingst/

    P7302370_thumb

    2.2 倾向并行操作

    在2.1 章理解了 "顺序操作" 和 “并行操作”的区别之后,这一章我们要讨论并且习惯 “并行操作” 的思考。

    clip_image002

    上图是一个组合模块,里边包含了两个功能模块。一是对闪耀灯控制的功能模块,二是对流水灯控制的功能模块。假设我要利用“顺序操作”实现如图的功能模块。实际上是怎样的一个效果呢?

    我们以“C语言”作为“顺序操作”的代表,来分析一下过程。.

    While ( 1 ) //大循环

    {

    Flash_Funct(); //闪耀功能模块

    Run_Funct(); //流水灯功能模块

    }

    如果按照上面的代码,程序一开始就会先执行闪耀功能模块( Flash_Funct() ),然后再执行流水灯功能模块( Run_Funct() )。但是在现实中,由于控制器的扫描速度很快快,使得人类的肉眼看到错觉“两个模块并行执行着”。事实上,无论控制器的扫描速度怎么快,也是会存在着“上一步延迟”。

    亦即 Run_Funct() 要执行前,必须等待 Flash_Funct() 执行完毕,Flash_Funct() 要重复执行,必须等待 Run_Funct() 执行完毕。 除此之外,在“理解上”,人类的思维也非常习惯化的以“顺序”的方式去理解上面的代码。

    1. 执行 Flash_Funct();

    2. 执行 Run_Funct();

    3. 重复步骤1.

    如此一来我们明白了一个道理,“顺序操作”不能满足上图组合模块的功能要求。

    module top_module ( ...... );

    flash_module U1 //功能模块1实例化

    (

    ......

    );

    run_module U2 //功能模块2实例化

    (

    ......

    );

    endmodule

    上面内容是Verilog HDL语言的实例化过程。在建立实例 U1 和 U2,我们只要确保连接正确而已。在前面说过 "并行操作" 的功能模块都是独立执行。在“设计上”,编辑 flash_module 和 run_module 的工作都是“分开进行”,而在“理解上”两个实例都是 “独立执行”。

    换一句话说,上图的组合模块非常适合使用“并行操作”来建模。不同于“顺序操作”,要实现上图的组合模块,除非依靠“高频扫描”或者“任务调度程序”以外,但是无论怎么“依靠”什么,都不是真正意义上的“并行操作”。

    实验二:闪耀灯和流水灯

    clip_image004

    功能模块

    执行频率

    资源占用

    闪耀灯功能模块

    flash_module.v

    10hz

    (100ms)

    一位LED

    流水灯功能模块

    run_module.v

    3.3Hz

    (300ms)

    三位LED

    实验二主要是建立如上图的功能模块。乘着这个实验的时机,来解释一下,一个长久以来美丽的误会。

    扫描频率?闪耀频率?

    clip_image006

    闪耀频率是指一个LED开和关说的周期时间。实验二中的 flash_module 所制定的输出如上。

    clip_image008

    扫描频率是指一次完成流水灯动作所的时间周期。实验二中的 run_module 所制定的扫描输出如上。

    回忆以前,记得我在入门单片机的时候,实现的流水灯实验,可能是入门的关系吧?我过分在乎肉眼中所看到的效果,而忘记了这些重要的信息。估计很多人也是吧?但是经过前面2.1章和2.2章的实验创作,要我明白“小小的实验,大大的道理”的道理。原来流水灯实验,不仅是经典,而且包含了很多的知识。有时候做人太注重着外面的世界,不小心之间忘记了心里的世界。

    实验二源码:

    clip_image010

    clip_image012

    clip_image013

    clip_image015

    clip_image016

    实验二完成框图:

    clip_image018

    实验二说明:

    注意: 详细信息请参考 “./Experiment02” 下的原项目。建模过程请参考 建模视频 “video_exp02” 。配置过程请参考 “实验二配置”

    flash_module.v 是一个10hz,50%占空比输出的功能模块。说得简单点就是定时开关...

    代码比较简单。

    run_module.v 是一个3.3hz扫描频率的流水灯,采用“控制模块”形式编写。16~24行是1ms的计数器。28~36行是基于count1的100ms的计数器。40~52行是3Bit的移位操作,45行表示每间隔100微妙发生一次移位操作。48行,判断移位末期。而51行是移位的代码。

    mix_module.v 是组合模块,代码很容易明白。自己看着明白吧。

    实验二结论:

    无论是实验二结果,还是理解上的思维,或者设计上的方向。“并行操作”完全符合实验二的要求。所以:

    思维倾向“并行操作”对,VerilogHDL + FPGA理解或者设计是非常重要。

    实验二配置

    黑金版的FPGA型号:CYCLONE II EP2C8Q208C8

    clip_image002

    包含的.v文件如上图。

    clip_image004

    编译成功后产生的层次关系。

    clip_image006

    引脚配置(资源和实验一一样)

  • 相关阅读:
    利用Mono.Cecil动态修改程序集来破解商业组件(仅用于研究学习) 转 武胜
    探讨C语言中的回调函数
    BusyBox
    ISC的DHCP服务器
    exchange 2007 安装
    strcpy和memcpy的区别 | strcpy和strncpy的区别
    爱不是什么
    编译libnl时候的问题
    Linux中find常见用法示例
    ubuntu firefox flash 插件安装
  • 原文地址:https://www.cnblogs.com/kingst/p/1811795.html
Copyright © 2011-2022 走看看