首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Verilog HDL设计练习进阶(三)

Verilog HDL设计练习进阶(三)

练习三. 利用条件语句实现较复杂的时序逻辑电路目的:掌握条件语句在Verilog HDL中的使用。
与常用的高级程序语言一样,为了描述较为复杂的时序关系,Verilog HDL提供了条件语句供分支判断时使用。在可综合风格的Verilog HDL模型中常用的条件语句有if…else和case…endcase两种结构,用法和C程序语言中类似。两者相较,if…else用于不很复杂的分支关系,实际编写可综合风格的模块、特别是用状态机构成的模块时,更常用的是case…endcase风格的代码。这一节我们给的是有关if…else的范例,有关case…endcase结构的代码已后会经常用到。
下面给出的范例也是一个可综合风格的分频器,是将10M的时钟分频为500K的时钟。基本原理与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)      //对计数器进行判断,以确定F500K信号是否反转。
          begin
            j <= 0;
            F500K <= ~F500K;
          end
        else
          j <= j+1;
      end
endmodule
测试模块源代码:
//---------------  fdivision_Top.v ------------------------
`timescale 1ns/100ps
`define clk_cycle 50
module division_Top;
reg F10M_clk,RESET;
wire  F500K_clk;
always #`clk_cycle   F10M_clk  =  ~ F10M_clk;
initial
  begin
RESET=1;
F10M=0;
#100 RESET=0;
#100 RESET=1;
#10000 $stop;
  end
fdivision fdivision (.RESET(RESET),.F10M(F10M_clk),.F500K(F500K_clk));
endmodule
仿真波形:[[wysiwyg_imageupload:245:]]
练习:利用10M的时钟,设计一个单周期形状如下的周期波形。[[wysiwyg_imageupload:246:]]
记录学习中的点点滴滴,让每一天过的更加有意义!
返回列表