计数器实现七分频

七分频,即将输入信号的频率变为原来的七分之一,本文用计数器实现输入信号的七分频

一、画出七分频的时序逻辑

在这里插入图片描述

实现原理:

  1. 图中用到了两个计数器,一个上升沿触发一个下降沿触发。且每当计数器从0计数到6时,复位。
  2. 中间信号sig1、sig2分别在cnt1、cnt2等于1-4时为高电平
  3. 这样,把sig1和sig2两个信号相与,就能得到一个频率为clk/7 的输出信号div_7。
    七分频就这样实现了

二、用verilog描述以上逻辑

1. 两个计数器的描述

reg [7:0] cnt1;
reg [7:0] cnt2;
//定义一个时钟从0到6 上升沿
always @(posedge clk or negedge rst_n) begin
  if(~rst_n)begin
    cnt1 <= 8'b0;
  end
  else if (cnt1 == 8'd6)begin
    cnt1 <= 8'b0;
  end
  else begin
    cnt1 <= cnt1 + 8'b1;
  end
end

//定义一个时钟从0到6 下降沿
always @(negedge clk or negedge rst_n) begin
  if(~rst_n)begin
    cnt2 <= 8'b0;
  end
  else if (cnt2 == 8'd6)begin
    cnt2 <= 8'b0;
  end
  else begin
    cnt2 <= cnt2 + 8'b1;
  end
end

2. 中间变量sig1、sig2的n种描述方法

2.1 使用assign语句描述,此时两个中间变量的类型应声明为wire类型

wire sig1;
wire sig2;
assign sig1 = ((cnt1 == 8'd1)||(cnt1 == 8'd2)||(cnt1 == 8'd3)||(cnt1 == 8'd4))
                ? 1'b1 :1'b0;
               
assign sig2 = ((cnt2 == 8'd1)||(cnt2 == 8'd2)||(cnt2 == 8'd3)||(cnt2 == 8'd4))
                ? 1'b1 :1'b0;

2.2 使用always@(*) begin if–else 描述 此时两个中间变量的类型应声明为reg类型

reg sig1;
reg sig2;
always@(*)begin
	if((cnt1==8'd1)||(cnt1==8'd2)||(cnt1==8'd3)||(cnt1==8'd4))begin
		sig1 <= 1'b1;	
	end
	else begin
		sig1 <= 1'b0;
	end
end
always@(*)begin
	if((cnt2==8'd1)||(cnt2==8'd2)||(cnt2==8'd3)||(cnt2==8'd4))begin
		sig2 <= 1'b1;	
	end
	else begin
		sig2 <= 1'b0;
	end
end

2.3 使用always @ (*)begin case–endcase描述

reg sig1;
reg sig2;
always @ (*)begin
		case(cnt2)
			8'd1 : sig2 <= 1'b1;
			8'd2 : sig2 <= 1'b1;
			8'd3 : sig2 <= 1'b1;
			8'd4 : sig2 <= 1'b1;
			default sig2 <= 1'b0;
		endcase 
end
always @ (*)begin
		case(cnt1)
			8'd1 : sig1 <= 1'b1;
			8'd2 : sig1 <= 1'b1;
			8'd3 : sig1 <= 1'b1;
			8'd4 : sig1 <= 1'b1;
			default sig1 <= 1'b0;
		endcase 
end

2.4 使用always@(*) begin ? A : B 描述

reg sig1;
reg sig2;
always @(*) begin
	sig1 <= ((cnt1==8'd1)||(cnt1==8'd2)||(cnt1==8'd3)||(cnt1==8'd4)) ? 1'b1:1'b0;
	sig2 <= ((cnt2==8'd1)||(cnt2==8'd2)||(cnt2==8'd3)||(cnt2==8'd4)) ? 1'b1:1'b0;
end

3. sig1、sig2 相与得到输出信号div_clk_7

assign div_clk_7 = sig1&&sig2;

三、搭建tb文件验证

验证前做的准备:将1 和2中的任意一个模块再加上3 这三部分组合起来 添加module(input ,output);endmodule 组成一个完整的.v文件

tb文件:

较为简单不再赘述

`timescale 1ns/1ps
module DIV_CLK_7_tb();
    reg clk;
    reg rst_n;
    wire div_clk_7;

    initial begin
      clk = 1'b0;
      rst_n = 1'b0;
      #40
      rst_n = 1'b1;
    end

    always #10 clk = ~clk ;

    DIV_CLK_7 DIV_CLK_7(

        . clk(clk),
        . rst_n(rst_n),

        . div_clk_7(div_clk_7)

    );

endmodule

在这里插入图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
分频电路是一种将输入信号频率降低为原来的1/7的电路。在Verilog语言中,可以使用计数器和组合逻辑来实现分频电路。 首先,需要定义一个计数器来计数输入信号的周期数。计数器的位数需要根据输入信号的频率确定,确保计数器在一个周期内能完成计数。我们假设输入信号的频率为f,那么计数器的位数应为log2(f)位。 然后,需要定义一个组合逻辑电路来生成分频的输出信号。组合逻辑电路通过对计数器进行逻辑运算,根据计数器的值生成分频的输出信号。例如,当计数器达到 f/7 的值时,将输出一个高电平,其他时间输出低电平。 在Verilog中,我们可以使用reg类型定义计数器和输出信号的变量。使用always块控制计数器的计数和输出信号的生成。具体的代码如下所示: ```verilog module SevenDivide( input clk, input reset, input signal_in, output reg signal_out ); reg [2:0] counter; always @(posedge clk or posedge reset) begin if (reset) counter <= 0; else if (counter == signal_in/7 - 1) begin counter <= 0; signal_out <= 1; end else begin counter <= counter + 1; signal_out <= 0; end end endmodule ``` 以上代码定义了一个分频模块SevenDivide,包括一个时钟信号clk、复位信号reset、输入信号signal_in和输出信号signal_out。计数器使用一个3位的变量counter表示,根据计数器的值生成分频的输出信号signal_out。always块会根据时钟信号和复位信号的变化来控制计数器的计数和输出信号的生成。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值