Verilog学习笔记简单功能实现...............计数分频电路

Posted SYoong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Verilog学习笔记简单功能实现...............计数分频电路相关的知识,希望对你有一定的参考价值。

在分频器电路中最重要的概念有两个;1)奇分频/偶分频;2)占空比。

A)其中最简单的就是二分频电路,占空比为50%,其Verilog程序为

 1 module half_clk(clr,clk_in,clk_out,out2);
 2   input clr,clk_in;
 3   output clk_out,out2; 
 4   reg clk_out,out2;
 5   
 6   always @(posedge clk_in)
 7   begin
 8   if (clr==0) begin clk_out=0; out2=1;end
 9     else begin clk_out<=~clk_out; out2=~out2;end
10   end
11 endmodule 

波形图如下所示:

 

B)采用计数器实现计数分频(偶数)占空比为50%,如实现40分频,程序如下:

 1 module fdivision(rst,clkin,clkout);
 2   input rst,clkin;
 3   output clkout;
 4   reg clkout;
 5   reg [4:0]i;
 6   always @(posedge clkin)
 7   begin
 8   if(!rst) begin clkout<=0; i<=0;end
 9     else begin
10          if(i==19)
11            begin clkout<=~clkout;i<=0;end
12            else
13           i<=i+1;
14          end
15   end
16 endmodule 

波形图:

 

C)采用相与/相或的方式实现奇分频,以及占空比可调分频器;如5分频,占空比分别为50%,40%

 1 module fdivision5(clkin,clkout);
 2   input  clkin;
 3   output clkout;
 4   wire clkout;
 5   reg [2:0]step,step1;
 6   always @(posedge clkin)
 7   begin
 8     case(step)
 9       3\'b000:step<=3\'b010;
10       3\'b010:step<=3\'b100;
11       3\'b100:step<=3\'b001;
12       3\'b001:step<=3\'b011;
13       3\'b011:step<=3\'b000;
14       default step<=3\'b000;
15     endcase
16   end
17   always @(negedge clkin)
18   begin
19   case(step1)
20       3\'b000:step1<=3\'b010;
21       3\'b010:step1<=3\'b100;
22       3\'b100:step1<=3\'b001;
23       3\'b001:step1<=3\'b011;
24       3\'b011:step1<=3\'b000;
25       default step1<=3\'b000;
26     endcase
27   end
28   assign clkout=(step[0]|step1[0]);
29 endmodule

顶层文件(testbench):

 1 `timescale 1ns/1ns
 2 `define half_period 20
 3 module fdivision5_test;
 4   reg  clkin;
 5   wire clkout;
 6   wire step,step1;
 7   initial
 8   begin
 9   clkin=0;
10   end
11   always #`half_period clkin=~clkin;
12   fdivision5 m(clkin,clkout);
13   assign step=m.step;
14   assign step1=m.step1;
15 endmodule

波形图:

 

也可以采用两个计数器分别对上升沿和下降沿进行计数来实现奇分频:

 

module div5(clkin,clkout,rst);
  input clkin,rst;
  output clkout;

  parameter N=5;
  wire clk1,clk2;
  reg [2:0]cnt1,cnt2;

  always @(posedge clkin or negedge rst)
  if (!rst) cnt1<=0;
  else if(cnt1<(N-1)) cnt1<=cnt1+1;
       else cnt1<=0;

  always @(negedge clkin or negedge rst)
  if (!rst) cnt2<=0;
  else if(cnt2<(N-1)) cnt2<=cnt2+1;
       else cnt2<=0;

  assign clk1=(cnt1<=((N-1)/2))?1\'b1:1\'b0;
  assign clk2=(cnt2<=((N-1)/2))?1\'b1:1\'b0;
  assign clkout=clk1&clk2;
endmodule

 

其testbench为:

`timescale 10ns/1ns
`define period 2
module div5_test;
  reg clkin,rst;
  wire clkout;
  wire clk1,clk2;
  
  initial 
  begin
  clkin=0;
  rst=1;
  #5 rst=0;
  #55 rst=1;
  end
always #`period clkin=~clkin;
assign clk1=m.clk1;
assign clk2=m.clk2;

div5 m(clkin,clkout,rst);

endmodule

 

波形图为:

以上是关于Verilog学习笔记简单功能实现...............计数分频电路的主要内容,如果未能解决你的问题,请参考以下文章

Verilog学习笔记简单功能实现...............译码器和编码器

Verilog学习笔记基本语法篇········ 编译预处理

FPGA/verilog 学习笔记—— verilog程序框架

Verilog学习笔记设计和验证篇...............同步有限状态机的指导原则

verilog学习笔记 vivado 仿真小例子

Verilog学习笔记设计和验证篇...............层次化事件队列