我是靠谱客的博主 结实画笔,最近开发中收集的这篇文章主要介绍序列信号发生器,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Verilog 序列信号发生器的三种设计思路
序列信号发生器:同步脉冲作用下循环地产生一串周期性的二进制信号的逻辑器件。
例如产生:100111

方法1:状态机

选择格雷码,每个状态输出一位

module head(
input clk,
input rst_n,
input load,//数据锁存
input [5:0] in,//输入序列
output reg out
);
reg [2:0] state;
reg [5:0] in_reg;
parameter s0=000,s1='b001,s2='b011,s3='b010,s4='b110,s5='b100;
always@(posedge clk or negedge rst_n)
begin
	if(!rst_n)
	begin
		state<=s0;
		out<=0;
	end
	else
	if(load)
		begin
			in_reg<=in;
			state<=s0;
		end
	else
		case(state)
		s0:begin
				state<=s1;
				out<=in_reg[5];
			end
		s1:begin
				state<=s2;
				out<=in_reg[4];
			end
		s2:begin
				state<=s3;
				out<=in_reg[3];
			end
		s3:begin
				state<=s4;
				out<=in_reg[2];
			end
		s4:begin
				state<=s5;
				out<=in_reg[1];
			end
		s5:begin
				state<=s0;
				out<=in_reg[0];
			end
		endcase
end
endmodule

在这里插入图片描述

方法2:移位寄存器实现
左移输出

module head(
input clk,
input rst_n,
input load,//数据锁存
input [5:0] in,//输入序列
output  out
);
reg [5:0] in_reg;
always@(posedge clk or negedge rst_n)
begin
	if(!rst_n)
		in_reg<=0;
	else
	if(load)
			in_reg<=in;
	else
			in_reg<={in_reg[4:0],in_reg[5]};
end
assign out =rst_n?in_reg[5]:0;
endmodule

在这里插入图片描述
如果问:欲用移位寄存器产生序列信号100111,则至少需要多少级触发器
6位至少需要3级触发器
3个触发器:100->001->011->111->111 重复,不可以。
4个触发器:1001->0011->0111->1111->1110->1100->1001,可以
所以利用移位寄存器至少需要4级触发器

方法三:计数器

在这里插入图片描述
在这里插入图片描述

module head(
input clk,
input rst_n,
output  out
);
reg [5:0] in_reg;
reg [2:0] cnt;
always@(posedge clk or negedge rst_n)
begin
	if(!rst_n)
		cnt<=0;
	else
		cnt<=cnt+1;
end

assign out =cnt[2]|((cnt[1])&(~cnt[0]))|(cnt[1]&cnt[0]);
endmodule

最后

以上就是结实画笔为你收集整理的序列信号发生器的全部内容,希望文章能够帮你解决序列信号发生器所遇到的程序开发问题。

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

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

评论列表共有 0 条评论

立即
投稿
返回
顶部