Sendzimir 发表于 2013-11-30 14:05:37

Verilog写的一段简易CPU

本帖最后由 Sendzimir 于 2013-11-30 14:13 编辑

module CPU(clk, led, segment, digit);
        input clk;

        // disable LEDs and 7 segment display
        output led;
        output segment;
        output digit;
        assign segment = 0;
        assign digit = 'hff;

        // prescaler
        reg devide = 0;

        reg rLed = 0;
        assign led = rLed;

        `define INIT 1
        `define EVALUATE 2

        reg ram ;// 256 words ram
        reg pc = 0;// program counter
        reg currentState = `INIT;
        reg nextState = `INIT;
        reg cmd;
        reg 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 = `CMD_LED_ON;
                                pc = pc + 1; ram = `CMD_LOAD_NEXT_TO_ACCU;
                                pc = pc + 1; ram = 'h03;// 3 to accu
                                pc = pc + 1; ram = `CMD_WAIT_UNTIL_ACCU_IS_ZERO;
                                pc = pc + 1; ram = `CMD_LED_OFF;
                                pc = pc + 1; ram = `CMD_LOAD_NEXT_TO_ACCU;
                                pc = pc + 1; ram = 'h09;// 9 to accu
                                pc = pc + 1; ram = `CMD_WAIT_UNTIL_ACCU_IS_ZERO;
                                pc = pc + 1; ram = `CMD_JUMP_TO_ZERO;
                                pc = 0;
                                nextState = `EVALUATE;
                        end
                        `EVALUATE: begin
                                cmd = ram;
                                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 + 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

Sendzimir 发表于 2013-11-30 14:08:18

本帖最后由 Sendzimir 于 2013-11-30 14:16 编辑

用现有逻辑芯片搭建直接运行高级语言硬件
http://www.amobbs.com/forum.php?mod=viewthread&tid=5560754&page=1&extra=

Sendzimir 发表于 2013-11-30 14:09:34

这段程序运行在Xilinx Spartan-3 Starter Kit,对Verilog不太了解,大家谁帮忙解释下上面这段程序。

cxhy 发表于 2013-12-1 10:59:43

帮顶一顶                  

fsl 发表于 2018-8-12 22:26:07

我是来学习的,谢谢楼主分享!

dongwang_fl 发表于 2018-8-14 16:41:32

我是来学习的,谢谢楼主分享!

justdomyself 发表于 2018-8-15 13:25:32

先预设好 子命令然后状态机一条条的执行

unnormal 发表于 2018-9-9 09:16:38

学习一下   谢谢分享

qingyin2009 发表于 2018-9-9 10:02:22

lz帖子标题语意不明,看了回帖才知道你要干嘛

huangqi412 发表于 2018-9-9 20:23:46

写个求助会死
页: [1]
查看完整版本: Verilog写的一段简易CPU