Concept Flow - Up-down counter with direction control
Start
Check direction
Up
Increment
Update counter
Output
End
The counter checks the direction input; if up, it increments the count; if down, it decrements the count, then updates the output.
always @(posedge clk or posedge reset) begin if (reset) count <= 0; else if (dir) count <= count + 1; else count <= count - 1; end
| Step | reset | dir | count before | Condition | Action | count after | Output |
|---|---|---|---|---|---|---|---|
| 1 | 1 | X | X | reset=1 | Reset count to 0 | 0 | 0 |
| 2 | 0 | 1 | 0 | dir=1 | Increment count | 1 | 1 |
| 3 | 0 | 1 | 1 | dir=1 | Increment count | 2 | 2 |
| 4 | 0 | 0 | 2 | dir=0 | Decrement count | 1 | 1 |
| 5 | 0 | 0 | 1 | dir=0 | Decrement count | 0 | 0 |
| 6 | 0 | 1 | 0 | dir=1 | Increment count | 1 | 1 |
| 7 | 1 | X | 1 | reset=1 | Reset count to 0 | 0 | 0 |
| Variable | Start | After 1 | After 2 | After 3 | After 4 | After 5 | After 6 | After 7 |
|---|---|---|---|---|---|---|---|---|
| count | X | 0 | 1 | 2 | 1 | 0 | 1 | 0 |
| reset | X | 1 | 0 | 0 | 0 | 0 | 0 | 1 |
| dir | X | X | 1 | 1 | 0 | 0 | 1 | X |
Up-down counter with direction control in Verilog: - Use always block triggered by posedge clk or reset - If reset=1, count=0 (highest priority) - Else if dir=1, count increments - Else count decrements - Output count value each clock cycle