////////////////////////////////////////////////////////////////////////////////
///
/// Solution to LSU EE 3755 Fall 2001 Homework 2
///
////////////////////////////////////////////////////////////////////////////////
/// Problem 1 Solution
///
module uni_striped_c(us,v);
input [31:0] v;
output us;
reg us;
integer i;
reg [4:0] width, this;
reg last;
reg [1:0] state;
parameter st_in_first_stripe = 0;
parameter st_okay_so_far = 1;
parameter st_not_uniform = 2;
always @( v )
begin
state = st_in_first_stripe;
width = 0;
this = 0;
last = 1;
for(i=0; i<32; i=i+1)
begin
if( state == st_in_first_stripe )
begin
if( v[i] == last )
begin
width = width + 1;
end
else
begin
state = i ? st_okay_so_far : st_not_uniform;
this = width - 1;
end
end
else
begin
if( v[i] == last )
begin
this = this - 1;
end
else
begin
if( this ) state = st_not_uniform;
this = width - 1;
end
end
last = v[i];
end
us = state == st_okay_so_far ? 1 : 0;
end
endmodule
////////////////////////////////////////////////////////////////////////////////
/// Problem 2 Solution
///
module uni_striped_s(us,bit,clk,start);
input bit, clk, start;
output us;
reg us;
reg [5:0] width, this;
reg last;
reg [1:0] state;
parameter st_in_first_stripe = 0;
parameter st_okay_so_far = 1;
parameter st_not_uniform = 2;
always @( posedge clk )
begin
if( start )
begin
state = st_in_first_stripe;
width = 0;
this = 0;
last = 1;
us = 0;
end
if( state == st_in_first_stripe )
begin
if( bit == last )
begin
width = width + 1;
end
else
begin
state = start ? st_not_uniform : st_okay_so_far;
this = width - 1;
end
end
else
begin
if( bit == last )
begin
if( !this ) state = st_not_uniform;
this = this - 1;
end
else
begin
if( this ) state = st_not_uniform;
this = width - 1;
end
end
us = state == st_not_uniform ? 0 : 1;
last = bit;
end
endmodule
////////////////////////////////////////////////////////////////////////////////
/// Problem 3
///
// Labels (in comments) have been added to the module identifying
// assignments, ifpart, etc. These labels appear in the image below.
// Note: The left- and right-shift components are not actual hardware,
// just a renumbering of bit positions and insertion of a zero.
// Solution
// Also available in PDF: http://www.ece.lsu.edu/ee3755/2001f/hw2solp3.pdf
module andyetanotherif(x,a);
input [7:0] a;
output x;
reg [7:0] x;
always @( a )
begin
x = a; // Assignment S1
if( a[0] ) // If 1, Condition C1
begin // If Part 1
x = x + 2; // Assignment S2
if( a[1] & a[2] ) // If 2, Condition C2
// If Part 2
x = x + 1; // Assignment S3
end
else
begin // Else Part 1 (part of If 1)
if( a[3] ^ a[4] ) // If 3, Condition C3
// If Part 3
x = x + ( a >> 1 ); // Assignment S4
else
// Else Part 3
x = x + ( a << 1 ); // Assignment S5
x = 3 * x; // Assignment S6
end // End of Else Part 1
if( x[7] ) // If 4, Condition C4
// If Part 4
x = x - 1; // Assignment S7
end
endmodule