FPGA Intellectual Property
PCI Express*, Networking and Connectivity, Memory Interfaces, DSP IP, and Video IP
Announcements
FPGA community forums and blogs on community.intel.com are migrating to the new Altera Community and are read-only. For urgent support needs during this transition, please visit the FPGA Design Resources page or contact an Altera Authorized Distributor.
6673 Discussions

Periodic Pulses Pattern

sdb
Beginner
1,493 Views

Hello,

I'm a new Verilog programmer and still rely on examples to write code.

I didn't find any example of what I need.

I need to generate two pulses periodicaly like this following schema:

PeriodicPulsesPattern.png

clk is the base of the period (pulse every 8 ticks for example).

pulse1: rises 3 ticks after positive edge of clk and falls 2 ticks later.

pulse2: rises 4 ticks after positive edge of clk and falls 3 ticks later.

I'd like also generates the pulses for a limited number (N) of periods, 1 ≤ N < ∞.

I suppose I have to use temporisation conditions (#t) but didn't success to synchronize them to posedge of clk.

Thank for your help.

0 Kudos
7 Replies
Nurina
Employee
1,468 Views

Hello,


Thank you for using Intel Communities.

Please allow some time while I investigate.


Regards,

Nurina


0 Kudos
Nurina
Employee
1,466 Views

Hello,


Are you trying to do this for simulation only? Are you trying to have a testbench to show this behaviour?

Can you share what you currently have?


Regards,

Nurina


0 Kudos
sdb
Beginner
1,441 Views

Thank you to your answer,

Yes it is for a testbench only. I have no result because I didn't find how writing the code to obtain the desired result.

Best regards.

Daniel

0 Kudos
Nurina
Employee
1,419 Views

Hello,


Can you attach the code you have written so we can work from there?


Thanks,

Nurina


0 Kudos
sdb
Beginner
1,331 Views
Here are the expected periodicaly outputs of the test bench:
 
pulses.png
 
I tried this code. What is the problem?
 
`timescale 1us/1ns
 
module Pulses(clk, pulse1, pulse2);
 
output clk, pulse1, pulse2;
wire c, p1, p2;
 
initial
begin
  c = 0; 
  p1 = 0;
  p2 = 0;
  repeat(1000)     //1000 cycles repeated
  begin
    #0 c = 1;
    #1 c = 0;
    #2 p1 = 1;
    #1 p2 = 1;
    #1 p1 = 0;
    #2 p2 = 0;
    #1 ;
  end
 
  assign clk = c;
  assign pulse1 = p1;
  assign pulse2 = p2;
 
end
 
endmodule

 

Thank you

0 Kudos
Nurina
Employee
1,318 Views

Hello,

 

That doesn't look like a testbench. How are you simulating this? Are you using ModelSim/QuestaSim?

I tried using QuestaSim and managed to get the output you want.

First of all, a testbench shouldn't have any ports declaration -> module Pulses(clk, pulse1, pulse2);

It should be empty like so -> module Pulses ();

And I don't think you can use assign in testbench.

 

Please refer to the verilog files I'm attaching. periodic_pulses.v is the top verilog file in your Quartus project and periodic_pulses_tb.v is the testbench.

Follow the steps here to compile and run simulation, it should be the same for Quartus Lite:

QuestaSim: https://www.intel.com/content/www/us/en/docs/programmable/703090/21-1/simulation-quick-start.html

ModelSim: https://www.intel.com/content/www/us/en/docs/programmable/683248/18-0/simulation-quick-start.html

 

Regards,

Nurina

 

p/s: If any answer from the Intel Support is helpful, please feel free to provide rating with 4/5 survey on the support provided.

0 Kudos
FvM
Honored Contributor II
1,265 Views

Hello,

apart from the point that outputs have no purpose in a testbench, the problem in your original code are of different kind.

Assignment must take place outside the initial statement.

 

`timescale 1us/1ns

module Pulses(clk, pulse1, pulse2);

output reg clk, pulse1, pulse2;
reg c, p1, p2;

initial
begin
c = 0;
p1 = 0;
p2 = 0;
repeat(1000) //1000 cycles repeated
begin
#0 c = 1;
#1 c = 0;
#2 p1 = 1;
#1 p2 = 1;
#1 p1 = 0;
#2 p2 = 0;
#1 ;
end
end

assign clk = c;
assign pulse1 = p1;
assign pulse2 = p2;

endmodule

0 Kudos
Reply