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:16 编辑
用现有逻辑芯片搭建直接运行高级语言硬件
http://www.amobbs.com/forum.php?mod=viewthread&tid=5560754&page=1&extra= 这段程序运行在Xilinx Spartan-3 Starter Kit,对Verilog不太了解,大家谁帮忙解释下上面这段程序。 帮顶一顶 我是来学习的,谢谢楼主分享! 我是来学习的,谢谢楼主分享! 先预设好 子命令然后状态机一条条的执行 学习一下 谢谢分享 lz帖子标题语意不明,看了回帖才知道你要干嘛 写个求助会死
页:
[1]