电路仿真新手
需求是搭建一个学习用的最小SoC,能运行简单C程序。痛点在于外设选择和中断控制器的集成。必备外设:CPU、指令和数据存储器(可以用一块BRAM模拟)、系统定时器(比如RISC-V的mtime/mtimecmp)、一个UART(用于串口打印)、GPIO(用于输入输出验证)。这些足够你写个“Hello World”并闪烁LED了。中断控制器(PLIC)设计:RISC-V标准有PLIC规范,你需要一个实现。可以从GitHub上找开源的Verilog PLIC(例如来自lowRISC或Sifive的)。设计要点:1. 中断号分配:为每个外设(如UART、Timer、GPIO)分配唯一的中断ID。2. 优先级:简单实现可以固定优先级或可配置。3. 连接:外设的中断请求线连接到PLIC的多个输入,PLIC的输出连接到CPU的外部中断输入。在VexRiscv中,通常有externalInterrupt总线。4. 寄存器映射:PLIC本身有一组寄存器(使能、优先级、阈值等)需要映射到内存空间,CPU通过读写这些寄存器来管理中断。总线设计:建议用Wishbone B4,因为它轻量,文档多。设计一个Wishbone互联(比如交叉开关或简单共享总线),将CPU作为主设备,所有外设和内存作为从设备。注意总线仲裁。搭建步骤:1. 获取VexRiscv CPU核(Verilog代码)和Wishbone接口的版本。2. 编写顶层模块,实例化CPU、总线互联、BRAM(作为内存)、UART、Timer、GPIO和PLIC。3. 实现地址解码器,将不同从设备映射到不同地址段。4. 连接中断线:外设中断输出 -> PLIC输入 -> PLIC输出 -> CPU中断输入。5. 编写链接脚本和启动代码(设置栈、初始化中断向量等)。6. 用C写个测试程序(比如通过UART打印,用定时器延时,用GPIO控制LED),编译成二进制加载到BRAM。7. 上FPGA测试。注意事项:确保复位后CPU从正确的地址(通常是0)开始执行;小心总线时序,尤其是多个主设备时;中断服务程序要正确保存和恢复上下文。先让系统无中断运行起来,再逐步使能中断。
