马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
-
- [code]module delay (
- //input
- clk, //输入时钟
- rst_n, //复位信号
- sync, //输入信号(需要延迟的信号)
- delays, //信号延迟时间调节
- pulsewide, //信号脉宽调节
- //output
- delay //输出信号
- );
- input clk;
- input rst_n;
- input sync;
- input [9:0] delays;
- input [9:0] pulsewide;
- output delay;
- reg delay;
- reg [2:0] current_state,next_state;
- parameter state0=3'b001,//状态0,1,2采用一位热码编码
- state1=3'b010,
- state2=3'b100;
- //标准状态机三段式写法
- //第一个进程,同步时序always模块,格式化描述次态寄存器迁移到现态寄存器
- always @(posedge clk )
- begin
- if (load==1)
- current_state<=state0;
- else
- current_state<=next_state;
- end
- //第二个进程,组合逻辑always模块,描述状态转移条件判断
- reg [10:0] cnt;
- always @(current_state,cnt,load,delays,pulsewide)
- begin
- next_state=3'bx; //要初始化,使得系统复位后能进入正确的状态
- case(current_state )
- state0:begin
- if(cnt==delays) next_state=state1;
- else next_state=state0;
- end
- state1:begin
- if(cnt==delays+pulsewide) next_state=state2;
- else if(load==1) next_state=state0;
- else next_state=state1;//(cnt<(delays+pulsewide))
- end
- state2:begin
- if (load==1) next_state=state0;
- //else if(cnt>delays+pulsewide) next_state=state0;
- else next_state=state2;
- end
- default:next_state=state0;
- endcase
- end
- //第三个进程,状态机的输出
- always @(posedge clk or negedge rst_n )
- if (!rst_n)
- begin
- cnt<=11'b0;
- delay<=0;
- end
- else
- begin
- cnt<=0;
- delay<=0;
- case (next_state)
- state0: begin
- cnt<=cnt+11'b1;
- delay<=0;
- end
- state1: begin
- cnt<=cnt+11'b1;
- delay<=1;
- end
- state2: begin
- cnt<=11'b0;
- delay<=0;
- end
- default: begin
- cnt<=cnt+11'b1;
- delay<=0;
- end
- endcase
- end
- //sync上升沿捕获
- reg previous;
- wire load;
- always @(posedge clk)
- previous <= sync;
- //always @(posedge clk)
- assign load = (~previous)&sync;
- //load<=(~previous)&sync;
- endmodule
复制代码
[/code]
这是我写的一个状态机的代码,想实现下面所示的功能:
要求输出的out_pulse
1)delays < SYNC 半个周期;
2)delays + pulsewidth <SYNC的一个周期;
下面是我从网上一位版主提供的状态图:
S0: delay状态,控制计数器从 0 递增到 delays;
S1: pulsewidth状态,控制计数器从delays 递增到 delays + pulsewidth;
S2: 空闲状态。
当sync上升沿来到时load产生1个高电平脉冲
只要出现load 有效,状态机就进入S0,并且计数器同步清零。处于S0状态,计数器cnt递增计数,直到出现 cnt == delays,切换到S1,cnt继续递增计数,直到出现 cnt==delays+pulsewidth,切换到S2,一直维持在S2 直至load 有效,切换到S0。
S0 和S2 状态,输出脉冲为0,S1状态,输出脉冲为1。
但是我的代码就是实现不了那个波形!烦请各位高手帮忙看下!不甚感激! |