flowchart TB
subgraph "ALU输入"
DIR["dir[7:0]"]
DATA_A["data_a[7:0]"]
DATA_B["data_b[7:0]"]
ADDR["address[7:0]"]
end
MODE_SEL{"dir[5]模式"}
subgraph "运算模式 dir[5]=0"
OP_TYPE{"dir[4:3]类型"}
OP_TYPE -->|00基本| BASIC{"dir[2:0]"}
BASIC -->|000| ADD["data_a+data_b"]
BASIC -->|001| SUB["data_a-data_b"]
BASIC -->|010| AND["data_a&data_b"]
BASIC -->|011| OR["data_a|data_b"]
BASIC -->|100| NOT["~data_a"]
BASIC -->|101| XOR["data_a^data_b"]
BASIC -->|110| MUL["data_a*data_b"]
BASIC -->|111| DIV["data_a/data_b"]
OP_TYPE -->|01延迟| DELAY["REG_DELAY"]
OP_TYPE -->|10特殊| SPEC{"dir[2:0]"}
SPEC -->|000| MOD["data_a%data_b"]
SPEC -->|001| SHL["data_a<|010| SHR["data_a>>data_b"]
SPEC -->|011| PHSH["压栈PHSH=1"]
SPEC -->|100| POP["弹栈POP=1"]
SPEC -->|101| CALL["函数调用"]
SPEC -->|111| RET["函数返回"]
OP_TYPE -->|11UART| TX["UART发送tx_en=1"]
end
subgraph "判断模式 dir[5]=1"
CMP_TYPE{"dir[2:0]比较"}
CMP_TYPE -->|000| EQ["data_a==data_b"]
CMP_TYPE -->|001| NE["data_a!=data_b"]
CMP_TYPE -->|010| LT["data_a|011| LE["data_a<=data_b"]
CMP_TYPE -->|100| GT["data_a>data_b"]
CMP_TYPE -->|101| GE["data_a>=data_b"]
CMP_TYPE -->|110| DELAY_CHK["indelay_data>0"]
end
DIR --> MODE_SEL
DATA_A --> MODE_SEL
DATA_B --> MODE_SEL
MODE_SEL -->|0| OP_TYPE
MODE_SEL -->|1| CMP_TYPE
ADD --> OUT["out[7:0]"]
SUB --> OUT
AND --> OUT
OR --> OUT
NOT --> OUT
XOR --> OUT
MUL --> OUT
DIV --> OUT
MOD --> OUT
SHL --> OUT
SHR --> OUT
EQ --> SKIP["skip信号"]
NE --> SKIP
LT --> SKIP
LE --> SKIP
GT --> SKIP
GE --> SKIP
DELAY_CHK --> SKIP
CALL --> FUNC["func_skip,skipfunc"]
RET --> FUNC
PHSH --> STACK_CTRL["PHSH,POP信号"]
POP --> STACK_CTRL
DELAY --> DELAY_OUT["delay,delay_data"]
TX --> UART_OUT["tx_en,txout"]
堆栈操作时序
sequenceDiagram
participant CPU as CPU核心
participant ALU as ALU
participant STACK as Stack
participant REGS as REGS
Note over CPU, REGS: CALL指令执行
CPU ->> ALU: CALL指令 dir=0xD6
ALU ->> ALU: 计算PC+1
ALU ->> STACK: PHSH=1, 压入(PC+1,程序页)
STACK ->> STACK: stack_pointer++
ALU ->> REGS: skip=1
REGS ->> CPU: 跳转到函数地址
Note over CPU, REGS: 函数执行中...
CPU ->> CPU: 执行函数体
Note over CPU, REGS: RET指令执行
CPU ->> ALU: RET指令 dir=0xD7
ALU ->> STACK: POP=1
STACK ->> ALU: 返回地址
ALU ->> REGS: func_skip=1, skip=1
REGS ->> CPU: 返回调用地址
存储层次结构
graph TB
subgraph "L1: 寄存器级 最快"
L1_REG[通用寄存器 7x8bit]
L1_PTR[指针寄存器 8x8bit]
end
subgraph "L2: 片上RAM 快速"
L2_RAM[数据RAM 64x8bit]
L2_DELAY[延迟寄存器 24bit]
end
subgraph "L3: 堆栈 中等"
L3_STACK[堆栈 256x16bit]
end
subgraph "L4: 程序ROM"
L4_PROM[程序ROM 256x32bit]
end
subgraph "L5: 外部IO 最慢"
L5_IO[并行IO 8bit]
L5_UART[UART串口]
end
CPU[CPU核心] <--> L1_REG
CPU <--> L1_PTR
L1_PTR <--> L2_RAM
CPU <--> L2_DELAY
CPU <--> L3_STACK
CPU <--> L4_PROM
CPU <--> L5_IO
CPU --> L5_UART
CPU_Liet 指令集说明
基本算术运算指令
逻辑运算指令
乘除法运算指令
移位运算指令
控制流指令
特殊指令
后缀指令
指令格式说明
基本格式:
寻址模式:
代码长度说明:
特殊说明:
系统总体架构
graph TB subgraph "外部接口" CLK[时钟输入 clk] RST[复位输入 rst] IO_IN[8位并行输入 io_in] IO_OUT[8位并行输出 io_out] TX[UART串口发送 tx] end subgraph "时钟管理" PLL[Gowin_PLL锁相环] end subgraph "CPU核心 - LEG顶层" LEG[LEG.v] end subgraph "CPU核心组件" PC[Program.v
程序计数器] REGS[REGS.v
寄存器文件] ALU[ALU.v
算术逻辑单元] STACK[Stack.v
硬件堆栈] end subgraph "存储资源" PROM[Gowin_pROM
256x32bit] RAM[ramREGS
64x8bit] REGFILE[regfile
7x8bit] PTRREG[pointer_reg
8x8bit] end subgraph "外设接口" UART[uart_fifo_tx] end CLK --> PLL PLL -->|系统时钟| LEG RST --> LEG IO_IN --> REGS LEG --> PC LEG --> REGS LEG --> ALU LEG --> UART PC --> PROM REGS --> RAM REGS --> REGFILE REGS --> PTRREG ALU --> STACK UART --> TX REGS -->|操作数A/B| ALU ALU -->|运算结果| REGS ALU -->|跳转控制| PC PC -->|指令| REGS
CPU数据通路
graph LR subgraph "取指阶段" PC_ADDR[程序计数器] PROM_MEM[程序ROM] INSTR[32位指令] PC_ADDR -->|地址| PROM_MEM PROM_MEM --> INSTR end subgraph "译码阶段" DIR[操作码 dir] DATA_A[操作数A] DATA_B[操作数B] ADDR[地址/立即数] INSTR --> DIR INSTR --> DATA_A INSTR --> DATA_B INSTR --> ADDR end subgraph "执行阶段" REGFILE_REG[寄存器组] ALU_CORE[ALU核心] RESULT[运算结果] SKIP[跳转信号] DATA_A --> REGFILE_REG DATA_B --> REGFILE_REG REGFILE_REG -->|out_a| ALU_CORE REGFILE_REG -->|out_b| ALU_CORE DIR -->|控制| ALU_CORE ALU_CORE --> RESULT ALU_CORE --> SKIP end subgraph "写回阶段" WRITE_BACK[写回逻辑] RESULT --> WRITE_BACK WRITE_BACK --> REGFILE_REG end subgraph "跳转控制" PC_UPDATE[PC更新] SKIP --> PC_UPDATE ADDR --> PC_UPDATE PC_UPDATE --> PC_ADDR end模块接口关系
graph TB subgraph "LEG.v 顶层" LEG_IN[输入: clk, rst, io_in] LEG_OUT[输出: io_out, tx] end subgraph "Program.v" PC_IN[输入: clk, rst_n, skip, skip_data] PC_OUT[输出: dir, data_a, data_b, address, addr_pc] end subgraph "REGS.v" REGS_IN[输入: clk, skip, imm_a, imm_b, data_a/b, in, io_in, delay...] REGS_OUT[输出: io_out, out_a/b, skip_data, delay_reg...] end subgraph "ALU.v" ALU_IN[输入: dir, data_a/b, address, clk, pc, indelay_data] ALU_OUT[输出: out, skip, delay, POP, PHSH, func_skip, tx_en...] end subgraph "Stack.v" STACK_IN[输入: clk, POP, PHSH, input_Stack] STACK_OUT[输出: output_Stack] end LEG_IN --> PC_IN LEG_IN --> REGS_IN LEG_IN --> ALU_IN PC_OUT --> REGS_IN PC_OUT --> ALU_IN REGS_OUT --> ALU_IN REGS_OUT --> PC_IN ALU_OUT --> REGS_IN ALU_OUT --> PC_IN ALU_OUT --> STACK_IN STACK_OUT --> ALU_IN ALU_OUT --> UART UART --> LEG_OUT REGS_OUT --> LEG_OUT指令执行流程
flowchart TD START["开始"] --> FETCH["取指: 从PROM读32位指令"] FETCH --> DECODE["译码: 解析dir, data_a, data_b, address"] DECODE --> MODE{"dir[5]模式?"} MODE -->|0运算| EXEC["执行ALU运算"] MODE -->|1判断| CMP["条件比较"] EXEC --> OP_TYPE{"dir[4:3]类型?"} OP_TYPE -->|00| BASIC["ADD/SUB/AND/OR/XOR/MUL/DIV"] OP_TYPE -->|01| DELAY["REG_DELAY延迟"] OP_TYPE -->|10| SPEC["MOD/SHL/SHR/PHSH/POP/CALL/RET"] OP_TYPE -->|11| UART["串口发送"] SPEC --> STACK_OP{"栈操作?"} STACK_OP -->|PHSH| PUSH["压栈"] STACK_OP -->|POP| POP_E["弹栈"] STACK_OP -->|CALL| CALL_F["保存返回地址+跳转"] STACK_OP -->|RET| RET_F["恢复返回地址"] CMP --> RESULT["比较结果"] RESULT --> CONDITION{"条件满足?"} CONDITION -->|是| SET_SKIP["skip=1"] CONDITION -->|否| NO_SKIP["skip=0"] BASIC --> WRITEBACK["写回结果到寄存器"] DELAY --> WRITEBACK PUSH --> WRITEBACK POP_E --> WRITEBACK UART --> WRITEBACK SET_SKIP --> PC_JUMP["更新PC跳转"] NO_SKIP --> PC_NEXT["PC+1"] CALL_F --> PC_JUMP RET_F --> PC_JUMP WRITEBACK --> PC_NEXT PC_JUMP --> NEXT["下一条指令"] PC_NEXT --> NEXT NEXT --> FETCHALU详细结构
flowchart TB subgraph "ALU输入" DIR["dir[7:0]"] DATA_A["data_a[7:0]"] DATA_B["data_b[7:0]"] ADDR["address[7:0]"] end MODE_SEL{"dir[5]模式"} subgraph "运算模式 dir[5]=0" OP_TYPE{"dir[4:3]类型"} OP_TYPE -->|00基本| BASIC{"dir[2:0]"} BASIC -->|000| ADD["data_a+data_b"] BASIC -->|001| SUB["data_a-data_b"] BASIC -->|010| AND["data_a&data_b"] BASIC -->|011| OR["data_a|data_b"] BASIC -->|100| NOT["~data_a"] BASIC -->|101| XOR["data_a^data_b"] BASIC -->|110| MUL["data_a*data_b"] BASIC -->|111| DIV["data_a/data_b"] OP_TYPE -->|01延迟| DELAY["REG_DELAY"] OP_TYPE -->|10特殊| SPEC{"dir[2:0]"} SPEC -->|000| MOD["data_a%data_b"] SPEC -->|001| SHL["data_a<|010| SHR["data_a>>data_b"] SPEC -->|011| PHSH["压栈PHSH=1"] SPEC -->|100| POP["弹栈POP=1"] SPEC -->|101| CALL["函数调用"] SPEC -->|111| RET["函数返回"] OP_TYPE -->|11UART| TX["UART发送tx_en=1"] end subgraph "判断模式 dir[5]=1" CMP_TYPE{"dir[2:0]比较"} CMP_TYPE -->|000| EQ["data_a==data_b"] CMP_TYPE -->|001| NE["data_a!=data_b"] CMP_TYPE -->|010| LT["data_a|011| LE["data_a<=data_b"] CMP_TYPE -->|100| GT["data_a>data_b"] CMP_TYPE -->|101| GE["data_a>=data_b"] CMP_TYPE -->|110| DELAY_CHK["indelay_data>0"] end DIR --> MODE_SEL DATA_A --> MODE_SEL DATA_B --> MODE_SEL MODE_SEL -->|0| OP_TYPE MODE_SEL -->|1| CMP_TYPE ADD --> OUT["out[7:0]"] SUB --> OUT AND --> OUT OR --> OUT NOT --> OUT XOR --> OUT MUL --> OUT DIV --> OUT MOD --> OUT SHL --> OUT SHR --> OUT EQ --> SKIP["skip信号"] NE --> SKIP LT --> SKIP LE --> SKIP GT --> SKIP GE --> SKIP DELAY_CHK --> SKIP CALL --> FUNC["func_skip,skipfunc"] RET --> FUNC PHSH --> STACK_CTRL["PHSH,POP信号"] POP --> STACK_CTRL DELAY --> DELAY_OUT["delay,delay_data"] TX --> UART_OUT["tx_en,txout"]堆栈操作时序
sequenceDiagram participant CPU as CPU核心 participant ALU as ALU participant STACK as Stack participant REGS as REGS Note over CPU, REGS: CALL指令执行 CPU ->> ALU: CALL指令 dir=0xD6 ALU ->> ALU: 计算PC+1 ALU ->> STACK: PHSH=1, 压入(PC+1,程序页) STACK ->> STACK: stack_pointer++ ALU ->> REGS: skip=1 REGS ->> CPU: 跳转到函数地址 Note over CPU, REGS: 函数执行中... CPU ->> CPU: 执行函数体 Note over CPU, REGS: RET指令执行 CPU ->> ALU: RET指令 dir=0xD7 ALU ->> STACK: POP=1 STACK ->> ALU: 返回地址 ALU ->> REGS: func_skip=1, skip=1 REGS ->> CPU: 返回调用地址存储层次结构
graph TB subgraph "L1: 寄存器级 最快" L1_REG[通用寄存器 7x8bit] L1_PTR[指针寄存器 8x8bit] end subgraph "L2: 片上RAM 快速" L2_RAM[数据RAM 64x8bit] L2_DELAY[延迟寄存器 24bit] end subgraph "L3: 堆栈 中等" L3_STACK[堆栈 256x16bit] end subgraph "L4: 程序ROM" L4_PROM[程序ROM 256x32bit] end subgraph "L5: 外部IO 最慢" L5_IO[并行IO 8bit] L5_UART[UART串口] end CPU[CPU核心] <--> L1_REG CPU <--> L1_PTR L1_PTR <--> L2_RAM CPU <--> L2_DELAY CPU <--> L3_STACK CPU <--> L4_PROM CPU <--> L5_IO CPU --> L5_UART指令编码结构
graph TB subgraph "32位指令格式" B31_24[31:24 操作码dir] B23_16[23:16 操作数A] B15_8[15:8 操作数B] B7_0[7:0 地址/立即数] end subgraph "操作码dir[7:0]结构" D7[bit7: imm_a标志] D6[bit6: imm_b标志] D5[bit5: 0=运算 1=判断] D4_3[bit4-3: 运算类型] D2_0[bit2-0: 具体操作] end 32位指令 --> B31_24 32位指令 --> B23_16 32位指令 --> B15_8 32位指令 --> B7_0 B31_24 --> D7 B31_24 --> D6 B31_24 --> D5 B31_24 --> D4_3 B31_24 --> D2_0 D5 -->|0| ALU_OP[运算模式] D5 -->|1| CMP_OP[判断模式] D4_3 -->|00| BASIC[ADD/SUB/AND/OR/MUL/DIV] D4_3 -->|01| DELAY_C[REG_DELAY] D4_3 -->|10| SPEC_C[MOD/SHL/SHR/PHSH/POP/CALL/RET] D4_3 -->|11| UART_C[UART发送]技术规格