Verilog怎么实现当一个数据变换时产生一个半周期的脉冲

2024-12-24 19:48:51
推荐回答(5个)
回答1:

实现功能简述
本模块主要功能是产生一个确定时钟周期长度(最长为256个时钟周期)的脉冲信号,可以自己设定脉冲长度,输出的脉冲信号与时钟上升沿同步
脉冲宽度 = pulsewide + 1 时钟周期;

输入一个启动信号后,可以产生一个固定时钟周期长度的脉冲信号,与启动信号的长短无关!脉冲宽度可调!

1、可以调整输出脉冲宽度
2、只要输入一个启动信号,不论启动信号宽度——需要能够触发设计,就输出脉冲
3、再输出一个完整的脉冲过程中,不论输入多少个启动信号,都只会输出一个脉冲
4、不论启动脉冲的宽度多大,输出的脉冲宽度恒定
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
***************************************************************************************/
module confirmpulse ( clk, reset, start, pulse, pulsewide );

input clk, reset, start;
input [7:0] pulsewide;
output pulse;

reg pulse;

reg counten;
reg [7:0] count;

//计数器启动标记,表示一次延时计数开始
always @ ( posedge clk )
begin
if ( reset == 'b0 )
counten <= 'b0;
else
begin
if ( start == 'b1 )
counten <= 'b1;
else if ( start == 'b0 && count > pulsewide )
counten <= 'b0;
end
end

//延时计数器,保证延时 pulsewide 个时钟周期
always @ ( posedge clk )
begin
if ( reset == 'b0 )
count <= 'b00000000;
else
begin
if ( counten == 'b0 )
count <= 'b00000000;
else if ( counten == 'b1 && count <= pulsewide )
count <= count + 1;
else if ( counten == 'b0 && start == 'b0 )
count <= 'b00000000;
end
end

//输出定宽脉冲
always @ ( negedge clk )
begin
if ( reset == 'b0 || count >= pulsewide )
pulse <= 'b0;
else if ( counten == 'b1 )
pulse <= 'b1;
end

endmodule

回答2:

思路是另外起一个状态机,两个状态,idle和busy,主干部分如下(语法你补齐):
case
state
is
idle:
if
(rd_pulse=1)
state<=busy;
rd_en<=1;
busy:
if(rd=1)
rd_en=0;
state<=idle;
else
rd_en=1;

回答3:

实现功能简述
本模块主要功能是产生一个确定时钟周期长度(最长为256个时钟周期)的脉冲信号,可以自己设定脉冲长度,输出的脉冲信号与时钟上升沿同步
脉冲宽度
=
pulsewide
+
1
时钟周期;
输入一个启动信号后,可以产生一个固定时钟周期长度的脉冲信号,与启动信号的长短无关!脉冲宽度可调!
1、可以调整输出脉冲宽度
2、只要输入一个启动信号,不论启动信号宽度——需要能够触发设计,就输出脉冲
3、再输出一个完整的脉冲过程中,不论输入多少个启动信号,都只会输出一个脉冲
4、不论启动脉冲的宽度多大,输出的脉冲宽度恒定
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
***************************************************************************************/
module
confirmpulse
(
clk,
reset,
start,
pulse,
pulsewide
);
input
clk,
reset,
start;
input
[7:0]
pulsewide;
output
pulse;
reg
pulse;
reg
counten;
reg
[7:0]
count;
//计数器启动标记,表示一次延时计数开始
always
@
(
posedge
clk
)
begin
if
(
reset
==
'b0
)
counten
<=
'b0;
else
begin
if
(
start
==
'b1
)
counten
<=
'b1;
else
if
(
start
==
'b0
&&
count
>
pulsewide
)
counten
<=
'b0;
end
end
//延时计数器,保证延时
pulsewide
个时钟周期
always
@
(
posedge
clk
)
begin
if
(
reset
==
'b0
)
count
<=
'b00000000;
else
begin
if
(
counten
==
'b0
)
count
<=
'b00000000;
else
if
(
counten
==
'b1
&&
count
<=
pulsewide
)
count
<=
count
+
1;
else
if
(
counten
==
'b0
&&
start
==
'b0
)
count
<=
'b00000000;
end
end
//输出定宽脉冲
always
@
(
negedge
clk
)
begin
if
(
reset
==
'b0
||
count
>=
pulsewide
)
pulse
<=
'b0;
else
if
(
counten
==
'b1
)
pulse
<=
'b1;
end
endmodule

回答4:

会写小数分频器不???原理是一样的~~那个也要产生办个时钟周期~~

回答5:

你是做可综合的还是不可综合的呢?