IC/FPGA校招笔试题分析(二)任意切换的时钟分频电路

今天的笔试题是某芸科技的现场笔试题,数字前端的笔试题,要求很简单,就是现场写出代码实现:

任意切换1-8分频,且无论奇分频还是偶分频,占空比均为50%,我至今仍然认为,在那种紧张且时间有限的情况下(本科大约预留15分钟),真的能设计出这种可任意切换的分频电路(之前有所准备的话可以),反正我是没写出来,笔试归来,我花了多个小时的时间写了一个且仿真了下。

个人认为,这个电路的设计的步骤分为两部分,

第一:

确定整体架构,包括输入输出:如何任意切换?我写了一个分频模块,其中一个输入为div,你输入1到8,可实现1到8的分频。

第二:

确定分频实现电路,分频大家都会写,实现过程可分为奇分频的实现以及偶分频的实现,这两种的实现方法是不一样的,偶分频简单,直接计数即可,奇分频需要三个步骤,第一个步骤就是计数,第二个步骤就是下降沿采样,第三个步骤就是相与或相或,具体实现方法后面再说。


思路简述:

上面说了这个电路的设计分为两部分,第一部分确定整体架构,其中最重要的是输入输出:

	input clk,
	input [3:0] div,
	input rst_n,
	output clk_out

确定好输入输出之后,我们想,我们是否需要一个使能信号,当输入分频述div后,我们让某一种分频模式使能,我们有8中分频模式,总不能傻傻地设置8个使能变量吧,en1,en2,...,en8;

当然这样很不好看,而且不利于后面程序编写,我的方式是:

	reg [7:0] fre_en;

每次只能使能一位,fre_en[i]使能代表i+1分频模式有效。

通过div的值来确认某种模式使能,其实现如下:

	localparam DIV1 = 1, DIV2 = 2, DIV3 = 3, DIV4 = 4;
	localparam DIV5 = 5, DIV6 = 6, DIV7 = 7, DIV8 = 8;

	reg [7:0] fre_en;


	always@(posedge clk or negedge rst_n) begin
		if(~rst_n) begin
			fre_en <= 0;
		end
		else begin
			case(div)
				DIV1: fre_en <= 8'b0000_0001;
				DIV2: fre_en <= 8'b0000_0010;
				DIV3: fre_en <= 8'b0000_0100; 
				DIV4: fre_en <= 8'b0000_1000;
				DIV5: fre_en <= 8'b0001_0000;
				DIV6: fre_en <= 8'b0010_0000;
				DIV7: fre_en <= 8'b0100_0000;
				DIV8: fre_en <= 8'b1000_0000;
			endcase
		end


	end

我们说了,分频分为奇分频和偶分频,二者都有计数的过程,但是这里想做出一点改变,因为1分频等于没分频,2分频直接对输出时钟取反即可,其他分频就和计数有关了。

我们写一个计数器,用于其他分频模式,8分频需要计数次数最多,我们设计数器位数为4位,其实3位就够了。

根据模式使能确定计数次数。

//计数模块
	reg [3:0] fre_cnt;
	always @(posedge clk
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

李锐博恩

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

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

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

打赏作者

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

抵扣说明:

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

余额充值