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.

Unable to get this verilog code to loop the state machine for number of iterations

Status
Not open for further replies.

GurenMarkV

Newbie level 2
Joined
Mar 4, 2018
Messages
2
Helped
0
Reputation
0
Reaction score
0
Trophy points
1
Activity points
19
The objective is to perform a singular function with at least a hundred iterations. Final goal is to completely make it gate-level. I could not figure that out so I am trying to get regular code to work. But I cannot get this state machine to loop even twice. There are a lot of random commented codes due to testing things out. I need to get a counter/comparator working somehow. Return to state zero and resume the process. Below is the main code and the testbench I am using to try and test it. I can only get the 1st iteration working. But cannot get anything else.


Please any assistance would be appreciated. Thank you.

Code:
//Verilog module for Project
`timescale 1ns/1ps

module Project1(
    clk, rst, start,
	 x_in, u_in, y_in,
	 x_out, u_out, y_out
  );

//List the inputs and their sizes
	input clk, rst, start;
	input [7:0] x_in, u_in, y_in;

//List the outputs and their sizes 
   output integer x_out, u_out, y_out;

//Internal variables
//	integer  [7:0] rx4, rx2, rdx, r3, rudx, r3ux4_yx4, rux4_x4y;
//	integer  [7:0] ru_y;
	reg [7:0] min1, min2; 
	reg [15:0] tempmult;
	reg [7:0] ain1, ain2;
	reg [8:0] tempadd;
	
	integer 	x_i, u_i, y_i;
	integer  rx4, rx2, rdx, r3, rudx, r3ux4_yx4, rux4_x4y;
	integer  ru_y;
	integer count = 0;
//List of Wires
	
	
// Declare state register and parameter

	reg [3:0] state;
	parameter S0 = 0, S1 = 1, S2 = 2, S3 = 3, S4 = 4, S5 = 5, S6 = 6;
	
//Instantiate Modules ----------------------------------------------------

//Multiplier
	lpmmult multiply(
	.clock(clk),
	.dataa(min1),
	.datab(min2),
	.result(mout));
	
//Adder
	adders adderss(
	.clock(clk),
	.data0x(ain1),
	.data1x(ain2),
	.result(aout));
	


//	always block
	always @ (posedge clk or posedge rst) begin:FSM_ST
	
		// Determine the next state
		if (rst) begin
			rdx = 1;
			r3 = 6;
			x_i <= x_in;
			u_i <= u_in;
			y_i <= y_in;

			
			state <= S0;
		end else if(start) begin	//End If Start else

		case (state)
			S0: begin
				// Multiplying using instantiated module
//				min1 <= x_i;
//				min2 <= x_i;
//				tempmult <= mout;
//				rx2 <= tempmult[15:8];
//				// Adding using instantiated module
//				ain1 <=x_i;
//				ain1 <=rdx;
//				tempadd <= aout;
//				if (tempadd[8] == 1) begin
//					x_out <= tempadd[8:1];
//				end else begin
//					x_out <= tempadd[7:0];
//				end
					
				
				rx2 <= x_i*x_i; //Multiplying using regular way
				x_out <= x_i+rdx; //Adding using regular way
				
				if (count < 10) begin
					count = count + 1;
					state = S1;
					$display("Time %2d: x_out %1d is %2d", $time, x_out, y_out);
					#10;
				end 
				else begin
					state <= S1;
					end
					end// End State0
				
			S1: begin
				rx4 <= rx2*rx2;
				ru_y <= u_i+y_i;
//			Multiplying using instantiated module
//				min1 <= rx2;
//				min2 <= rx2;
//				tempmult <= mout;
//				rx4 <= tempmult[15:8];
//				
//			Adding using instantiated module
//				ain1 <=u_i;
//				ain1 <=y_i;
//				tempadd <= aout;
//				if (tempadd[8] == 1) begin
//					ru_y <= tempadd[8:1];
//				end else begin
//					ru_y <= tempadd[7:0];
//				end
				
					state <= S2;
					end// End State1
					
			S2: begin
				rux4_x4y <= rx4*ru_y;
				
//				min1 <= rx4;
//				min2 <= ru_y;
//				tempmult <= mout;
//				rux4_x4y <= tempmult[15:8];
					state <= S3;
					end// End State2
					
			S3: begin
				r3ux4_yx4 <= rux4_x4y*r3;
				
//				min1 <= rux4_x4y;
//				min2 <= r3;
//				tempmult <= mout;
//				r3ux4_yx4 <= tempmult[15:8];
				
					state <= S4;
					end// End State3
					
			S4: begin
				rudx <= u_i*rdx;
				u_out <= r3ux4_yx4+u_i;
				
//				min1 <= u_i;
//				min2 <= rdx;
//				tempmult <= mout;
//				rudx <= tempmult[15:8];
//				
//				// Adding using instantiated module
//				ain1 <=r3ux4_yx4;
//				ain1 <=u_i;
//				tempadd <= aout;
//				if (tempadd[8] == 1) begin
//					u_out <= tempadd[8:1];
//				end else begin
//					u_out <= tempadd[7:0];
//				end
					state <= S5;
					end// End State4
					
			S5: begin
				y_out <= rudx + y_i;
				
// 			Adding using instantiated module
//				ain1 <=rudx;
//				ain1 <=y_i;
//				tempadd <= aout;
//				if (tempadd[8] == 1) begin
//					y_out <= tempadd[8:1];
//				end else begin
//					y_out <= tempadd[7:0];
//				end

					state <= S6;
					end// End State5
					
			S6: begin

				//Write output code Here
				if (start) begin
					state = S0;
				
				end
//				if (count < 10) begin
//					count = count + 1;
//					state = S0;
//					$display("Time %2d: x_out %1d is %2d", $time, x_out, y_out);
//					#10;
//				end 
					
				end// End State6
			default:
				state <= S6;
				
			endcase
			
		end // End Else


	
	end// End always module
	
//	always @ (posedge clk) begin:FSM_S
//				if (count < 10) begin
//					count = count + 1;
//					//state = S0;
//					$display("Time %2d: x_out %1d is %2d", $time, x_out, y_out);
//					#10;
//				end 
//	end

endmodule







Code:
//Verilog testbench module for Project
`timescale 1ns/1ps

