| // borrowed with some modifications from |
| // http://www.ee.ed.ac.uk/~gerard/Teach/Verilog/manual/Example/lrgeEx2/cooley.html |
| module up3down5(clock, data_in, up, down, carry_out, borrow_out, count_out, parity_out); |
| |
| input [8:0] data_in; |
| input clock, up, down; |
| |
| output reg [8:0] count_out; |
| output reg carry_out, borrow_out, parity_out; |
| |
| reg [9:0] cnt_up, cnt_dn; |
| reg [8:0] count_nxt; |
| |
| always @(posedge clock) |
| begin |
| cnt_dn = count_out - 3'b 101; |
| cnt_up = count_out + 2'b 11; |
| |
| case ({up,down}) |
| 2'b 00 : count_nxt = data_in; |
| 2'b 01 : count_nxt = cnt_dn; |
| 2'b 10 : count_nxt = cnt_up; |
| 2'b 11 : count_nxt = count_out; |
| default : count_nxt = 9'bX; |
| endcase |
| |
| parity_out <= ^count_nxt; |
| carry_out <= up & cnt_up[9]; |
| borrow_out <= down & cnt_dn[9]; |
| count_out <= count_nxt; |
| end |
| |
| endmodule |