
姓名:刘强
【嵌牛导读】
在设计电路时我们可能遇到需要根据用户输入产生一个时钟同步的单脉冲信号的需求,本文给出了一种实现方案。
【嵌牛鼻子】
Verilog 单脉冲 状态机
【嵌牛提问】
如何用Verilog硬件描述语言编写一个单脉冲发生器?
【嵌牛正文】
需求分析
用户按键,每次按的时间有长有短,有些时候会有这样一个需求:
当用户按下按键时,会产生一个沿,通过这个沿产生一个脉冲信号,脉冲宽度为一个(或N个)时钟周期。
实现方法
用户按键产生一个复位信号reset;
一个Mealy型的状态机在时钟驱动下发生状态转移,由复位信号选择将要进入的状态
状态图

模块引脚

Verilog代码
//单脉冲产生电路
module single_impulse(clk,key_signal,out);
input clk;
input key_signal;
output out;
reg out;
reg reset;
reg [3:0] state;
initial
state <= 1;
always @(posedge clk or posedge key_signal)
if(key_signal)
reset <= 1;
else
reset <= 0;
always @(posedge clk)
case(state)
4'd1:
if(reset)
begin
out <= 1;
state <= 2;
end
4'd2:
if(reset)
begin
out <= 0;
state <= 2;
end
else
begin
out <= 0;
state <= 1;
end
endcase
endmodule
仿真结果
功能仿真

时序仿真

网友评论