|
本帖最后由 Sendzimir 于 2013-11-30 14:13 编辑
- module CPU(clk, led, segment, digit);
- input clk;
- // disable LEDs and 7 segment display
- output [7:0] led;
- output [7:0] segment;
- output [8:0] digit;
- assign segment[7:0] = 0;
- assign digit[8:0] = 'hff;
- // prescaler
- reg [32:0] devide = 0;
- reg [7:0] rLed = 0;
- assign led = rLed;
- `define INIT 1
- `define EVALUATE 2
-
- reg [15:0] ram [0:255]; // 256 words ram
- reg [7:0] pc = 0; // program counter
- reg [7:0] currentState = `INIT;
- reg [7:0] nextState = `INIT;
- reg [15:0] cmd;
- reg [15:0] accu;
- reg slowClock;
- `define CMD_LED_ON 1
- `define CMD_LED_OFF 2
- `define CMD_LOAD_NEXT_TO_ACCU 3
- `define CMD_WAIT_UNTIL_ACCU_IS_ZERO 4
- `define CMD_JUMP_TO_ZERO 5
- always @(posedge clk) begin
- if (devide == 0) begin
- devide <= 5000000;
- slowClock <= ~slowClock;
- end else devide <= devide - 1;
- end
-
- always @(posedge slowClock) begin
- currentState = nextState;
- case (currentState)
- `INIT: begin
- pc = 0; ram[pc] = `CMD_LED_ON;
- pc = pc + 1; ram[pc] = `CMD_LOAD_NEXT_TO_ACCU;
- pc = pc + 1; ram[pc] = 'h03; // 3 to accu
- pc = pc + 1; ram[pc] = `CMD_WAIT_UNTIL_ACCU_IS_ZERO;
- pc = pc + 1; ram[pc] = `CMD_LED_OFF;
- pc = pc + 1; ram[pc] = `CMD_LOAD_NEXT_TO_ACCU;
- pc = pc + 1; ram[pc] = 'h09; // 9 to accu
- pc = pc + 1; ram[pc] = `CMD_WAIT_UNTIL_ACCU_IS_ZERO;
- pc = pc + 1; ram[pc] = `CMD_JUMP_TO_ZERO;
- pc = 0;
- nextState = `EVALUATE;
- end
- `EVALUATE: begin
- cmd = ram[pc];
- pc = pc + 1;
- case (cmd)
- `CMD_LED_ON: rLed = 1;
- `CMD_LED_OFF: rLed = 0;
- `CMD_LOAD_NEXT_TO_ACCU: begin
- accu = ram[pc];
- pc = pc + 1;
- end
- `CMD_WAIT_UNTIL_ACCU_IS_ZERO: begin
- if (accu != 0) begin
- pc = pc - 1;
- accu = accu - 1;
- end
- end
- `CMD_JUMP_TO_ZERO: pc = 0;
- endcase
- end
- endcase
- end
- always @(negedge slowClock) begin
- currentState <= nextState;
- end
- endmodule
复制代码 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|