单总线CPU现代时序:微指令编排与排错实践

简介:这份文档面向计算机组成原理课程的学习者与硬件实验备考者,聚焦华中科技大学(HUST)教学场景下的单总线CPU设计,帮助读者理清CPU内部各部件通过单一总线互联时的数据通路与时序控制逻辑。资源共1个doc文件,压缩包约3.34MB,文档中对总线结构、运算器、控制器、寄存器、总线仲裁机制以及时钟周期与信号同步等关键环节做了系统梳理,并结合Logisim数字电路仿真工具,说明如何用逻辑门与触发器搭建并验证可运行的单总线CPU电路。借助其中的设计思路与模块划分,读者可以对照指令执行流程理解取指、译码、送操作数与写回等阶段的信号配合关系,掌握在总线竞争与带宽受限条件下安排时序、规避数据冲突的常用方法。目前已有1617人学习下载,适合正在完成组成原理课程设计或希望在仿真环境中动手实现简易CPU的读者参考。

1. 单总线 CPU 与现代时序,先把这个组合的边界划清楚

单总线 CPU 设计(现代时序)这套课设里,卡人的从来不是触发器怎么接,而是两条容易被忽略的硬边界:单总线决定了数据通路在任何时刻只允许一个部件驱动总线,现代时序决定了控制器每个时钟周期只推进一步微操作。前者约束连线,后者约束微指令的编排节奏。把这两条先立住,后面无论是 ADD、LOAD 还是条件跳转,都只是往字段里填不同的位。这篇按数据通路的搭建、微指令格式与条件判别测试逻辑、取指到执行的完整序列、最后到波形排错的顺序展开,写给正在 Logisim 或头歌上做单总线 CPU、需要把连线图和微程序都调到能跑的人。适合已经学过寄存器传输级描述、但还没把"控制器怎么指挥数据通路"这件事串起来的读者。

2. 单总线数据通路搭建:寄存器、ALU 与三态门的分时复用

2.1 单总线为什么必须靠三态门分时复用

内部总线是一组被所有部件共享的导线。如果 PC 和 R0 同时把自己的值驱到同一根线上,一个驱高一个驱低,轻则读到不定态,重则逻辑上形成短路。所以每个输出源后面都要挂一个三态门,由控制器给出使能信号,同一时刻只允许一个使能有效。这解释了为什么微指令里"输出"和"输入"要成对出现:PCout 有效时把 PC 送上总线,MARin 有效时同一周期从总线锁存进 MAR。一个时钟周期内完成"源输出 + 目标输入"这一个微操作,正是现代时序的基本颗粒度。

提示:Logisim 里的隧道(Tunnel)只是连线别名,不具备三态特性。真正实现"多源共线"要用分线器配合使能端,或直接用一个多路选择器做总线汇聚,功能等价。

2.2 最小部件清单与连接关系

把数据通路拆到能跑通取指和几条基本指令,部件清单大致如下,每个部件都只通过一个三态门接到总线上。

部件 作用 典型控制信号
PC 程序计数器,指向下一条指令 PCout / PCin / PCinc
MAR 访存地址寄存器 MARout / MARin
MDR 访存数据寄存器 MDRout / MDRin
IR 指令寄存器,存放当前指令 IRout / IRin
R0–R3 通用寄存器组 Rnout / Rnin
ALU 算术逻辑单元 ALUout / ALUop
PSW 状态标志(ZF、CF) Zin / Cin
主存 指令与数据 Read / Write

关键连接原则只有三条:所有部件的输入都来自总线,所以每个 in 信号都是从总线锁存;所有部件的输出都经过三态门到总线;ALU 的两个操作数至少有一个来自总线,另一个可以是寄存器或暂存器。写回结果时,ALU 输出再经三态门送回总线,由目标寄存器的 in 信号锁存。

2.3 用 Verilog 描述单总线数据通路

下面这段把三态总线和时钟锁存的核心写出来,综合到 FPGA 时多驱动会被映射成多路选择器,逻辑行为一致。

