EmbDev.net

Forum: FPGA, VHDL & Verilog Gray counter verilog


von Gio97 (Guest)


Attached files:

Rate this post
useful
not useful
Hi guys!
I want to write the verilog code for a 8-bit gray counter. I added in 
attach the code and the testbech. For some reason I cannot understand, I 
cannot see as outputs the counting, I have only "z" value as output. 
Please could you help me? Thank you very much!

von W. M. (thematsche)


Attached files:

Rate this post
useful
not useful
Try this out with

   iverilog gray_counter_tb.v -o gray_counter

regards

von Gio97 (Guest)


Rate this post
useful
not useful
This is not very clear. Where is the error? Thanks

von VHDL hotline (Guest)


Rate this post
useful
not useful
The order of ports in your DUT does not match the order in the 
instantiation. To avoid such issues, you should connect the ports by 
name, i.e. .clk(clk).

von Gio97 (Guest)


Rate this post
useful
not useful
Thank you! I solved the problem. I want that the counter stops when it 
reaches the maximum value until I give a new clear signal. Hence, I 
added an "if" but it doesn't work because the counter keeps counting and 
then stops when it reaches "10000000". Could you help me?
The code is presented here

1
 module gray_counter (clk, clear, count, out);
2
3
input clk, clear, count; 
4
output wire [7:0] out;
5
6
wire clk;
7
wire clear;
8
wire count;
9
reg [7:0] temp_out;
10
11
always @ (posedge clk)
12
begin
13
  if(clear) 
14
    temp_out <= 8'b00000000;  
15
  else if(count && temp_out != 8'b11111111) 
16
    temp_out <= temp_out + 1'b1;
17
end
18
19
assign out = {temp_out[7], (temp_out[7]^temp_out[6]), (temp_out[6]^temp_out[5]), (temp_out[5]^temp_out[4]), (temp_out[4]^temp_out[3]), (temp_out[3]^temp_out[2]), (temp_out[2]^temp_out[1]), (temp_out[1]^temp_out[0])};
20
21
endmodule //end module gray_counter

: Edited by Moderator
von Gio97 (Guest)


Rate this post
useful
not useful
I tried to write
1
  else if(count && out != 8'b11111111)
2
    temp_out <= temp_out + 1'b1;
instead of
1
  else if(count && temp_out != 8'b11111111)
2
    temp_out <= temp_out + 1'b1;
and now it seems working but I cannot understand why.

: Edited by Moderator
von Klakx (Guest)


Rate this post
useful
not useful
I think it only valid to read on an output signal if you declare it 
"output reg.."
1
//output wire [7:0] out;
2
output reg [7:0] out;

however, out and temp_out are also different by logic.

Please log in before posting. Registration is free and takes only a minute.
Existing account
Do you have a Google/GoogleMail account? No registration required!
Log in with Google account
No account? Register here.