练习三:利用条件语句实现计数分频时序电路

一、实验目的

  1. 掌握条件语句在简单时序模块设计中的使用;
  2. 学习在Verilog模块中应用计数器;
  3. 学习测试模块的编写、综合和不同层次的仿真。

 

二、实验原理

与常用的高级程序语言一样,为了描述较为复杂的时序关系,Verilog HDL提供了条件语句供分支判断时使用。在可综合风格的Verilg HDL模型中,常用的条件语句有 if…else 和 case…endcase 两种结构,用法和C程序语言中类似。两者相比 if…else 用于不很复杂的分支关系,实际编写可综合风格的模块,特别是用状态机构成的模块时,更常用的是case…endcase风格的代码。这一节给的是有关 if…else 的范例,有关case…endcase结构的代码以后会经常用到。

       在Verilog HDL中,相对于组合逻辑电路,可综合成具体电路结构的时序逻辑电路也有标准的表述方式。在可综合的Verilog HDL模型,通常使用always块和@ (posedge clk)或@ (negedge clk)的结构来表述时序逻辑。

       下面给出的范例也是一个可综合风格的分频器,可将10MHz的时钟分频为500kHz的时钟,基本原理与1/2分频器是一样的,但是需要定义一个计数器,以便准确获得1/20分频。

模块源代码:
//-------------- fdivision.v --------------
module fdivision(RESET,F10M,F500K);
  input         F10M,RESET;
  output        F500K;
  reg           F500K;
  reg     [7:0] j;
  always @(posedge F10M)
    if(!RESET)
      begin
        F500K<=0;
        j<=0;
      end
    else
      begin
        if(j==19)
          begin
            j<=j+1;
            F500K<=~F500K;
          end
        else
          j<=j+1;
      end
endmodule


测试模块源代码:
//-------------- fdivision_Top.v  --------------
`timescale  1ns/100ps
`define     clk_cycle 50
`include    "./fdivision.v"
module fdivision_Top;
  reg   RESET,F10M_clk;
  wire  F500K_clk;
  
  always  #`clk_cycle F10M_clk=~F10M_clk;
  
  initial
  begin
    RESET=1;
    F10M_clk=0;
    #100    RESET=0;
    #100    RESET=1;
    #10000  $stop;
  end
  
  fdivision fd(.RESET(RESET),.F10M(F10M_clk),.F500K(F500K_clk));
  
endmodule

计数分频器的仿真波形如下图所示:

 

三、实验要求及实验内容

(1)实验内容:

         利用10MHz的时钟,设计一个单周期形状的周期波形。

(2)实验代码:

模块源代码:
//-------------- fdivision.v --------------
module fdivision(RESET,F10M,F500K);
  input         F10M,RESET;
  output        F500K;
  reg           F500K;
  reg     [7:0] j;
  always @(posedge F10M)
    if(!RESET)
      begin
        F500K<=0;
        j<=0;
      end
    else
      begin
        if(j==19)
          begin
            j<=j+1;
            F500K<=~F500K;
          end
        else if(j==29)
          begin
            j<=j+1;
            F500K<=~F500K;
          end
        else if(j==49)
          begin
            j<=0;
            F500K<=0;
          end
        else
          j<=j+1;
      end
endmodule


测试模块源代码:
//-------------- fdivision_Top.v --------------
`timescale  1ns/100ps
`define     clk_cycle 50
`include    "./fdivision.v"
module fdivision_Top;
  reg   RESET,F10M_clk;
  wire  F500K_clk;
  
  always  #`clk_cycle F10M_clk=~F10M_clk;
  
  initial
  begin
    RESET=1;
    F10M_clk=0;
    #100    RESET=0;
    #100    RESET=1;
    #10000  $stop;
  end
  
  fdivision fd(.RESET(RESET),.F10M(F10M_clk),.F500K(F500K_clk));
  
endmodule

 

四、实验结果

(1)目标波形

(2)实验波形

 

  • 9
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星羽空间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值