module single_bus_datapath(
    input clk, rst
);
    tri [7:0] bus;              // 8 位共享内部总线

    reg [7:0] PC, MAR, MDR, IR, R0;
    reg PCout, MARin, MDRin, MDRout, IRin, IRout, R0out, R0in;

    // 每个输出源一个三态门,同一时刻只允许一个 out 有效
    assign bus = PCout  ? PC  : 8'bz;
    assign bus = MDRout ? MDR : 8'bz;
    assign bus = IRout  ? IR  : 8'bz;
    assign bus = R0out  ? R0  : 8'bz;

    // 时钟上升沿锁存:谁被选中谁更新
    always @(posedge clk or posedge rst) begin
        if (rst) begin
            PC <= 8'b0; MAR <= 8'b0; MDR <= 8'b0; IR <= 8'b0; R0 <= 8'b0;
        end else begin
            if (MARin) MAR <= bus;
            if (MDRin) MDR <= bus;
            if (IRin)  IR  <= bus;
            if (R0in)  R0  <= bus;
            if (PCout) PC  <= PC + 8'b1;   // 简化:输出周期自增
        end
    end
endmodule

逻辑上, tri 类型允许多个 assign 同时驱动同一根线,但任一时刻只应有一个驱动非高阻。参数上, bus 宽度按指令字长取 8 位或 16 位,寄存器宽度必须与总线一致。注意 PC <= PC + 1 放在输出周期只是简化演示,真实设计里自增通常由独立的 PCinc 信号控制,避免把"输出"和"自增"绑成同一个微操作。

注意:一段代码里若出现两个 out 信号同时有效,仿真会给出 X 态。这是单总线冲突最典型的信号,排错时优先查这里。

3. 现代时序控制:微指令格式与条件判别测试逻辑

3.1 现代时序与传统三级时序的差别

传统时序把机器周期切成若干节拍电位,每个节拍电位里再切节拍脉冲,时序信号由节拍发生器集中产生,控制信号分散在各个逻辑门里,调试时要在多个时间尺度上对齐。现代时序则把时钟周期当作唯一节拍单位,每个上升沿推进一步微操作,微操作的先后由微程序的下地址决定,不再区分节拍电位和节拍脉冲。

这个转变带来的直接影响是:设计者不再画时序图去对齐多个脉冲,而是把精力放在微指令序列上。每条微指令描述"本周期谁输出、谁输入、下一条去哪",控制器的复杂度从时序电路转移到了微地址逻辑。对单总线 CPU 来说,这恰好匹配它的限制——反正一个周期只能有一个输出源,微指令天然就是"一周期一微操作"。

3.2 微指令字段怎么划分

微指令通常分三段:控制字段给出本周期所有 out/in 使能;测试字段指明本条微指令要不要做条件判别、判别哪个标志;下地址字段给出后继微地址。控制字段的每一位对应一个控制信号,位数等于信号总数。

字段 位数示例 内容
控制字段 16 位 PCout、MARin、MDRin、MDRout、IRin、R0in、R0out、ALUout、ALUop、Zin…
测试字段 3 位 0 无条件,1 判 ZF,2 判 CF,3 判 IR 操作码…
条件选通 1 位 是否启用条件分支
下地址字段 8 位 后继微地址,或分支候选地址

控制字段的编码方式有两种常见做法:水平型每一位独立,微指令长但译码简单;垂直型用编码字段压缩操作,微指令短但要多一级译码。课设里数据通路信号不多,我一般用水平型,直接展开好调试。

3.3 条件判别测试逻辑怎么实现

条件分支的核心是把测试结果拼进微地址。常见做法是让下地址字段给出两路候选的基址,最低位由测试结果填充,测试成立走一条、否则走另一条。下面这段演示微地址生成。

