我是靠谱客的博主 舒服河马,最近开发中收集的这篇文章主要介绍两道典型的Verilog面试题奇数分频器序列检测器,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

奇数分频器

在Verilog中,偶数频分频较容易实现,只需要设定一个计数器,计数器值为分频数的一半,当计数记满后,输出信号取非,计数值清零。但这样并不能奇数分频,因为奇数分频数的一半包含0.5,无法只通过上升沿得到。但是设置两个不同的偶数分频时钟,通过上升沿和下降沿一同触发的模式,可以实现奇数分频。
在下面的代码中,需要修改div1,div2两个参数的值以实现分频,div1为分频数除以二的商,div2为余数。

module divfreq(clk, clk_o, rst_n, clk_pose, clk_nege, cntpose, coutnege);

input  clk;
input  rst_n;
output clk_o;
output clk_pose;
output clk_nege;
output [2:0] cntpose;
output [2:0] cntnege;

reg clk_pose;
reg clk_nege;

reg [2:0] cntpose;
reg [2:0] cntnege;

parameter div1 = 2, div2 = 4; //div1 = 5/2, div2 = 5-1
assign clk_o = clk_pose | clk_nege;
always@(posedge clk or negedge rst_n)
begin
if(rst_n)
	clk_pose = 0;
else if(cntpose == div1)
	clk_pose = ~clk_pose;
else if(cntpose == div2)
	clk_pose = ~clk_pose;
else
	clk_pose = clk_pose;
end

always@(negedge clk or negedge rst_n)
begin
if(rst_n)
	clk_nege = 0;
else if(cntnege == div1)
	clk_nege = ~clk_nege;
else if(cntnege == div2)
	clk_nege = ~clk_nege;
else
	clk_nege = clk_nege;
end

always@(posedge clk or negedge rst_n)
begin
if(rst_n)
	cntpose = 0;
else if(cntpose == div2)
	cntpose = 0;
else
	cntpose = cntpose + 1;
end

always@(negedge clk or negedge rst_n)
begin
if(rst_n)
	cntnege = 0;
else if(cntnege == div2)
	cntnege = 0;
else
	cntnege = cntnege + 1;
end

endmodule

仿真波形
上述方法是通过时钟或实现分频,另外,可以通过时钟与和时钟异或实现奇数分频。

序列检测器

用状态机检测序列为 11001101,输出为 1,否则输出为 0。
序列检测器实质上为一个状态机。序列检测器的难点在于对序列重叠的处理。

module Detector(clk, rst_n, din, dout);

input clk, rst_n;
input din;
output dout;

parameter IDLE=0;
parameter ST1=1;
parameter ST2=2;
parameter ST3=3;
parameter ST4=4;
parameter ST5=5;
parameter ST6=6;
parameter ST7=7;
parameter ST8=8;

reg [3:0] current_state, next_state;
reg dout;

always @ (posedge clk or negedge rst_n)
if(!rst_n)
	current_state <= IDLE;
else
	current_state <= next_state;

always @ (next_state or current_state or din or dout)
begin
	case(current_state)
	IDLE: if(din) next_state = ST1; else next_state = IDLE;
	ST1:  if(din) next_state = ST2; else next_state = IDLE;
	ST2:  if(!din) next_state = ST3; else next_state = ST2;
	ST3:  if(!din) next_state = ST4; else next_state = ST1;
	ST4:  if(din) next_state = ST5; else next_state = IDLE;
	ST5:  if(din) next_state = ST6; else next_state = IDLE;
	ST6:  if(!din) next_state = ST7; else next_state = ST2;
	ST7:  if(din) next_state = ST8; else next_state = ST4;
	ST8:  if(din) next_state = ST2; else next_state = IDLE;
	default: next_state = IDLE;
end

always @ (posedge clk)
if(next_state = ST8)
	dout <= 1'b1;
else
	dout <= 1'b0;

endmodule

状态机示意图

最后

以上就是舒服河马为你收集整理的两道典型的Verilog面试题奇数分频器序列检测器的全部内容,希望文章能够帮你解决两道典型的Verilog面试题奇数分频器序列检测器所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部