feat(board): 新增课程新版中断测试上板(多级中断 + 附加 SLL/SB/BLTU)
- programs/risc-v-intrupt-sllsb.asm/.hex: 课程原始程序(344 字,hex 已去掉 Logisim
的 v2.0 raw 头),保留原文件以便追溯
- tools/adapt_intrupt_sllsb.py: 把它适配到本 CPU 上板(只改 ROM 内容,地址不变)
- 课程用 addi a7,zero,34 + ecall 显示,本 CPU 里那是空操作 -> 每条显示点原地换成
一次调用:主程序 jal ra,DISP_DLY;ISR 用 add a7,a0,zero + jal a0,DISP_DLY_ISR
(三个 ISR 都没保存 ra,所以 ISR 版把链接寄存器放 a0、显示值放 a7)
- DISP_DLY / DISP_DLY_ISR 各 8 条,追加在 uret 之后,中断入口 0x0AC/0x240/0x3E8 不变
- 返回地址存 sp+256(越过 ISR 最多 192 字节的栈区),嵌套中断也破坏不了
- 脚本自带跳转目标自检(曾发现 ISR 侧 jal 偏移少算一条指令的问题)
- srcs/board/cpu21_board_top.v: 新增 RISC_V_INTRUPT_SLLSB_ROM 分支(ROM 选择、
CPU 分频用 CLK_DIV_INTRUPT、中断向量 0x0AC/0x240/0x3E8)
- srcs/board/risc-v-intrupt-sllsb.vh: 生成的 ROM 初始化(1024 字,程序 360 字)
- create_project.tcl: 新增 use_intrupt_sllsb 开关(默认 1,已把 ccab 置 0)
实测:Vivado 2020.2 建工程 + 综合通过(sources_1 verilog_define =
RISC_V_INTRUPT_SLLSB_ROM,synth_design Complete! 100%)
This commit is contained in:
@@ -71,9 +71,14 @@ add_files -norecurse -fileset sources_1 [list \
|
||||
set_property file_type {Verilog Header} \
|
||||
[get_files "$origin_dir/srcs/board/cpu21_board_rom.vh"]
|
||||
|
||||
# 默认跑哪个内置程序:中断测试程序优先,其次是扫雷,最后是走马灯 demo。
|
||||
# 修改下面两个开关即可切换板上程序;同一时间只应启用一个。
|
||||
set use_intrupt_ccab 1
|
||||
# 默认跑哪个内置程序(同一时间只应启用一个):
|
||||
# use_intrupt_sllsb = 1 -> 课程新版「多级中断测试 + 附加 SLL/SB/BLTU」
|
||||
# (programs/risc-v-intrupt-sllsb.asm / .hex)
|
||||
# use_intrupt_ccab = 1 -> 上一版中断测试(programs/risc-v-intrupt-ccab.*)
|
||||
# use_saolei = 1 -> 扫雷(saolei/tools/build.ps1 生成)
|
||||
# 三个都为 0 -> 走马灯 demo
|
||||
set use_intrupt_sllsb 1
|
||||
set use_intrupt_ccab 0
|
||||
set use_saolei 0
|
||||
|
||||
# 中断测试程序的 ROM 初始化。
|
||||
@@ -85,6 +90,15 @@ if {[file exists $intrupt_ccab_rom]} {
|
||||
puts "NOTE: 还没有 $intrupt_ccab_rom"
|
||||
}
|
||||
|
||||
# 课程新版中断测试(附加 SLL/SB/BLTU)的 ROM 初始化。
|
||||
set intrupt_sllsb_rom "$origin_dir/srcs/board/risc-v-intrupt-sllsb.vh"
|
||||
if {[file exists $intrupt_sllsb_rom]} {
|
||||
add_files -norecurse -fileset sources_1 [list $intrupt_sllsb_rom]
|
||||
set_property file_type {Verilog Header} [get_files $intrupt_sllsb_rom]
|
||||
} else {
|
||||
puts "NOTE: 还没有 $intrupt_sllsb_rom(用 tools/hex2vh.py 生成)"
|
||||
}
|
||||
|
||||
# 扫雷程序的 ROM 初始化(由 saolei/tools/build.ps1 生成,可能还不存在)。
|
||||
# 综合/仿真时定义宏 SAOLEI_ROM 就会用它替换上面的跑马灯 ROM。
|
||||
set saolei_rom "$origin_dir/srcs/board/cpu21_saolei_rom.vh"
|
||||
@@ -95,9 +109,12 @@ if {[file exists $saolei_rom]} {
|
||||
puts "NOTE: 还没有 $saolei_rom —— 需要先跑 saolei/tools/build.ps1 生成"
|
||||
}
|
||||
|
||||
# 关键:sources_1 定义 SAOLEI_ROM,cpu21_board_top.v 里的 `ifdef 链才会用扫雷 ROM
|
||||
# (该宏只影响综合用的 sources_1,仿真 fileset 仍各自用 tb 自带的 ROM)
|
||||
if {$use_intrupt_ccab && [file exists $intrupt_ccab_rom]} {
|
||||
# 关键:sources_1 里定义对应宏,cpu21_board_top.v 的 `ifdef 链才会选中那个 ROM
|
||||
# (宏只影响综合用的 sources_1;仿真 fileset 仍各自用 tb 自带的 ROM)
|
||||
if {$use_intrupt_sllsb && [file exists $intrupt_sllsb_rom]} {
|
||||
set_property verilog_define {RISC_V_INTRUPT_SLLSB_ROM} [get_filesets sources_1]
|
||||
puts "NOTE: sources_1 已定义 RISC_V_INTRUPT_SLLSB_ROM —— 上板跑「中断测试 + SLL/SB/BLTU」"
|
||||
} elseif {$use_intrupt_ccab && [file exists $intrupt_ccab_rom]} {
|
||||
set_property verilog_define {RISC_V_INTRUPT_CCAB_ROM} [get_filesets sources_1]
|
||||
puts "NOTE: sources_1 已定义 RISC_V_INTRUPT_CCAB_ROM —— 上板跑 risc-v-intrupt-ccab"
|
||||
} elseif {$use_saolei && [file exists $saolei_rom]} {
|
||||
@@ -142,7 +159,9 @@ foreach fs {sim_1 sim_2} {
|
||||
# ---------------------------------------------------------------- 结果汇总
|
||||
puts "工程已创建:$origin_dir/$proj_name.xpr"
|
||||
puts " sources_1 顶层 = cpu21_board_top(上板:时钟分频 + 片内 ROM/RAM + 引脚)"
|
||||
if {$use_intrupt_ccab && [file exists $intrupt_ccab_rom]} {
|
||||
if {$use_intrupt_sllsb && [file exists $intrupt_sllsb_rom]} {
|
||||
set selected_program {risc-v-intrupt-sllsb (RISC_V_INTRUPT_SLLSB_ROM) 中断+SLL/SB/BLTU}
|
||||
} elseif {$use_intrupt_ccab && [file exists $intrupt_ccab_rom]} {
|
||||
set selected_program {risc-v-intrupt-ccab (RISC_V_INTRUPT_CCAB_ROM)}
|
||||
} elseif {$use_saolei && [file exists $saolei_rom]} {
|
||||
set selected_program {扫雷 (SAOLEI_ROM)}
|
||||
|
||||
Reference in New Issue
Block a user