module Project1_tb;

  reg clk, rst, start; //reset = active HIGH

  integer  x_in, u_in, y_in;
  wire [7:0] x_out, u_out, y_out;
  
  Project1 uut(

    .clk(clk), .rst(rst), .start(start),
	 .x_in(x_in), .u_in(u_in), .y_in(y_in),
	 .x_out(x_out), .u_out(u_out), .y_out(y_out)
  );
  
	initial begin   
		clk = 0;  
		forever #50 clk = ~clk;  
	end 

	initial begin
		#1000;
		start = 0;
		x_in = 8'b00000010;
		u_in = 8'b00000100;
		y_in = 8'b00000100;
		rst = 1;
		#1000;
		rst = 0;
		#1000;
		start = 1;
		#1000; 
		start = 0;
		#1000;
		rst = 1;
		#1000;
		rst = 0;
		#1000;
		start = 1;
		#50000;
	end

endmodule
 

The objective is to perform a singular function with at least a hundred iterations. Final goal is to completely make it gate-level. I could not figure that out so I am trying to get regular code to work. But I cannot get this state machine to loop even twice. There are a lot of random commented codes due to testing things out. I need to get a counter/comparator working somehow. Return to state zero and resume the process. Below is the main code and the testbench I am using to try and test it. I can only get the 1st iteration working. But cannot get anything else.


Please any assistance would be appreciated. Thank you.

