显示页面 讨论 修订记录 反向链接 本页面只读。您可以查看源文件,但不能更改它。如果您觉得这是系统错误,请联系管理员。 ======OC8051====== 我们以开源IP分享网站 opencores.org 上面的一款开源8051核-oc8051为基础,介绍8051的结构、工作原理、硬件描述的实现及在FPGA上的仿真、移植过程。 \\ oc8051下载地址:https://opencores.org/project/8051 \\ ====关于OC8051==== oc8051与8051微控制器是兼容的。所谓兼容性是指oc8051使用相同的指令集。实现起来当然各有差异。 首先,最重要的区别是有两个阶段的流水线操作。在第一周期指令及其操作数被取出和解码时,第二周期用于计算结果并将其写入存储器。我们通过额外的寄存器来实现这一点,其唯一的任务是将信号延迟一个时钟周期。这是必须的,因为我们的想法是我们已经在第一个周期中设置了所有控制信号,然后将一个不需要的控制信号(例如,保存结果的地址)延迟一个周期。 因为我们可能还需要指令的第二个和第三个字节,所以我们使用24位宽总线的程序ROM。由于处理器设计的需要,我们还使用能够同时写入和读取的内部存储器。 其中一个重要方面是总线控制,由主模块(oc8051_decoder)处理。我们通过控制信号来实现这一点,控制信号连接到在每个总线开始时设置的多路复用器。有了多路复用器,我们设置了谁控制总线 ===oc8051文件组织目录=== * oc8051 * asm 软件相关文件 * hex * in * v * vec * bench 仿真相关文件 * verilog * doc 说明文档 * pdf * src * rtl verilg代码 * verilog * sim RTL仿真文件 * rtl_sim * sw ROM生成工具 * source * syn 工程文件 * src ===oc8051的接口=== {{::oc8051-接口.gif?380|}} {{::oc8051-接口描述.gif.png|}} \\ ====模块描述==== ===1.oc8051_top=== Ports: * -rst reset * -clk clock * -rom_addr Program Memory address * -rom_data Program Memory data * -ea external access: is used when the external memory is accesed * -int0 external interrupt 0 * -int1 external interrupt 1 * -dat_i input for external Data Memory * -dat_o output for external Data Memory * -adr_o external Data Memory address * -we_o writing to external Data Memory * -stb_o strobe * -ack_i acknowlage * -cyc_o cycle * -p0_in, p1_in, p2_in, p3_in port inputs * -p0_out, p1_out, p2_out, p3_out port outputs * -op1, op2, op3 inputs from external Program Memory (3x 8 bitov) * -rxd receive * -txd transmit * -t0, t1 t/c external inputs ===2.oc8051_decoder=== oc8051_decoder是主要模块。 该模块从程序存储器中获取操作代码,然后设置控制信号。 \\ 模块有两个内部信号。 \\ 首先是两位宽的信号-state。 该信号显然保存有关状态的信息,即流水线的状态。 该信号的典型值为b00。 仅当流水线中的指令执行被阻塞时(遇到jumps),才会更改此值。 \\ 第二个内部信号是op,这是寄存器,我们在其中保存操作代码,并且当指令执行需要多于一个时钟周期时,op才会被用到。\\ 这个模块由5个‘always’块组成:\\ * 第一个利用'case'判断流水线状态,通过状态state和操作码op设置控制信号。 * 第二个是用来记住操作码。 * 第三个是设置信号state到期望值。 * 第四个关注输出信号中断返回指令 * 第五个用来产生信号write_x 输入输出信号\\ - clk (in) clock \\ - rst (in) reset\\ - op_in (in) 操作码, 由memory_interface得到,[oc8051_op_select.op1]\\ - eq (in) 比较结果 [oc8051_comp.eq]\\ - ram_rd_sel (out) 选择信号, 读ram地址选择 [oc8051_ram_rd_sel.sel, oc8051_sp.ram_rd_sel]\\ - ram_wr_sel (out) 选择信号,写ram地址选择 [oc8051_ram_wr_sel.sel -r, oc8051_sp.ram_wr_sel -r]\\ - wr (out) 读写位1表示写,0表示读[oc8051_ram_top.wr -r, oc8051_acc.wr -r, oc8051_b_register.wr -r, oc8051_sp.wr-r, oc8051_dptr.wr -r, oc8051_psw.wr -r,oc8051_indi_addr.wr -r, oc8051_ports.wr -r]\\ - src_sel1 (out) 选择alu 资源1 [oc8051_alu_src1_sel.sel -r]\\ - src_sel2 (out) 选择alu 资源 2 [oc8051_alu_src2_sel.sel -r]\\ - src_sel3 (out) 选择alu 资源 3 [oc8051_alu_src3_sel.sel -r]\\ - alu_op (out) alu 操作[oc8051_alu.op_code -r]\\ - psw_set (out) 定义在PSW寄存器中设置哪个标志 cy, ac, ov from alu [oc8051_psw.set -r]\\ - cy_sel (out) alu中进位选择信号 [oc8051_cy_select.cy_sel -r]\\ - comp_sel (out) 比较内容选择 [oc8051_comp.sel]\\ - bit_addr (out) 位寻址 [oc8051_ram_top.bit_addr -r, oc8051_acc.wr_bit -r, oc8051_b_register.wr_bit-r, oc8051_sp.wr_bit -r, oc8051_dptr.wr_bit -r, oc8051_psw.wr_bit -r, oc8051_indi_addr.wr_bit -r, oc8051_ports.wr_bit -r]\\ - pc_wr (out) pc 写 [oc8051_pc.wr]\\ - pc_sel (out) pc 选择[oc8051_pc.pc_wr_sel]\\ - rd (out) rom 中读[oc8051_pc.rd, oc8051_op_select.rd]\\ - reti (out) 中断返回 [pin]\\ - rmw (out) 读-修改-写 指令时有效[oc8051_ports.rmw]\\ - pc_wait (out)\\ \\ ===参考来源===: \\ opencores的设计文档 < oc8051_design > \\ 李全利老师主编的《单片机原理及接口技术》 \\ 网友oldbeginner的开源软核学习笔记:http://xilinx.eetop.cn/space.php?uid=1214938&op=bbs \\ 网友leishangwen的《DE2上使用OC8051运行点灯程序》: \\ https://download.csdn.net/download/leishangwen/5173363 \\ 由于水平所限,难免有不对之处,欢迎指正。 \\