原创 [Verilog HDL 建模技巧 :低级建模 仿顺序操作 · 思路篇] 3 - 低级建模的思路

2010-6-4 19:21 3927 7 8 分类: FPGA/CPLD

1“低级建模”的思路


<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 


首先,我将用一个简单的例子来说明一下,“低级建模”的最基本思路:



(一)利用C语言驱动八位发光二极管:


 


8d556145-fa4a-4fb8-a8bf-874d086f1a52.jpg             


(如果我说C语言和单片机是形影不离的哈,估计没有人会反对吧?


 


我们以流水灯作为例子,因为它是最经典的实验。假设我要实现流水灯效果,那么我只要建立一个简单的“流水灯函数”函数,“Flashing”。


 


 void Flashing(){ ...... }  


 


27ce8e29-6ad5-4d5b-83ae-6b6fd1f39b7b.jpg


 




如果要实现自左向右或者自右向左发光的流水灯,可以使用C语言创建两个简单的函数,Flashing_To_Right”和“Flashing_To_Left”。


 


   void Flashing_To_Right() { ...... }


void Flashing_To_Left() { ...... }


 


 


假设我要实现流水灯效果:



1. 永远自右向左发亮。


2. 永远自左向右发亮。


3. 流水灯永远跑来跑去。


 


那么可以这样写:


 



    while( 1 ) { Flashing_To_Left(); } //1


    while( 1 ) { Flashing_To_Left(); } //2


while( 1 ) { Flashing_To_Left(); Flashing_To_Right(); } //3


 

 


对于C语言来说,这些任务都非常的简单。几乎是入门级的实验,但是将这些实验带入到V语言的环境下。确实一个记得思考的问题。


 


(二)利用V语言驱动八位发光二极管:


 


我们先看一段非常傻瓜的一段代码:


 


 


    module Flashing ( CLK, RSTn, Data_Out );


    


    input CLK, RSTn;


    output [7:0]Data_Out;


    


reg [7:0]Counter;


 


always @ ( posedge CLK or negedge RSTn )


    if( !RSTn )


        Counter <= 8'd0;


    else if( Counter == 200 )


        Counter <= 8'd0;


    else


        Counter <= Counter + 1'b1;


 


reg [7:0]i;


 

always @ ( posedge CLK or negedge RSTn )


     if( !RSTn )


        i <= 8'd0;


     else if( Counter == 200 )


        i <= i + 1'b1;


     else if( i == 8 )


        i <= 8'd0


 



reg [7:0]rData;


 

always @ ( posedge CLK or negedge RSTn )


    if( !RSTn )


        rData <= 8'b0000_0001;


    else if( i < 8 )


        rData <= { rData[6:0], 1'b0 };


    else if( i == 8 )


        rData <= 8'b0000_0001;


 


assign Data_Out = rData;


 


endmodule


 


 


没错,上面是实现流水灯的代码。如果我说我要求:“ 自左向右循环3次,自右向左循环5次,然后自左向右一次,自右向左一次,然后自左向右循环30 ”。当你听到这样的要求,你可能会崩溃.... 如果按照上面的写法,你会写得很长很长。


 


相比之下,C语言要实现以上的要求,根本就是“小儿科”的功夫。


 


 


    int i;



    for( i = 0; i < 3; i++ ) Flashing_To_Right();


    for( i = 0; i < 3; i++ ) Flashing_To_Left();



    Flashing_To_Right();


    Flashing_To_Left();



for( i = 0; i < 30; i++ ) Flashing_To_Right();


 


 


给自己5分钟的思考,想想我到底要表达什么?


 


C语言上,有“顺序操作”或者“泛型编程”的概念。从上述的代码中,for循环利用i变量,控制循环次数,然后调用3次“Flashing_To_Right()”函数。相反的V语言是“并行操作”的概念,类似的方法完全行不通。这就是新手们常常遇到的问题。


 


方法行不通,但是不代表思路不行。“低级建模”最基本的思路就是“仿顺序操作”。“低级建模”不是什么困难的东西,它只是一中的“手段”而已,只要你了解它的基本构思,它会成为很有用的工具。


PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户1373959 2010-6-4 21:48

鼓励一下。
相关推荐阅读
用户1609127 2011-10-22 18:26
Verilog的私私细语 - 时钟化和信号的长度
目录 第2章 时钟化和信号的长度 2.01 一个时钟一块数据的概念 2.02 信号时钟化 2.03 深入了解模块的沟通 2.04 电平检测模块的整合(即时事件在时序上的不和谐)      实验八:电...
用户1609127 2011-09-08 12:47
瞎搞Time Quest 和无责任的笔记 第二章
最近整合篇的第二章的构思和灵感都累积不少了,应该是时候开工了。恰好手头上还有一本笔记还没有写完,就是这本瞎搞TimeQuest的第二章。目录笔者也懒得贴了,看过第一章的同学多少也会猜到第二章的内容是什...
用户1609127 2011-08-29 18:21
瞎搞Time Quest 和无责任的笔记 第一章
哎呀 ... 潜水了都有一段时间了,这是最近研究的成果和目标。 话说TimeQuest这个东西真的很搞怪呀,做得笔者不得不从其他的方向去研究它。 好了还是切入正题,TimeQuest用作静态时序的工具...
用户1609127 2011-07-06 17:43
Verilog的私私细语 - 整合的概念
目录         02  第1章  整合的概念          1.01  源码上的整合                   实验一:字面上的整合          1.02  时钟和步骤的定...
用户1609127 2011-06-22 10:18
VerilogHDL那些事儿 - 建模篇v4 + 时序篇v1
VerilogHDL那些事儿 - 建模篇v4 ====== v4 ====== 主要是修改了大量用法上的BUG和极限的精简内容 https://docs.google.com/leaf?id=0B...
用户1609127 2011-06-10 13:19
Verilog HDL的礼物 - Verilog HDL扫盲文
目录 02第0章 Verilog HDL语言扫盲文 030.01 各种的HDL语言 030.02 HDL语言的层次 03 0.03 RTL级和组合逻辑级 040.04 Verilog HDL语言真的那...
EE直播间
更多
我要评论
1
7
关闭 站长推荐上一条 /3 下一条