如何在ram中直接输入汇编程序
时间:10-02
整理:3721RD
点击:
大家好
我现在做了一个简单的8bit的处理器
处理器一共由8个模块构成他们分别是:
U1:tri-stage(数据控制器) U2:accumulator(累加器) U3:register(指令寄存器) U4:ALU(算数器) U5:control logci(状态控制) U6 PG counter(程序计数) U7 multiplexer(地址多路器)
处理器的名字叫hibikino,下面是hibikino的模块记述
//..............................................hibi kino code........................................//
module hibikino (data,addr,clock,reset,halt,mem_wr,mem_rd);
input [7:0] data;
input clock,reset;
output halt,mem_wr,mem_rd;
output [4:0] addr;
wire [7:0] data,accum,alu_out;
wire [4:0] addr,ir_addr,pc_addr;
wire [2:0] opcode;
ts U1 (.accum(accum),.data(data),.data_en(data_en));
register U2 (.clock(clock),.reset(reset),.control(load_ac),.ou t(accum),.in(alu_out));
register U3 (.clock(clock),.reset(reset),.in(data),.control(lo ad_ir),.out({opcode,ir_addr}));
alu U4 (.alu_out(alu_out),.zero(zero),.data(data),.accum( accum),.opcode(opcode));
ctltop U5 (.zero(zero),.opcode(opcode),.clock(clock),.reset( reset),.halt(halt),.mem_wr(mem_wr),.mem_rd(mem_rd) ,
.load_ir(load_ir),.load_pc(load_pc),.inc_pc(inc_pc ),.load_ac(load_ac),.data_en(data_en),.fetch(fetch ));
counter U6 (.clock(clock),.reset(reset),.load_pc(load_pc),.in c_pc(inc_pc),.pc_addr(pc_addr),.ir_addr(ir_addr));
mux U7 (.ir_addr(ir_addr),.pc_addr(pc_addr),.fetch(fetch) ,.addr(addr));
endmodule
//..............................................hibi kino code........................................//
hibikino处理器的外围模块只有一个RAM,时钟信号准备由testbench给予。
RAM的功能代码暂时是这么写的,其中数据总线只有一条。读写信号分开。
//..............................................RAM code..........................................//
module ram(addr,mem_rd,mem_wr,data);
inout [7:0] data;
input [4:0] addr;
input mem_rd,mem_wr;
reg [7:0] mem[0:300];
assign data = (mem_rd)? mem[addr] : 8'bzzzzzzzz;
always @(posedge mem_wr)begin
mem[addr]<=data;
end
endmodule
//..............................................RAM code..........................................//
现在的问题是,我有一个简单的汇编程序,老师让我直接在RAM的功能代码里输入。我想请教大家具体应该怎么记述?
汇编程序的代码贴给大家
//........................RAM's instruction area.................................//
00 JMP 03 //00:表示地址 JMP:命令 03:指向地址
01
02
03 LDA 1B
04 STO 1C
05 ADD 1A
06 STO 1B
07 LDA 1C
08 STO 1A
09 XOR 1D
0A SKZ
0B JMP 03
0C HALT
//........................RAM's instruction area.................................//
上述这个简单的汇编程序,经过13个周期 HALT就会被触发,导致整个程序停止运行
下面是保存在RAM数据区域的初期值
//........................RAM's data area.................................//
1A 1
1B 0
1C 1
1D 144
//........................RAM's data area.................................//
ps 不是建立一个hex文件 然后用¥ readmemb(。)这个指令,我是想把汇编程序直接输入进RAM中,然后把RAM和hibikino处理器整个进行testbench。还有hibikino中的每个模块都已经testbench了,基本都没问题。
我现在做了一个简单的8bit的处理器
处理器一共由8个模块构成他们分别是:
U1:tri-stage(数据控制器) U2:accumulator(累加器) U3:register(指令寄存器) U4:ALU(算数器) U5:control logci(状态控制) U6 PG counter(程序计数) U7 multiplexer(地址多路器)
处理器的名字叫hibikino,下面是hibikino的模块记述
//..............................................hibi kino code........................................//
module hibikino (data,addr,clock,reset,halt,mem_wr,mem_rd);
input [7:0] data;
input clock,reset;
output halt,mem_wr,mem_rd;
output [4:0] addr;
wire [7:0] data,accum,alu_out;
wire [4:0] addr,ir_addr,pc_addr;
wire [2:0] opcode;
ts U1 (.accum(accum),.data(data),.data_en(data_en));
register U2 (.clock(clock),.reset(reset),.control(load_ac),.ou t(accum),.in(alu_out));
register U3 (.clock(clock),.reset(reset),.in(data),.control(lo ad_ir),.out({opcode,ir_addr}));
alu U4 (.alu_out(alu_out),.zero(zero),.data(data),.accum( accum),.opcode(opcode));
ctltop U5 (.zero(zero),.opcode(opcode),.clock(clock),.reset( reset),.halt(halt),.mem_wr(mem_wr),.mem_rd(mem_rd) ,
.load_ir(load_ir),.load_pc(load_pc),.inc_pc(inc_pc ),.load_ac(load_ac),.data_en(data_en),.fetch(fetch ));
counter U6 (.clock(clock),.reset(reset),.load_pc(load_pc),.in c_pc(inc_pc),.pc_addr(pc_addr),.ir_addr(ir_addr));
mux U7 (.ir_addr(ir_addr),.pc_addr(pc_addr),.fetch(fetch) ,.addr(addr));
endmodule
//..............................................hibi kino code........................................//
hibikino处理器的外围模块只有一个RAM,时钟信号准备由testbench给予。
RAM的功能代码暂时是这么写的,其中数据总线只有一条。读写信号分开。
//..............................................RAM code..........................................//
module ram(addr,mem_rd,mem_wr,data);
inout [7:0] data;
input [4:0] addr;
input mem_rd,mem_wr;
reg [7:0] mem[0:300];
assign data = (mem_rd)? mem[addr] : 8'bzzzzzzzz;
always @(posedge mem_wr)begin
mem[addr]<=data;
end
endmodule
//..............................................RAM code..........................................//
现在的问题是,我有一个简单的汇编程序,老师让我直接在RAM的功能代码里输入。我想请教大家具体应该怎么记述?
汇编程序的代码贴给大家
//........................RAM's instruction area.................................//
00 JMP 03 //00:表示地址 JMP:命令 03:指向地址
01
02
03 LDA 1B
04 STO 1C
05 ADD 1A
06 STO 1B
07 LDA 1C
08 STO 1A
09 XOR 1D
0A SKZ
0B JMP 03
0C HALT
//........................RAM's instruction area.................................//
上述这个简单的汇编程序,经过13个周期 HALT就会被触发,导致整个程序停止运行
下面是保存在RAM数据区域的初期值
//........................RAM's data area.................................//
1A 1
1B 0
1C 1
1D 144
//........................RAM's data area.................................//
ps 不是建立一个hex文件 然后用¥ readmemb(。)这个指令,我是想把汇编程序直接输入进RAM中,然后把RAM和hibikino处理器整个进行testbench。还有hibikino中的每个模块都已经testbench了,基本都没问题。
自己先顶起来
没人知道吗
既然是testbench,用readhex就可以啊。
如果要上FPGA,那么在生成RAM的core的地方可指定ram的初期值文件。
用initial在0ns时给mem[addr]初始化赋值。可以直接写在ram模块中,反正你不用综合ram,只是写tb。不过我觉得用 readmemb更靠谱!
用initial在0ns时给mem[addr]初始化赋值。可以直接写在ram模块中,反正你不用综合ram,只是写tb。不过我觉得用 readmemb更靠谱!
四楼正解.
在RAM 里边做一个task,用来readmem(hex).
CPU仿真时怎么可能认识你的汇编代码呢?CPU仿真用的是编译器编译生成的HEX或BIN文件,然后用readmem来初值化。