Aug
20
利用SRL16,将一个时钟长度的脉冲扩展到16个时钟长度。




引用
module pluse_expand(pluse, clk, dout);
input pluse;
input clk;
output dout;
wire srl_out;
SRL16 #(
.INIT(16'h0000) // Initial Value of Shift Register
) SRL16_inst (
.Q(srl_out), // SRL data output
.A0(1'b1), // Select[0] input
.A1(1'b1), // Select[1] input
.A2(1'b1), // Select[2] input
.A3(1'b1), // Select[3] input
.CLK(clk), // Clock input
.D(pluse) // SRL data input
);
FDRE #(
.INIT(1'b0) // Initial value of register (1'b0 or 1'b1)
) FDRSE_inst (
.Q(dout), // Data output
.C(clk), // Clock input
.CE(pluse), // Clock enable input
.D(pluse), // Data input
.R(srl_out) // Synchronous reset input
// .S(1'b0) // Synchronous set input
);
endmodule
input pluse;
input clk;
output dout;
wire srl_out;
SRL16 #(
.INIT(16'h0000) // Initial Value of Shift Register
) SRL16_inst (
.Q(srl_out), // SRL data output
.A0(1'b1), // Select[0] input
.A1(1'b1), // Select[1] input
.A2(1'b1), // Select[2] input
.A3(1'b1), // Select[3] input
.CLK(clk), // Clock input
.D(pluse) // SRL data input
);
FDRE #(
.INIT(1'b0) // Initial value of register (1'b0 or 1'b1)
) FDRSE_inst (
.Q(dout), // Data output
.C(clk), // Clock input
.CE(pluse), // Clock enable input
.D(pluse), // Data input
.R(srl_out) // Synchronous reset input
// .S(1'b0) // Synchronous set input
);
endmodule
在FPGA内手动做Delay
2007大学生电子设计大赛开赛




此电路有创意,依靠srl实现计数,可以通过设置SRL的A0-A3来实现任意脉宽的输出。但有个问题,当两个输入pluse靠的比较近的时候,且前一个pulse比较宽的时候,由于仍有高电平随着SRL的输出移出,所以仍使后端的FF清零。所以影响后面的脉宽。我用的测试向量:
initial begin
// Initialize Inputs
pluse = 0;
// Wait 100 ns for global reset to finish
#105;
// Add stimulus here
pluse = 1;
#80
pluse = 0;
#100
pluse = 1;
#190
pluse = 0;
个人认为,还是SRL的计数的问题,不能当机立断,当pulse持续时间较长时,SRL有高电平的”拖尾“。还是用计数器,比较可靠。个人看法,听听你的看法。
输入信号的脉宽宽度是多少,频率是多少。