原创 [Verilog HDL 建模技巧 :低级建模 仿顺序操作·思路篇] 9 - 建立“低级功能模块”

2010-6-5 16:49 2685 3 3 分类: FPGA/CPLD

4.1建立2个“低级功能模块”


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

 

“ 自左向右循环3次,自右向左循环5次,然后自左向右一次,自右向左一次,然后自左向右循环30 ”


 


假设这是实验的要求首先我们先建立两个“低级功能模块”。一个名为flashing_to_left 和 flashing_to_right 


 


1.module flashing_to_right


2(


3.    CLK, RSTn,


4.    Start_Sig, Done_Sig,


5.    Q


6.);


7.


8.    input  CLK;


9.    input  RSTn;


10.    input  Start_Sig;


11.    output Done_Sig;


12.    output [7:0]Q;


13.    


14.    /***********************************/


15.    


16.    parameter DELAY = 8'd200;


17.    


18.    /***********************************/


19.    


20.    reg [7:0]Counter;


21.    


22.    always @ ( posedge CLK or negedge RSTn )


23.        if( !RSTn )


24.            Counter <= 8'd0;


25.        else if( Counter == DELAY )


26.            Counter <= 8'd0;


27.        else if( Start_Sig )


28.            Counter <= Counter + 1'b1;


29.        else


30.            Counter <= 8'd0;


31.                       


32.    /***************************************/


33.    


34.    reg [3:0]i; 


35.    reg [7:0]rData;


36.    reg isDone;


37.    


38.    always @ ( posedge CLK or negedge RSTn )


39.        if( !RSTn )


40.            begin 


41.                i <= 4'd0;


42.                isDone <= 1'b0;


43.                rData <= 8'dx;     


44.            end


45.        else if( Start_Sig )


46.            case( i )


47.        


48.                4'd0 :


49.                begin rData <= 8'dx; i <= i + 1'b1; end


50.


51.                4'd1, 4'd2, 4'd3, 4'd4, 4'd5, 4'd6, 4'd7, 4'd8 : 


52.                if( Counter == DELAY ) i <= i + 1'b1;


53.                else rData <= ( 8'h80 >> i - 1 );


54.


55.                4'd9 :


56.                begin i <= 4'd10; isDone <= 1'b1; end 


57.


58.                4'd10 :


59.                begin i <= 4'd0; isDone <= 1'b0; end


60.


61.            endcase


62.


63.    


64.    /**********************************/


65.


66.    assign Done_Sig = isDone;


67.    assign Q = ( i > 0 && i < 9 ) ? rData : 8'dx;


68.    


69.    /**********************************/


70.


71.endmodule




 


 


1.module flashing_to_left


2.(


3.    CLK, RSTn,


4.    Start_Sig, Done_Sig,


5.    Q


6.);


7.


8.     input  CLK;


9.     input  RSTn;


10.    input  Start_Sig;


11.    output Done_Sig;


12.    output [7:0]Q;


13.    


14.    /***********************************/


15.    


16.    parameter DELAY = 8'd200;


17.    


18.    /***********************************/


19.    


20.    reg [7:0]Counter;


21.    


22.    always @ ( posedge CLK or negedge RSTn )


23.        if( !RSTn )


24.            Counter <= 8'd0;


25.        else if( Counter == DELAY )


26.            Counter <= 8'd0;


27.        else if( Start_Sig )


28.            Counter <= Counter + 1'b1;


29.        else


30.            Counter <= 8'd0;


31.                       


32.    /***************************************/


33.    


34.    reg [3:0]i; 


35.    reg [7:0]rData;


36.    reg isDone;


37.    


38.    always @ ( posedge CLK or negedge RSTn )


39.        if( !RSTn )


40.            begin 


41.                i <= 4'd0;


42.                isDone <= 1'b0;


43.                rData <= 8'dx;     


44.            end


45.        else if( Start_Sig )


46.            case( i )


47.        


48.                4'd0 :


49.                begin rData <= 8'dx; i <= i + 1'b1; end


50.


51.                4'd1, 4'd2, 4'd3, 4'd4, 4'd5, 4'd6, 4'd7, 4'd8 : 


52.                if( Counter == DELAY ) i <= i + 1'b1;


53.                else rData <= ( 8'h01 << i - 1 );


54.


55.                4'd9 :


56.                begin i <= 4'd10; isDone <= 1'b1; end 


57.


58.                4'd10 :


59.                begin i <= 4'd0; isDone <= 1'b0; end


60.


61.            endcase


62.    


63.    /**********************************/


64.


65.    assign Done_Sig = isDone;


66.    assign Q = ( i > 0 && i < 9 ) ? rData : 8'dx;


67.    


68.    /**********************************/


69.


70.endmodule



 


 


两个模块几乎是一模一样,不同的地方只是在 53行而已。虽然代码都很简单,但是还是稍微关心 45 ~ 61 行的代码,因为是功能的核心部分。正如模板结构般,在第45行,如果Start_Sig 不处于高电平,那么该模块根本无法执行功能。计数寄存器i使用与指向下一个步骤,正如在第49行,当rData 被初始化过后,i指向下一个步骤。


 


51行到53行之间,是移位操作,每一次的移位动作都需要200个时钟周期。移位操作一共有8个步骤。最后该模块产生一个“高脉冲”以表示“完成”,然而i也被复位为0


 


仿真效果如下


点击看大图


(第一行是输出Q,第二行是Start_Sig,第三行是完成信号)


 




 ( 最后一行是完成信号 )


dbc4e2e6-fa71-46aa-8cdd-9c8d94da7a39.jpg



 


注意最后一行,当计数从1~8过后,就产生一个完成信号,而完成信号需要两个时钟周期的时间。


完成创建2个“低级功能模块”以后,为了使日后调用方便,必须封装起来。“低级功能模块”的封装工作会比较麻烦,因为“低级功能模块”有“复用连线”的现象,换一句话说,会出现“两义性”或者“多义性”的问题 ......

文章评论0条评论)

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