Code:
//Verilog module for Project
`timescale 1ns/1ps

module Project1(
    clk, rst, start,
	 x_in, u_in, y_in,
	 x_out, u_out, y_out
  );

//List the inputs and their sizes
	input clk, rst, start;
	input [7:0] x_in, u_in, y_in;

//List the outputs and their sizes 
   output integer x_out, u_out, y_out;

//Internal variables
//	integer  [7:0] rx4, rx2, rdx, r3, rudx, r3ux4_yx4, rux4_x4y;
//	integer  [7:0] ru_y;
	reg [7:0] min1, min2; 
	reg [15:0] tempmult;
	reg [7:0] ain1, ain2;
	reg [8:0] tempadd;
	
	integer 	x_i, u_i, y_i;
	integer  rx4, rx2, rdx, r3, rudx, r3ux4_yx4, rux4_x4y;
	integer  ru_y;
	integer count = 0;
//List of Wires
	
	
// Declare state register and parameter

	reg [3:0] state;
	parameter S0 = 0, S1 = 1, S2 = 2, S3 = 3, S4 = 4, S5 = 5, S6 = 6;
	
//Instantiate Modules ----------------------------------------------------

//Multiplier
	lpmmult multiply(
	.clock(clk),
	.dataa(min1),
	.datab(min2),
	.result(mout));
	
//Adder
	adders adderss(
	.clock(clk),
	.data0x(ain1),
	.data1x(ain2),
	.result(aout));
	


//	always block
	always @ (posedge clk or posedge rst) begin:FSM_ST
	
		// Determine the next state
		if (rst) begin
			rdx = 1;
			r3 = 6;
			x_i <= x_in;
			u_i <= u_in;
			y_i <= y_in;

			
			state <= S0;
		end else if(start) begin	//End If Start else

		case (state)
			S0: begin
				// Multiplying using instantiated module
//				min1 <= x_i;
//				min2 <= x_i;
//				tempmult <= mout;
//				rx2 <= tempmult[15:8];
//				// Adding using instantiated module
//				ain1 <=x_i;
//				ain1 <=rdx;
//				tempadd <= aout;
//				if (tempadd[8] == 1) begin
//					x_out <= tempadd[8:1];
//				end else begin
//					x_out <= tempadd[7:0];
//				end
					
				
				rx2 <= x_i*x_i; //Multiplying using regular way
				x_out <= x_i+rdx; //Adding using regular way
				
				if (count < 10) begin
					count = count + 1;
					state = S1;
					$display("Time %2d: x_out %1d is %2d", $time, x_out, y_out);
					#10;
				end 
				else begin
					state <= S1;
					end
					end// End State0
				
			S1: begin
				rx4 <= rx2*rx2;
				ru_y <= u_i+y_i;
//			Multiplying using instantiated module
//				min1 <= rx2;
//				min2 <= rx2;
//				tempmult <= mout;
//				rx4 <= tempmult[15:8];
//				
//			Adding using instantiated module
//				ain1 <=u_i;
//				ain1 <=y_i;
//				tempadd <= aout;
//				if (tempadd[8] == 1) begin
//					ru_y <= tempadd[8:1];
//				end else begin
//					ru_y <= tempadd[7:0];
//				end
				
					state <= S2;
					end// End State1
					
			S2: begin
				rux4_x4y <= rx4*ru_y;
				
//				min1 <= rx4;
//				min2 <= ru_y;
//				tempmult <= mout;
//				rux4_x4y <= tempmult[15:8];
					state <= S3;
					end// End State2
					
			S3: begin
				r3ux4_yx4 <= rux4_x4y*r3;
				
//				min1 <= rux4_x4y;
//				min2 <= r3;
//				tempmult <= mout;
//				r3ux4_yx4 <= tempmult[15:8];
				
					state <= S4;
					end// End State3
					
			S4: begin
				rudx <= u_i*rdx;
				u_out <= r3ux4_yx4+u_i;
				
//				min1 <= u_i;
//				min2 <= rdx;
//				tempmult <= mout;
//				rudx <= tempmult[15:8];
//				
//				// Adding using instantiated module
//				ain1 <=r3ux4_yx4;
//				ain1 <=u_i;
//				tempadd <= aout;
//				if (tempadd[8] == 1) begin
//					u_out <= tempadd[8:1];
//				end else begin
//					u_out <= tempadd[7:0];
//				end
					state <= S5;
					end// End State4
					
			S5: begin
				y_out <= rudx + y_i;
				
// 			Adding using instantiated module
//				ain1 <=rudx;
//				ain1 <=y_i;
//				tempadd <= aout;
//				if (tempadd[8] == 1) begin
//					y_out <= tempadd[8:1];
//				end else begin
//					y_out <= tempadd[7:0];
//				end

					state <= S6;
					end// End State5
					
			S6: begin

				//Write output code Here
				if (start) begin
					state = S0;
				
				end
//				if (count < 10) begin
//					count = count + 1;
//					state = S0;
//					$display("Time %2d: x_out %1d is %2d", $time, x_out, y_out);
//					#10;
//				end 
					
				end// End State6
			default:
				state <= S6;
				
			endcase
			
		end // End Else


	
	end// End always module
	
//	always @ (posedge clk) begin:FSM_S
//				if (count < 10) begin
//					count = count + 1;
//					//state = S0;
//					$display("Time %2d: x_out %1d is %2d", $time, x_out, y_out);
//					#10;
//				end 
//	end

endmodule







Code:
//Verilog testbench module for Project
`timescale 1ns/1ps

module Project1_tb;

  reg clk, rst, start; //reset = active HIGH

  integer  x_in, u_in, y_in;
  wire [7:0] x_out, u_out, y_out;
  
  Project1 uut(

    .clk(clk), .rst(rst), .start(start),
	 .x_in(x_in), .u_in(u_in), .y_in(y_in),
	 .x_out(x_out), .u_out(u_out), .y_out(y_out)
  );
  
	initial begin   
		clk = 0;  
		forever #50 clk = ~clk;  
	end 

	initial begin
		#1000;
		start = 0;
		x_in = 8'b00000010;
		u_in = 8'b00000100;
		y_in = 8'b00000100;
		rst = 1;
		#1000;
		rst = 0;
		#1000;
		start = 1;
		#1000; 
		start = 0;
		#1000;
		rst = 1;
		#1000;
		rst = 0;
		#1000;
		start = 1;
		#50000;
	end

endmodule

You have a mix of blocking and non-blocking assignments on the same always block. That is not only bad practice, as it is really hard to debug.
 

You have a mix of blocking and non-blocking assignments on the same always block. That is not only bad practice, as it is really hard to debug.


I do not know what blocking and non-blocking is or how that affects the result since it did compile and give output once. Can you go into a bit more detail?
 

Status
Not open for further replies.

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top