From ff4508ec35d581a0ebd3fa4c2608c0d9526c826f Mon Sep 17 00:00:00 2001 From: RuigeLee Date: Tue, 29 Oct 2024 15:08:45 +0800 Subject: [PATCH] =?UTF-8?q?=E5=86=99=E4=BA=86=E4=B8=80=E9=83=A8=E5=88=86?= =?UTF-8?q?=E8=BD=AF=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tb/sw/src/slvMain.S | 125 +++++++++++++++++++++++++++++++++++++++++ tb/sw/src/slvStartup.S | 20 ------- 2 files changed, 125 insertions(+), 20 deletions(-) diff --git a/tb/sw/src/slvMain.S b/tb/sw/src/slvMain.S index acc1343..ab2bde5 100644 --- a/tb/sw/src/slvMain.S +++ b/tb/sw/src/slvMain.S @@ -6,6 +6,7 @@ #define cdr_0_rx_status 0x40000014 #define cdr_0_rx_rxLen 0x40000018 #define cdr_0_rx_rxFifo 0x4000001c + #define cdr_1_tx_status 0x40000080 #define cdr_1_tx_txLen 0x40000084 #define cdr_1_tx_txFifo 0x40000088 @@ -13,11 +14,135 @@ #define cdr_1_rx_status 0x40000094 #define cdr_1_rx_rxLen 0x40000098 #define cdr_1_rx_rxFifo 0x4000009c +#define isWriteGpio 0x60000000 +#define isReadGpio 0x60000000 +#define isReadIsLast 0x60000008 + + +# x2 计数器 +# x5 目标计数值 +# x6 1)操作数 从站号 +# x7 1) 长度 +# x8 1)临时变量 +# x9 从站号 +# x10 操作数和len 参数0 +# x11 两个参数 +# x12 临时转发 +# x13 1)装填基地址 +# x14 +# x15 中断镜像 .global main +@ io.interrupt(0) := intTxError +@ io.interrupt(1) := intTxFifoFull +@ io.interrupt(2) := intTxFinish + +@ io.interrupt(3) := intRxError +@ io.interrupt(4) := intRxValid main: + beqz x15, main # 有中断进来,否则在此地等待 + bneq x15, 0x10, error # 第一个中断应该是下行接收中断0x10,接收数据到来0 下行 + li x15, 0 # 清x15的对应比特 + + + lui x13, %hi(0x40000000) # 装填基地址 + lw x10, 0x1c(x13) # 读rxfifo, 获得长度,操作,参数0 + +1: # 包头2 + beqz x15, 1b # 有中断进来,否则在此地等待 + bneq x15, 0x10, error # 中断应该是下行接收中断0x10,接收数据到来0 下行 + li x15, 0 # 清x15的对应比特 + + lw x11, 0x1c(x13) # 读rxfifo, 获得参数1,参数2 + +#本地数据 + # 确认本地数据长度 + srli x6, x10, 16 # 获得操作数和长度, 右移16位 + srli x7, x6, 4 # 获得长度, 右移4位 + andi x6, x6, 0xf # 获得操作数取低4比特 + + beqz x6, opInit # 若操作数为0,跳转初始化 + li x8, 1 + beq x6, x8, opSync # 若操作数为1,跳转同步 + li x8, 2 + beq x6, x8, opBCast # 若操作数为1,跳转广播 + li x8, 3 + beq x6, x8, opUCast # 若操作数为1,跳转广播 + j error # 未定义操作数,报错 + +opInit: + srli x6, x7, 3 #接收长度除以8 + sub x6, x0, x6 # x6=-x6 + addi x6, x6, 64 x6=x6+64 + li x2 # 接收计数器清零启动 + +opSync: + j error # 未定义操作数,报错 +opBCast: + j error # 未定义操作数,报错 +opUCast: + j error # 未定义操作数,报错 + + +2: # 下行本地数据 + beqz x15, 2b # 有中断进来,否则在此地等待 + bneq x15, 0x10, error # 中断应该是下行接收中断0x10,接收数据到来0 下行 + li x15, 0 # 清x15的对应比特 + # 读rxfifo, 获得本地数据 + # 接收计数器+1 + # 比较计数器是否收完本地数据,没有则回到2 + + + +downpay: + + beqz x15, 1b # 有中断进来,否则在此地等待 + bneq x15, 0x10, error # 中断应该是下行接收中断0x10,接收数据到来0 下行,下行发送不应该full或者其它,否则错误 + + + + + # 确认下行转发操作 + # 向下行发送写入长度,操作码,参数0 + # 向下行发送写入参数1, 参数2 + + +1: +bnez x15, 0x10, 2f +2: + + + +error: + + +3: +4: +5: +6: +7: +8: + + + + + beq x15, 0x200, 2f # 接收数据到来1 上行 + + beq x15, 0x01, 1f # 发送错误0 + beq x15, 0x02, 2f # 发送fifo满0 + beq x15, 0x04, 3f # 发送完成0 + beq x15, 0x08, 4f # 接收错误0 + beq x15, 0x20, 6f # 发送错误1 + beq x15, 0x40, 7f # 发送fifo满1 + beq x15, 0x80, 8f # 发送完成1 + beq x15, 0x100, 9f # 接收错误1 + j main # 循环等待直到中断到来 + + + + lui x5, %hi(cdr_0_tx_status) li x6, 128 diff --git a/tb/sw/src/slvStartup.S b/tb/sw/src/slvStartup.S index bd2dee0..35689e5 100644 --- a/tb/sw/src/slvStartup.S +++ b/tb/sw/src/slvStartup.S @@ -16,26 +16,6 @@ _prog_start: li gp, 1; ecall - - - - - - - - - - - - - - - - - - - - .balign 32 .section .trap_entry, "ax", %progbits