数字IC手撕代码(九)

问题:枕头检测,frame_head来脉冲的同时din会来数据,连续三次数据都是8‘h23的话就输出一个脉冲。
比较懵的点是(frame_head)是一个单bit的标志脉冲(标志数据开始有效)?还是类似于数据的有效信号?

假定为类似数据的有效信号。
这个题目让我来做的话,我先会这样写(不考虑资源消耗)

module frame(
	input clk,
	input rst_n,
	input frame_head,
	input [7:0] din,
	output detect
);

reg [23:0] temp_data;

always @ (posedge clk or negedge rst_n) begin
	if(!rst_n) begin
		temp_data <= 24'd0;
	end
	else if(frame_head) begin
		temp_data <= {temp_data[15:0],din};
	end
end

assign detect = (temp_data[23:0]==25'h232323) ? 1'b1 : 1'b0;

endmodule

在这里插入图片描述
这个的话,就是有个问题,会导致如果连续是4个有效的8’h23的话,就会产生2个脉冲的detect信号。所以我觉得应该是这样的,检测到3个有效8’h23之后,不会在之前的基础上检测3个有效的8’h23.这样的话,代码应该是下面这样。

module frame(
	input clk,
	input rst_n,
	input frame_head,
	input [7:0] din,
	output reg detect
);

reg [1:0] cnt;
//reg [7:0] data_temp;
always @ (posedge clk or negedge rst_n) begin
	if(!rst_n) begin
		cnt <= 2'd0;
	end
	else if(frame_head && (din==8'h23)) begin
		cnt <= cnt + 1'b1;
	end
	else if(frame_head && (din!=8'h23)) begin
		cnt <= 2'd0;
	end
	else if(cnt==2'd3) begin
		cnt <= 2'd0;
	end
end

always @ (posedge clk or negedge rst_n) begin
	if(!rst_n) begin
		detect <= 1'b0;
	end
	else if(cnt==2'd3) begin
		detect <= 1'b1;
	end
	else begin
		detect <= 1'b0;
	end
end

endmodule

在这里插入图片描述
在这里插入图片描述
接下来用状态机实现下这个功能

module frame(
	input clk,
	input rst_n,
	input frame_head,
	input [7:0] din,
	output reg detect
);

reg [1:0] c_state;
reg [1:0] n_state;

always @ (posedge clk or negedge rst_n) begin
	if(!rst_n) begin
		c_state <= 2'd0;
	end
	else begin
		c_state <= n_state;
	end
end

always @ (*) begin
	if(!rst_n) begin
		n_state = 2'd0;
	end
	else if(frame_head) begin
		case(c_state)
			2'd0 : begin
						if(din==8'h23) begin
							n_state = 2'd1;
						end
						else begin
							n_state = 2'd0;
						end
				   end
			2'd1 : begin
						if(din==8'h23) begin
							n_state = 2'd2;
						end
						else begin
							n_state = 2'd0;
						end
				   end
			2'd2 : begin
						if(din==8'h23) begin
							n_state = 2'd0;
						end
						else begin
							n_state = 2'd0;
						end
				   end
			default : n_state = 2'd0;
		endcase
	end
end


always @ (posedge clk or negedge rst_n) begin
	if(!rst_n) begin
		detect <= 1'b0;
	end
	else if(c_state==2'd2 && din ==8'h23 && frame_head) begin
		detect <= 1'b1;
	end
	else begin
		detect <= 1'b0;
	end
end
endmodule

在这里插入图片描述

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值