Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

Verilog: Simple Pulse Generator/ Clock Divider

Status
Not open for further replies.

lendo1

Newbie level 3
Newbie level 3
Joined
Feb 12, 2013
Messages
3
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,281
Visit site
Activity points
1,298
Hello everyone, I am working on a simple program that creates an output Pulse every (input) N clock cycles. The logic is very simple, but I am new to Verilog and am having problems assigning my output (Pulse.) Any ideas? Thanks!

Code:
module pulse_atN(Clk, Reset, Pulse, N);	

	parameter WIDTH = 10;

	input		Clk, Reset;
	input [WIDTH-1:0] N;	
	reg [WIDTH-1:0] Nlast;	

	
	reg [WIDTH-1:0] Count;	

	output Pulse;
	
	assign Pulse = (Count == N-1) && (N != 0); 

		
	always @ (posedge Clk, posedge Reset)
	begin : PULSE_GENERATOR
		if(Reset)
			Count <= 0;
		else
			begin
		    	// nonblocking so check occurs with old Nlast
    			Nlast <= N;
   
		    	if(Nlast != N)
		      		Count <= 0;
        		else if(Count == N-1)
          			begin
						Count <= 0;
						Pulse = 1;

          			end
			  	else
			  		begin
						Count <= Count + 1;
						Pulse = 0;

					end
		  end
	end
	
endmodule
 
Last edited:

"Illegal Reference to net: Pulse" in my else if and else blocks. How do I correctly assign it??
 


Code Verilog - [expand]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
module pulse_at_N  #(
  parameter pWIDTH = 10
) (
  input                     CLK,
  input                     RESET,
  input       [pWIDTH-1:0]  N,
  output reg  [pWIDTH-1:0]  PULSE
);
 
 
  reg [pWIDTH-1:0]  count;
 
  always @ (posedge CLK, posedge RESET) begin : PULSE_GENERATOR
 
    // counter:
    // this could be made a down counter starting at N-1 so the compare becomes a reduction operation.
    // i.e. ~|count, which detects a 0 value.
    if ( RESET ) begin
      count <= 0;       // could use {pWIDTH{1'b0}} to avoid truncating messages
    end else begin
      count <= (count < N) ? count + 1 : 0;
    end
 
    // pulse generator
    PULSE <= (count == N-1) ? 1 : 0;
 
  end
 
endmodule


This should work. Take a look at the differences in this and your code. I made the counter just a N rollover counter and a separate statement to produce the pulse based on the count value.
You should play around with the down count as it's more efficient to do a reduction operation than a full compare.
 

Ahh yes that works but the larger file which I have no control of declares Pulse as a wire. For some reason, I can't figure out how to update the value of Pulse without getting all these errors! (either "LHS in procedural continuous statement may not be a net: Pulse" or "Illegal Reference to net: Pulse"
 

Ahh yes that works but the larger file which I have no control of declares Pulse as a wire. For some reason, I can't figure out how to update the value of Pulse without getting all these errors! (either "LHS in procedural continuous statement may not be a net: Pulse" or "Illegal Reference to net: Pulse"

Then change pulse in the code to pulse_reg and then add assign pulse = pulse_reg; to the code.

- - - Updated - - -

Hmmm, if this pulse_atn module is instantiated somewhere and you're seeing issues outside this module you've got something else going on.

my assign pulse = pulse_reg; won't fix something in the level above. Having the Pulse module port defined as reg won't affect how it gets hooked up in the level above.
 
  • Like
Reactions: lendo1

    lendo1

    Points: 2
    Helpful Answer Positive Rating
Status
Not open for further replies.

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top