module microctrl(
    input clk, rst,
    input ZF, CF,
    input [7:0] IR_op
);
    reg [7:0] uaddr;
    reg [15:0] uIR;              // 微指令寄存器
    reg [15:0] urom [0:255];     // 微指令 ROM
    reg [2:0] test;
    reg       cond_en;

    // 测试字段译码:选择当前要判定的条件
    wire test_bit = (test == 3'd1) ? ZF :
                    (test == 3'd2) ? CF :
                    (test == 3'd3) ? IR_op[0] : 1'b0;

    always @(posedge clk or posedge rst) begin
        if (rst) begin
            uaddr <= 8'b0;
        end else begin
            uIR     <= urom[uaddr];          // 取微指令
            test    <= uIR[13:11];           // 解析测试字段
            cond_en <= uIR[10];              // 是否启用条件分支
            // 条件成立时下地址最低位置 1,否则清零
            uaddr   <= {uIR[7:1], (cond_en & test_bit)};
        end
    end
endmodule

逻辑说明:每周期先用当前 uaddr 从 ROM 取微指令,锁进 uIR ;下一周期根据 uIR 里的测试字段选出 test_bit ,若 cond_en 有效就把它拼到下地址最低位。参数上,下地址字段宽度决定微程序容量,8 位对应 256 条微指令,通常够一个教学 CPU 用。把 cond_en & test_bit 换成多路选择可以让测试结果占两位,从而支持四路分支,代价是下地址字段要留出对应的低位。

提示:测试字段和条件选通分开设,是为了让"无条件微指令"也能复用下地址字段做顺序跳转,避免所有微指令都背上分支开销。

4. 从取指到执行的微指令序列:能跑通的一版编排

4.1 取指周期的三步微指令

取指是每条指令都要走的公共路径,用现代时序一般拆成三步:地址送 MAR、访存取回送 MDR、MDR 送 IR 并计算下一条 PC。三步写成微指令如下。

微地址 控制字段(out/in) 说明
0x00 PCout, MARin PC 送 MAR
0x01 MDRin, MEMread, PCinc 启动读主存,PC 自增
0x02 MDRout, IRin MDR 送 IR,取指结束
0x03 依据 IR 操作码分支 进入执行周期

第一步把 PC 值送上总线锁进 MAR;第二步发出读信号,MDR 接收主存返回的数据,同时 PC 自增指向下一条;第三步把 MDR 里的指令送进 IR,控制权交给译码。这三步的地址是固定的,所以微地址可以直接顺序 0x00→0x01→0x02→0x03。

4.2 数据传送、运算与跳转的微操作拆解

取指结束后,微地址跳到执行入口,不同指令走不同分支。把三条典型指令拆成微操作,可以看清时序是怎么"一周期一步"推进的。

指令 微操作序列
MOV R0, R1 R1out, R0in
ADD R0, R1 R1out, ALUin, ALUop=ADD;ALUout, R0in, Zin
JZ addr 判 ZF:成立则 addr 送 PC;否则继续顺序取下条

ADD 被拆成两拍是单总线的必然结果:第一拍把 R1 送 ALU 的一个入口,第二拍 ALU 结果经三态门回总线锁进 R0。如果数据通路里只给 ALU 一个输入口,ADD 还需要一拍把另一个操作数先暂存进一个 A 寄存器。JZ 的关键在测试字段——它把 ZF 接进条件判别逻辑,微地址最低位随判定结果翻转,指向"改 PC"或"取下一指令"两条路径。

4.3 把微指令写进 ROM

Logisim 里可以用一个 ROM 组件存微指令,地址端接微地址寄存器输出;头歌平台则通常提供微程序存储单元的编辑入口,把每条微指令按字段填进去。填的时候按控制字段、测试字段、下地址字段从左到右对齐,别把条件选通位错位。写完后用一个简单的计数器节拍单步运行,观察微地址是否按预期跳转。

注意:执行周期的微地址入口由取指第三步的分支给出。若把译码放在微程序外部,记得取指结束后给微地址一个固定偏移,否则会跳回取指序列形成死循环。

5. 验证与排错:单总线冲突、时序毛刺与微地址跳错怎么定位

单总线 CPU 调不出来,现象大多集中在三类:总线出现 X 态、微地址乱跳、结果差一拍。前两类在仿真里就能锁定,第三类往往要对着节拍逐周期看。

先看 X 态。总线读到不定值,九成是两个 out 同时有效。做法是把所有 out 使能接到一个显示探针,单步运行时盯着看哪个周期亮了两个灯。常见诱因是控制字段编码时把两个信号编到了同一位,或微指令 ROM 里某条记录填错位——比如把测试字段的值填进了控制字段。

现象 高概率原因 定位手段
总线 X 两个 out 同时有效 探针查 out 使能,核对微指令编码
微地址乱跳 条件选通位错位 打印每拍 uIR 与 uaddr
结果差一拍 锁存沿与输出沿同周期 把写回挪到下一拍
PC 不自增 PCinc 未编入取指第二步 检查 0x01 控制字段

再看微地址跳错。把每拍的 uIR 和 uaddr 打到日志里,逐条比对预期序列。如果某条条件微指令无论标志如何都走同一分支,检查测试字段译码时 test_bit 是否被常量覆盖——比如 cond_en 一直是 0,条件分支就永远走低位清零那条路。

最后是时序毛刺。现代时序用一个时钟沿推进一步,如果某个寄存器在输出周期同时被写回,仿真里会看到它本周期就被更新,下一拍再读就对不上了。稳妥做法是让"输出"和"写回"落在相邻两个周期,写回始终晚一拍。调试时把时钟频率降到肉眼能跟的程度,用单步按钮一拍一拍走,比一次跑完再猜哪里错效率高得多。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

汇总药用数据库(Pubchem,bingdingDB,Chembl,ExcapeDB)数据 记载一下如何汇总4大数据库的数据 阅读详情

相关推荐

STM32L151C8T6低功耗实战:RTC闹钟唤醒停机模式的配置与优化

本文详细介绍了如何在STM32L151C8T6微控制器上配置与优化RTC闹钟唤醒停机模式,以实现极致的低功耗设计。文章从核心原理出发,结合STM32CubeMX配置实战,深入讲解了进入停机模式前的关键准备工作、唤醒后的系统恢复流程,并分享了将功耗降至个位数微安级的深度优化技巧与常见问题解决方案。

weixin_29166013的博客 301

python入门学习——6种方法求n的阶乘(8种写法)

python入门学习——6种方法求n的阶乘(8种写法)

Code_流苏:在代码中寻诗意,在实践中觅真知 15万+

银河麒麟V10安装docker

最近在做的一个信创项目使用的操作系统是银河麒麟高级服务器V10,在安装docker时,会遇到下面的错误。 nothing provides fuse-overlayfs >= 0.7 needed by docker-ce-rootless-extras-20.10.0-3.el7.x86_64 经过分析,以下依赖包是centos系统中的包,所以需要给kylinos创建一个合适的centos源。经过实验,Kylin Linux Advanced Server V1

m0_38004228的博客 4908

C语言入门与进阶——求n的阶乘

C语言入门与进阶——求n的阶乘 关于求n的阶乘问题,我们先来看一个题,借助题来找到突破点。 Problem Description 给定一个整数n,求它的阶乘,0≤n≤12 Input 输入一个数n Output 输出一个数,表示n的阶乘 Sample Input 5 Sample Output 120 既然是求阶乘的,那突破点就很明显,

Code_流苏:在代码中寻诗意,在实践中觅真知 11万+

从Unitree B2W到四足机器人:用Isaac Lab构建强化学习奖励函数的5个实战技巧

本文分享了在Isaac Lab仿真环境中,为Unitree B2W等四足机器人设计强化学习奖励函数的5个核心实战技巧。内容涵盖奖励函数的结构化组合、轮腿混合机器人的适配策略、课程学习的动态调整、域随机化增强鲁棒性以及高效的调试可视化方法,旨在帮助开发者构建更稳定、高效的机器人运动策略。

lg888的博客 1066

在Window上安装和配置VTK9.x,并在QT项目中调试VTK是否可用

VTK+MSVC+Qt Creator + CMake配置

qq_42279379的博客 1000

Python 用六种方法实现 n 的阶乘

首先从数学的定义原理上分析,n!的数学定义有两种: 阶乘是基斯顿·卡曼(Christian Kramp,1760~1826)于1808年发明的运算符号,是数学术语。一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。自然数n的阶乘写作n!。1808年,基斯顿·卡曼引进这个表示法。 亦即n!=...

peipei12138的博客 4万+

CloudCompare 二次开发:插件中的 PCL 环境配置与编程

在进行 CloudCompare 的二次开发过程中,我们常常需要使用点云库(Point Cloud Library,简称 PCL)来处理和分析点云数据。在 CloudCompare 的界面中,选中一个点云对象,然后点击菜单栏中的 “插件” -> “MyPluginAction”。插件将对选中的点云对象进行体素滤波处理,并更新显示结果。下面我们将展示一个简单的插件编程示例,该示例使用 PCL 对输入的点云数据进行体素滤波处理。方法进行体素滤波处理,并将结果点云赋值给选中的点云对象。文件并点击 “打开”。

2301_79331387的博客 283

C语言求n的阶乘(n!)的3种方法

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int Fac2(int n) { if (n <= 1) return 1; else return n * Fac2(n - 1); return 0; } int main() { //求n 的阶乘 int n = 0; int ret = 0; scanf("%d", &n); ret = Fac2(n);//循环的方式 printf("%d\n", ret); ...

qq_49613557的博客 4万+

杰理SDK入门教程(六):自定义按键事件

这篇教程介绍了在杰理AC695N芯片上实现自定义按键功能的完整流程,包含三个核心步骤:首先在key_event_deal.h文件中添加按键枚举定义;然后在adkey_table.c配置按键映射表,按模式和行为类型设置按键值;最后在app_common.c的消息处理函数中添加自定义按键逻辑。教程强调需注意不同模式按键表的列定义差异,并提供了具体代码示例,最后指导完成编译测试验证。全文结构清晰,配有关键代码截图,适合开发者快速上手自定义按键功能开发。

qq_42014563的博客 1018

知识图谱设计简记

知识图谱是一种语义化的知识表示框架,通过实体-关系-属性三元组形式表达现实世界关联。其核心价值在于关联化整合数据、支持可解释性推理和赋能智能化应用。知识图谱可分为通用型和领域型两类,基本构成包括实体、关系、属性等基础元素,以及本体和实例等架构层元素。设计方法主要有自上而下、自下而上和混合式三种,需遵循业务导向、一致性等原则。在建模时需要明确属性与实体的判断标准,规范处理关系的方向性与对称性,并合理构建多重关系。主流技术框架如RDF和属性图体系均支持多重关系建模,选择需考虑业务需求。本体作为知识图谱的概念骨架

生活在别处 363

C语言程序设计之四种方法求n的阶乘

C语言程序设计之四种方法求n的阶乘

qq_53481973的博客 4万+

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

数据结构实验--大数运算之计算n的阶乘 (n≥20)

数据结构实习报告 一、课程设计题目与要求 【问题描述】 大数运算——计算n的阶乘 (n≥20)。 【基本要求】 (1)数据的表示和存储: ①累积运算的中间结果和最终的计算结果的数据类型要求是整型——这是问题本身的要求。 ②试设计合适的存储结构,要求每个元素或结点最多存储数据的3位数值。 (2)数据的操作及其实现:基于设计的存储结构实现乘法操作,要求从键盘上输入n值;在屏幕上显示最终计算结果。【测试数据】 (1)n=20,n!=2432902008176640000 (2)n=30,n!=2652528598

Cheney ' blog 2055

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

求n!的4种方法

(1)循环法 #include using namespace std; long fac(int); //函数声明 int main( ) {int n; //n为需要求阶乘的整数 long y; //y为存放n!的变量 cou

smallgyy的专栏 1万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

计算n的阶乘

题目描述 给定整数n,计算n!的值并输出。 输入要求 输入一个正整数n(n≤12)。 输出要求 输出n!的值。 输入样例 5 输出样例 120 #include<stdio.h> int main() { int n,s=1; //首位为1 int i; scanf("%d",&n); for(i=1;i<=n;i++){ //从1到n的 逐级相乘 s*=i; } printf("%d\n",s); //输出阶乘

weixin_62283161的博客 3579

n的阶乘求解方法

n!的阶乘求解方法有以下三种 第一种通过递归计算: n=int(input()) def N(a):#定义一个函数进行阶乘计算 if a==1: return a else: return N(a-1)*a print(N(n)) 第二种方法就是调用math库,通过方法直接求出n的阶乘 import math print(math.factorial(int(input()))) #math.factorial(x)返回的是x的阶乘 第三种方法就是通过fo

CXYCMY的博客 1万+

Python入门小项目-计算阶乘n的三种方法+常见练习(含代码示例)

今天的文章主要给各位整理了Python常见的集中计算练习,这些也是作为初学者必会的联系项目了,代码分享出来,需要的朋友们可以看下~

m0_68103885的博客 2万+

求n的阶乘和n的阶乘的和

用C求解n的阶乘以及求解n的阶乘的和(内含源代码)

m0_63198468的博客 1697

求n的阶乘和求n的阶乘和——两种方法

方法一:递归求阶乘+循环求阶乘和 #include&lt;iostream&gt; using namespace std; int main() { int fac(int n);//声明函数 int sum=0; for (int i = 1; i &lt;= 4; i++) { sum += fac(i); } cout &lt;&lt; sum &lt;&lt; endl;...

qq_41024464的博客 1万+

循环的数学应用(3)——用while求n!(n的阶乘)

1.求n的阶乘 n的阶乘=n*n-1*n-2*n-3...*2*1 注意要考虑输入的为0 或者1 的情况。 主要代码: #define _CRT_SECURE_NO_WARNINGS //为解决scanf函数不安全的警告问题 #include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; int main() { int i = 2,n; fl...

陌上人如玉,公子世无双。 1万+

【大数据】求n的阶乘N!

求大数据n的阶乘 #include #include #define MAX 10000 using namespace std; int main(void) {     int n;     while(scanf("%d",&n)!=EOF&&n>=0)     {         int i,j;         int a[MAX];      //存数运算结果

Shawn Hou 4435

N的阶乘

题目描述  输入一个正整数N,输出N的阶乘。 输入描述: 正整数N(0&lt;=N&lt;=1000) 输出描述:  输入可能包括多组数据,对于每一组输入数据,输出N的阶乘 示例1 输入 复制 4 5 15 输出 复制 24 120 1307674368000   //具体算法很简单就是把数字存储在数组中,每一个元素存储一位数字,具体算法就是我们小学学的乘法...

zhangao230的博客 624

n的阶乘

大数的阶乘千万种,这里总结了一下大数阶乘的几种打法

门中雀的博客 2256

求n的阶乘(C语言)

首先要清楚阶乘定义,所谓 n 的阶乘,就是从 1 开始乘以比前一个数大 1 的数,一直乘到 n,用公式表示就是:n!设循环变量为 i,初值为 1,i 从 1 变化到 n;依次让 i 与 sum 相乘,并将乘积赋给 sum。递归和非递归分别实现求n的阶乘(不考虑溢出的问题)① 定义变量 sum,并赋初值 1。③ 直到 i 超过 n。

weixin_73669901的博客 1839

python实现阶乘的几种方法

python实现阶乘的几种方法 1、普通的for循环语句来计算阶乘: a = 1 n = int(input("请输入一个整数")) for i in range(1,n+1): a = a * i print(a) 2、使用标准模块来计算阶乘: 使用math模块的factorial()函数来计算阶乘 import math n = int(input("请输入一个整数:")) print(math.factorial(n)) 3、采用递归函数来计算阶乘 ...

cnds123的专栏 3万+

数据结构——大数阶乘

n(n>20)的阶乘 【问题描述】 大数运算——计算n的阶乘(n>=20)。 【基本要求】 (1)数据的表示和存储; (1.1)累积运算的中间结果和最终的计算结果的数据类型要求是整型——这是问题本身的要求; (1.2)试设计合适的存储结构,要求每个元素或结点最多存储数据的3位数值。 (2)数据的操作及其实现: 基于设计的存储结构实现乘法操作,要求从键盘上输入n值;在屏幕上显示最终...

二十四桥明月夜的博客 2775
上一篇: Keil uVision5安装配置与排错全指南:从下载到STM32工程实战
下一篇: 厨房小家电本质是时间与精力的再分配协议
weixin_34023982
博客等级 码龄11年 5265粉丝 1274原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值