$30
Objective
In this lab you will use a register and a counter to design a simple electric wheel of fortune game machine.
Introduction
The wheel of fortune you are designing works as follows. At the startup, the LED lights continuously rotate around using a bit pattern “00000001”, and at the same time the seven segment display continuously increments at a fast speed. The digit starts from 0000 and increments to FFFF and repeats. When a user presses a stop button, the LED rotation stops and the seven segment displays the number caught at the positive transition of the stop button press. When the user releases the button, it starts the whole process again, i.e., the LED lights rotates around, and the seven segment display increments the four digit hex number at a fast speed. The LED movements should be slow enough to be visible. However, the numbers on the seven segment display should be fast enough, so that it is hard to recognize except when it is stopped. In order to accomplish this, we need to create the following modules
A ring counter (or shift register) to rotate LEDs
A counter to increment number
The diagram of the system is shown below:
Lab Procedure
Build an 8-bit ring counter
A ring counter is a Shift Register (a cascade connection of flip-flops) with the output of the last flip flop connected to the input of the first. It is initialized such that only one of the flip flop output is 1 while the reminder is 0. The 1 bit is circulated so the state repeats every 8 clock cycles. Below is the circuit for an 8-bit ring counter. A skeleton of the Verilog description is provided, with some details missing. Your task is to fill in the blanks.
module ring_counter(clk, reset, stop, direction, Q);
input clk, reset, stop, direction;
output [7:0] Q;
reg [7:0] Qtemp = 8'b00000001;
always @(posedge clk)
begin
if (reset == 1'b1)
Qtemp <= 8'b00000001;
else if (stop == 1'b1)
Qtemp <= 8'b00000001;
else if (direction == 1'b1)
Qtemp <= {Qtemp[0],Qtemp[7:1]}; //shifting right
else
Qtemp <= {Qtemp[6:0],Qtemp[7]}; //shifting left
end
assign Q = Qtemp;
endmodule
Build a bidirectional (up/down) counter.
Bidirectional counters, also known as Up/Down counters, are capable of counting in either up or down direction through any given count sequence and they can be reversed at any point within their count sequence by using an additional control input as shown below. Also the counter should have the functions to reset the count to zero, and stop counting. Again, a skeleton of the Verilog description of the counter is provided, with some details erased. Your task is to fill in the blanks.
module counter(clk, reset, stop, direction, count);
input clk, direction; // clock, direction for counting up or down
input reset, stop;
output reg [3:0] count=0;
always @(posedge clk)
begin
if (reset == 1'b1)
count <= 0; // reset the counter
else if (stop == 1'b1)
count <= count; // do nothing
else if (direction == 1'b1)
count <= count + 1; // count up
else
count <= count - 1; // count down
end
endmodule
Build top-level LED wheel of fortune
Based on the diagram in the first page, write Verilog code to implement the wheel of fortune circuit. Once again, a skeleton of the Verilog description is provided, with some details erased. Fill in the blanks so your Verilog description exactly matches the circuit in the first page.
module wheeloffortune(clock, reset, stop, direction, LEDs, count);
input clock, reset, stop, direction;
output [7:0] LEDs;
output [3:0] count;
ring_counter U1(clock, reset, stop, direction, LEDs); // instantiate the ring counter
counter U2(clock, reset, stop, direction, count); // instantiate counter
endmodule
Testbench: create a Verilog testbench to test your wheel of fortune module and perform the simulation to check if it is working.
module test;
reg clock, reset, stop, direction; // input
wire [7:0] LEDs; // output
wire [3:0] count; // output
wheeloffortune uut(clock, reset, stop, direction, LEDs, count); // instantiate the module
initial
begin
clock = 0; // start the simulation
forever #5 clock = ~clock; // toggle clock
#500 $finish; // stop the simulation
end
initial begin
$dumpfile("dump.vcd"); $dumpvars(1, test); // create a waveform file
$monitor( "stop= %b, LEDs = %b, count= %b", stop, LEDs, count); // print the outputs
// Initialize Inputs
reset = 1; // reset the circuit
stop = 0; // stop the simulation
direction = 1; // counting up
#23 reset = 0; // disable reset, start counting
#80 stop = 1; // pause counting and light movement
#20 stop = 0; // resume counting and light movement
#20 direction =0; // change direction of moving lights and couting
#150 stop = 1; // pause counting and light movement
#20 stop = 0; // resume counting and light movement
#50 reset = 1; // reset the circuit
#20 $finish; // stop the simulation
end
endmodule
Take a screenshot of your wavefroms.
Add the following information as comments to the beginning of your code. Make sure to click the “Save” button to save your project, then take a screenshot of your code.
// Author: Name
// Lab 12: Wheel-of-Fortune
// Link to your project
Copy the link of your design from the address bar of the browser.
On the Blackboard, click on Lab 12. Attach the screenshots from the first two steps and paste the link from Step 3 into the Comments area, then click the “Submit” button.
No report is needed for this lab.
https://www.edaplayground.com/x/mtrR