Verilog经典题(三)——偶分频、奇分频

偶分频

占空比50%的偶分频

思路(看着就知道咋写的快速回顾)

  1. 参数DivNum定义几分频
  2. 输入clk,rst 输出oclk,中间计数器count,tmp
  3. 0 1 2 3 置高,4 5 6 7 置低
if(count == ((DivNum>>1) - 1)) begin
		count <= count + 1;	
		tmp     <= 1'b1;
end
else if(count == (DivNum - 1)) begin
		count	<= 0;
		tmp		<= 1'b0;	
end
else
		count <= count +1;

代码

Verilog

module evenfreq
#(
	parameter DivNum = 8
)

(
	input clk,
	input rst,
	output oclk
);

	reg [2:0] count;
	reg  tmp;
	
	always @(posedge clk or negedge rst)begin
		if(!rst) begin
			count <= 0;
			tmp <= 0;
		end
		else begin
			if (count == DivNum - 1) begin
				count <= 0;
				tmp <= 0;
			end
			else if (count == (DivNum>>1) - 1)begin
				count <= count + 1 ;
				tmp <= 1;	
			end
			else 
				count <= count + 1 ;
		end
	end
	
	assign oclk = tmp;			
endmodule

tb

module evenfreq_tb();
	reg clk;
	reg rst;
	wire oclk;
	
	initial begin
		clk = 0;
		rst = 0;
		# 5 rst = 1;
	end
	
	initial begin
		forever #5 clk = ~clk;
	end 
	
	evenfreq tb1(
		.clk(clk),
		.rst(rst),
		.oclk(oclk)
	);
endmodule

波形

在这里插入图片描述

奇分频

占空比为50%的奇分频

思路

  1. 参数DivNum用来设置分频数
  2. 用clk上升沿分频出“3高4低”的7分频tmp
    再用clk下降沿分频出“3高4低”的7分频tmp1
    将tmp与tmp1相或即可得到占空比50%的7分频oclk
  3. 输入clk,rst输出oclk
if(count1 == DivNum-1)begin
		count1 <= 0;
		tmp1 <= 0;
end
else if(count1 == (DivNum-1) >> 1)begin
		count1 <= count1 + 1;
		tmp1 <= 1;
end
else 
	    count1 <= count1 + 1;

代码

Verilog
代码中opsd,ongd,c1,c2为方便观看波形,实际输出并不需要

module oddfreq
#(
	parameter DivNum = 9
)
(
	input clk,
	input rst,
	output opsd, //上升沿控制输出
	output ongd, //下降沿控制输出
	output [DivNum:0]c1, //上升沿计数器
	output [DivNum:0]c2,  //下降沿计数器
	output oclk
);

	reg [DivNum:0] count1;
	reg [DivNum:0] count2;
	reg tmp1;
	reg tmp2;
	
	always @(posedge clk or negedge rst)begin
		if(!rst) begin
			count1 <= 0;
			tmp1 <= 0;
		end
		else begin 
			if(count1 == DivNum-1)begin
				count1 <= 0;
				tmp1 <= 0;
			end
			else if(count1 == (DivNum-1) >> 1)begin
				count1 <= count1 + 1;
				tmp1 <= 1;
			end
			else begin 
				count1 <= count1 + 1;
			end
		end
	end
	
	always @(negedge clk or negedge rst)begin
		if(!rst) begin
			count2 <= 0;
			tmp2 <= 0;
		end
		else begin 
			if(count2 == DivNum-1)begin
				count2 <= 0;
				tmp2 <= 0;
			end
			else if(count2 == (DivNum-1) >> 1)begin
				count2 <= count2 + 1;
				tmp2 <= 1;
			end
			else count2 <= count2 + 1;
		end
	end
	
	assign c1 = count1;
	assign c2 = count2;
	assign opsd = tmp1;
	assign ongd = tmp2;
	assign oclk = tmp1 || tmp2;
endmodule

tb

module oddfreq_tb();

	reg rst;
	reg clk;
	wire [7:0]c1;
	wire [7:0]c2;
	wire opsd;
	wire ongd;
	wire oclk;
	
	initial begin
		clk = 0;
		rst = 0;
		# 5 rst = 1;
	end
	
	initial begin
		forever #5 clk = ~clk;
	end 
	
	oddfreq tb1(
		.clk(clk),
		.rst(rst),
		.c1(c1),
		.c2(c2),
		.opsd(opsd),
		.ongd(ongd),
		.oclk(oclk)
	);
endmodule

波形

在这里插入图片描述
参考https://blog.csdn.net/xvrixingkong/category_10393817.html

有没有大佬热心告知我波形能直接导出吗?截图好像有点low而且不太清楚。还有还有 为什么我的代码块没有颜色的区别??

Verilog分频计数器是一种用于对系统时钟进行分频处理的电路。根据引用\[1\]和引用\[2\]的描述,分频器可以分为分频分频两种方式。 对于分频,最简单的二分频可以通过在原时钟的上升沿进行输出信号翻转来实现。而对于更高的分频比如4分频,可以使用计数器,在计数器计到2个上升沿的时候进行输出信号翻转。具体来说,计数器的范围为0-(N-1),其中N为数,选择一个值K,当计数器在0~K范围内时,输出信号为低电平;在(K+1)-(N-1)范围内为高电平,从而实现了分频。这样的分频器可以通过参数化设计来灵活地改变分频比例\[1\]。 对于分频,最简单的分频无法直接使用计数器进行实现。根据引用\[2\]的描述,正确的思路是取两路上升沿和下降沿信号,然后对这两路信号取或。具体来说,可以使用计数器在0-2之间循环计数,控制输出1个高电平,2个低电平的信号1,然后将信号1延迟半个周期得到信号2,最后将信号1与信号2相与得到50%占空比的3分频信号。对于其他分频,可以使用类似的方法进行设计\[2\]。 根据引用\[3\]的例子,如果系统时钟为50MHz,要产生1MHz的时钟,则可以进行50分频。可以使用计数器进行实现,当计数器计到49次时清零,否则进行+1计数。同时,根据计数器的值,可以控制输出信号的翻转,从而得到1MHz的时钟频率。 综上所述,Verilog分频计数器可以根据需要选择分频分频的方式,并通过计数器和组合逻辑来实现所需的分频比例。 #### 引用[.reference_title] - *1* *3* [Verilog基础知识-——计数器设计以及任意分频设计与modelsim仿真](https://blog.csdn.net/H19981118/article/details/115353714)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Verilog分频器](https://blog.csdn.net/qq_39586852/article/details/125836784)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值