扩充内置功能块为 8 个:TON/TOF/TP/CTU/CTD/CTUD/R_TRIG/F_TRIG。
- isa:CAL_* 操作码连续占 24..31(CALL/RET 后移为 32/33,kOpCount=34);disasm 支持 5 个新操作码 - 词法/语法/链接:新 8 个关键字与冻结布局(TP=in/pt/q/et、CTD=cd/ld/pv/q/cv、 CTUD=cu/cd/r/lu/pv/qu/qd/cv、R_TRIG/F_TRIG=clk/q) - VM:do_cal 全 8 个语义(TP 脉冲、CTD 递减、CTUD 双向+装载、R_TRIG 上升沿、F_TRIG 下降沿); edge_prev_ 每槽 2 字节存边沿上次输入;exec_one 分发补 5 个新操作码 - 验证:TP 30ms 脉冲 2 周期、CTD 装载+递减到 q=1、CTUD cu/cd 双向、R/F_TRIG 交替; ctest 11/11 全绿 - 文档:指令与映像/词法/初步计划/符号表与链接/指令执行/扫描周期/使用说明 同步
This commit is contained in:
+14
-10
@@ -80,7 +80,7 @@ STORE_* slot, rs → 写 data[slot*8 .. slot*8+8) = rs(8 字节原样)
|
||||
| `JT rd, off` / `JF rd, off` | `reg[rd] != 0`(JT)/ `== 0`(JF)时 `pc += off`,否则正常 +1 |
|
||||
| `LOAD_* rd, slot` | 见数据区访问 |
|
||||
| `STORE_* slot, rs` | 见数据区访问 |
|
||||
| `CAL_TON/TOF/CTU slot` | 见定时器推进 |
|
||||
| `CAL_TON/TOF/TP/CTU/CTD/CTUD/R_TRIG/F_TRIG slot` | 见定时器与边沿推进 |
|
||||
| `CALL fn_id` / `RET` | 见帧与调用栈 |
|
||||
|
||||
### 跳转语义
|
||||
@@ -95,26 +95,30 @@ STORE_* slot, rs → 写 data[slot*8 .. slot*8+8) = rs(8 字节原样)
|
||||
- 每条指令执行后 `cycle_count++`;超过映像头 `cycle_limit` → `CycleLimit` 故障(周期中止)
|
||||
- `JMP` / `JT` / `JF` / `CALL` 只算 1 条(cycle_limit 以"执行的指令数"计)
|
||||
|
||||
## 定时器推进(CAL_TON / CAL_TOF / CAL_CTU)
|
||||
## 定时器与边沿推进(CAL_TON / CAL_TOF / CAL_TP / CAL_CTU / CAL_CTD / CAL_CTUD / CAL_R_TRIG / CAL_F_TRIG)
|
||||
|
||||
`CAL_* slot` 的 `slot` 是实例**基槽号**;字段偏移 = 实例布局字段序号 × 8(内建布局冻结:TON/TOF = in/pt/q/et,CTU = cu/r/pv/q/cv)。每次执行 = 推进一次,Δt = 映像头 `dt_ms`(不读系统时钟):
|
||||
`CAL_* slot` 的 `slot` 是实例**基槽号**;字段偏移 = 字段序号 × 8(布局冻结:TON/TOF/TP = in/pt/q/et;CTU = cu/r/pv/q/cv;CTD = cd/ld/pv/q/cv;CTUD = cu/cd/r/lu/pv/qu/qd/cv;R_TRIG/F_TRIG = clk/q)。每次执行 = 推进一次,Δt = 映像头 `dt_ms`(不读系统时钟)。边沿检测的"上次输入"存 VM 侧 `edge_prev_`(每实例基槽 2 字节),跨周期保留:
|
||||
|
||||
```text
|
||||
CAL_TON:
|
||||
in = 槽[in] 非零;pt = 槽[pt];et = 槽[et];q = 槽[q]
|
||||
in 为真:et += dt(et ≥ pt 时停在 pt);q = (et ≥ pt) ? 1 : 0
|
||||
in 为假:et = 0;q = 0
|
||||
|
||||
CAL_TOF:
|
||||
in 为真:q = 1;et = 0
|
||||
in 掉电:et += dt;et ≥ pt 时 q = 0
|
||||
(in 再次为真 → 重新 q = 1, et = 0)
|
||||
|
||||
CAL_CTU:
|
||||
上升沿检测:本周期 cu 为真且上次 cu 为假 → cv += 1
|
||||
(上次 cu 存 VM 侧 vector,按实例基槽索引,跨周期保留)
|
||||
r 为真 → cv = 0
|
||||
q = (cv ≥ pv) ? 1 : 0
|
||||
CAL_TP(脉冲):
|
||||
in 上升沿启动 PT 时长脉冲(期间 in 变化不影响)
|
||||
计时中:et += dt;et ≥ pt → q = 0、et 归零(脉冲结束);否则 q = 1
|
||||
非计时:et = 0;q = 0
|
||||
|
||||
CAL_CTU:cu 上升沿 → cv += 1;r → cv = 0;q = (cv ≥ pv) ? 1 : 0
|
||||
CAL_CTD:cd 上升沿 → cv -= 1;ld → cv = pv;q = (cv ≤ 0) ? 1 : 0
|
||||
CAL_CTUD:cu 上升沿 → cv += 1;cd 上升沿 → cv -= 1;r → cv = 0;lu → cv = pv;
|
||||
qu = (cv ≥ pv) ? 1 : 0;qd = (cv ≤ 0) ? 1 : 0
|
||||
CAL_R_TRIG:q = clk 且上次 clk 假(上升沿)
|
||||
CAL_F_TRIG:q = !clk 且上次 clk 真(下降沿)
|
||||
```
|
||||
|
||||
## 故障
|
||||
|
||||
Reference in New Issue
Block a user