mirror of
https://github.com/aolofsson/oh.git
synced 2025-01-17 20:02:53 +08:00
Cleaned up counter
-Not functional
This commit is contained in:
parent
d8d2d0c20e
commit
a7870ac9de
@ -1,68 +1,45 @@
|
||||
//#############################################################################
|
||||
//# Function: Binary to gray encoder #
|
||||
//# Function: Generic counter #
|
||||
//#############################################################################
|
||||
//# Author: Andreas Olofsson #
|
||||
//# License: MIT (see LICENSE file in OH! repository) #
|
||||
//#############################################################################
|
||||
|
||||
module oh_counter #(parameter DW = 32, // width of data inputs
|
||||
parameter TYPE = "INCREMENT" // also DECREMENT, GRAY, LFSR
|
||||
module oh_counter #(parameter DW = 32 // width of data inputs
|
||||
)
|
||||
(
|
||||
input clk, // clk input
|
||||
input in, // input to count
|
||||
input en, // enable counter
|
||||
input load, // load counter
|
||||
input [DW-1:0] load_data,// load data
|
||||
output [DW-1:0] count, // current count value
|
||||
output carry, // carry out from counter
|
||||
output zero // counter is zero
|
||||
//inputs
|
||||
input clk, // clk input
|
||||
input in, // input to count
|
||||
input en, // enable counter
|
||||
input dir,//0=increment, 1=decrement
|
||||
input autowrap, //auto wrap around
|
||||
input load, // load counter
|
||||
input [DW-1:0] load_data, // input data to load
|
||||
//outputs
|
||||
output [DW-1:0] count, // count value
|
||||
output wraparund // wraparound indicator
|
||||
);
|
||||
|
||||
// local variables
|
||||
reg [DW-1:0] count;
|
||||
reg carry;
|
||||
wire [DW-1:0] count_in;
|
||||
wire carry_in;
|
||||
|
||||
// configure counter based on type
|
||||
generate
|
||||
if(TYPE=="INCREMENT")
|
||||
begin
|
||||
assign {carry_in,count_in[DW-1:0]} = count[DW-1:0] + in;
|
||||
end
|
||||
else if(TYPE=="DECREMENT")
|
||||
begin
|
||||
assign count_in[DW-1:0] = count[DW-1:0] + in;
|
||||
end
|
||||
else if (TYPE=="GRAY")
|
||||
begin
|
||||
initial
|
||||
$display ("NOT IMPLEMENTED");
|
||||
end
|
||||
else if (TYPE=="LFSR")
|
||||
begin
|
||||
initial
|
||||
$display ("NOT IMPLEMENTED");
|
||||
end
|
||||
endgenerate
|
||||
|
||||
//Select count direction
|
||||
assign count_in[DW-1:0] = dir ? count[DW-1:0] - in :
|
||||
count[DW-1:0] + in ;
|
||||
|
||||
// counter
|
||||
always @(posedge clk)
|
||||
if(load)
|
||||
begin
|
||||
carry <= 1'b0;
|
||||
count[DW-1:0] <= load_data[DW-1:0];
|
||||
end
|
||||
else if (en)
|
||||
begin
|
||||
carry <= carry_in;
|
||||
count[DW-1:0] <= count_in[DW-1:0];
|
||||
end
|
||||
|
||||
count[DW-1:0] <= load_data[DW-1:0];
|
||||
else if (en & ~(wraparound & ~autowrap))
|
||||
count[DW-1:0] <= count_in[DW-1:0];
|
||||
|
||||
// counter expired
|
||||
assign zero = ~(count[DW-1:0]);
|
||||
|
||||
assign wraparound = (dir & en & ~(|count[DW-1:0])) |
|
||||
(~dir & en & (&count[DW-1:0]));
|
||||
|
||||
endmodule // oh_counter
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user