verilog task1

Posted hippomyl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了verilog task1相关的知识,希望对你有一定的参考价值。

问题描述:

  设计中需要重复多次施加一种激励,每一次激励的施加过程,都可以划分为4个部分,如图所示。

技术分享

  每一次施加的激励只有第二部分的数据有变化(数据格式无变化)。所以顶层的Testbench代码如下:

 1 reg [4:0]    j;
 2     task bian_chen;
 3         begin
 4             for(j=0;j<=27;j=j+1)begin
 5                 initial_task();
 6                 send_weiliu(j);
 7                 latch_weiliu();
 8                 shaolu();
 9             end    
10         end
11     endtask

  第二部分中有90位数据需要发送,首先申明变量存储数据,如下所述:

1     reg [90:0] TDI_REG [0:27];
2     initial begin
3         $readmemb("weiliu.dat",TDI_REG);
4     end

  第二部分数据发送的具体实现,如下所示:

 1  task send_weiliu;
 2         input [4:0] num;
 3         begin
 4             fork
 5                 TCK_gen();
 6                 TDI_weiliu(num);
 7             join
 8         end
 9     endtask
10     
11     task TCK_gen;
12     begin
13         TCK = 1b0;
14         repeat(182) #5 TCK = ~TCK;
15         #5 TCK = 1b0;
16     end
17     endtask
18     
19     reg [6:0] i;
20     task TDI_weiliu;
21         input [4:0] n;    
22         begin
23             for(i=90;i>=0;i=i-1)begin
24                 @(negedge TCK);
25                 TDI = TDI_REG[n][i];
26             end
27         end
28     endtask

说明:

  1)位流数据在时钟上升沿被采样进入编程链寄存器中,所以需要在时钟下降沿处产生好要发送的数据。(见代码24行25行。)

  2)由于编程链是按照D01到D90的顺序串接的,所以最高的D90的位流数据应该最先发送。

  3)由于数据先要在下降沿产生,再在下一个上升沿到来时被采样,所以产生的TCK的数目为182,而非180。同时在TCK的第一次上升延处,由于TDI数据是无效的(还没产生),所以位流文件也要额外的附加一位,位流文件是91位,最高位第91位时无效的。下面通过一个简单时序波形理解这种情形。如下图:

技术分享

                    图2-1

图2-1中,要发送8位数据D8-D1,TCK信号需要翻转2x8+2=18次,第一个上升沿发送无效数据,第一个下降沿处,产生数据D8。

仿真结果:

技术分享

上图所示,为多28次数据发送过程的仿真波形图。

技术分享

上图所示,为多每一次数据发送过程的仿真波形图。

总结:

1.用verilog 写Testbench时,本文介绍的,数据的发送过程中TDI、TCk的产生方式值得借鉴。如在模拟键盘的时钟与数据时可以用到。

  fork
    TCK_gen();
    TDI_weiliu(num);
   join

2.熟悉了for 循环处理重复性工作的用法,特别是语法。


 

以上是关于verilog task1的主要内容,如果未能解决你的问题,请参考以下文章

IFE_part1(task1-7)_blog.html总结

百度前端技术学院-task1.3源代码

百度前端技术学院-task1.10源代码

百度前端技术学院-task1.8源代码以及个人总结

如何使用 Icarus Verilog 在 Verilog 中转换 VHDL 代码?

求一个用verilog实现二分之一分频(是提高频率,不是降低频率)的代码