- 博客(662)
- 资源 (1)
- 收藏
- 关注
原创 FPGA基础 -- Verilog 访问寄存器数组的指定位示例
本文介绍了 Verilog 中多维寄存器数组的访问 方法,主要涵盖五种场景:1)访问指定偏移寄存器;2)访问寄存器某一位;3)修改寄存器某一位;4)访问寄存器连续多位;5)组合访问多个寄存器的位。通过示例代码和表格总结,详细说明了不同访问方式的语法格式和应用场景,包括动态索引和位切片操作。这些技巧适用于处理寄存器数组的读写操作,是硬件描述语言编程的基础知识。
2025-07-16 23:00:00
97
原创 Linux基础 -- NAND Flash UBIFS基础特性及注意点
本文系统介绍了NAND Flash存储技术及其UBI/UBIFS管理方案。主要内容包括:1) NAND Flash物理特性分析,重点阐述页/块结构、坏块管理和擦除均衡机制;2) UBI层工作原理,详述其逻辑块映射、坏块管理等功能;3) UBIFS文件系统特性,包括压缩、日志恢复等优势;4) 完整操作流程,涵盖分区设置、格式化、挂载等关键步骤;5) 常见问题解决方案及与其他闪存文件系统的对比。该方案特别适用于大容量NAND Flash的嵌入式系统,能有效解决频繁写入、断电保护等关键需求。
2025-07-04 23:30:00
836
原创 Linux基础 -- UBI(**Unsorted Block Images**)
UBI(Unsorted Block Images)是Linux中为NAND Flash设计的逻辑管理层,位于MTD层之上,提供坏块管理、擦写均衡和逻辑地址映射等功能。UBI通过PEB、LEB和Volume等概念抽象NAND特性,支持UBIFS文件系统。常用工具包括ubiformat、ubiattach等,适用于嵌入式设备的rootfs和工业存储管理。UBI解决了NAND闪存的坏块、擦写寿命等问题,为上层提供可靠存储支持。
2025-07-03 23:00:00
450
原创 FPGA基础 -- Verilog TCM的概念与实现
TCM(紧耦合存储器)是一种直连CPU核心的高速存储区域,具有低延迟(单周期访问)、高确定性和高性能的特点,常用于实时系统关键数据存取。与AXI总线或普通BRAM相比,TCM无需仲裁,直接耦合CPU,特别适合中断处理、DSP运算等场景。在ARM架构中,ITCM和DTCM分别对应指令和数据存储。Verilog实现上,TCM表现为简单存储接口,通常1周期完成读写。在SoC设计中,TCM可配置为特定地址范围的专用存储器。测试时需验证其单周期响应特性。TCM弥补了缓存不可控的缺陷,是提升实时系统性能的有效方案。
2025-06-27 02:00:00
655
原创 FPGA基础 -- Verilog 建模示例之通用移位寄存器
本文介绍了一种可综合的通用移位寄存器Verilog设计。该模块支持并行加载、串行移位、使能控制和异步复位功能,采用参数化位宽配置,具备良好的可扩展性。文章详细讲解了代码实现要点,包括可综合性、配置灵活性和功能完备性的设计考量,并提供了仿真验证方法和扩展方向建议,如双向移位、环形移位等。该移位寄存器适用于串并转换、延迟线和序列检测等多种应用场景,是FPGA开发中的基础模块。
2025-06-25 23:00:00
705
原创 FPGA基础 -- Verilog 格雷码(Gray Code)计数器设计与原理解析
格雷码是一种相邻码字仅有一位变化的特殊编码方式,广泛应用于跨时钟域数据传输(如异步FIFO)和旋转编码器等领域。相比二进制码,格雷码能有效减少多位跳变带来的亚稳态风险。其编码方式为G = B ^ (B >> 1),解码则需逐位异或运算。Verilog实现格雷码计数器时,通过二进制计数转换输出格雷码。在异步FIFO设计中,格雷码指针通过同步器传递可确保安全的状态比较。特性对比显示,格雷码在可靠性方面优于二进制码,尤其适合跨时钟信号传输,尽管解码稍复杂且可读性较差,却是高可靠性设计的首选方案。
2025-06-25 23:00:00
917
原创 FPGA基础 -- Verilog 验证平台之 **cocotb 验证 `阶乘计算模块(factorial)` 的例子**
本文展示了一个使用cocotb验证Verilog阶乘计算模块的完整示例。RTL设计采用同步时序逻辑实现阶乘运算,支持4位输入(最大15!)。cocotb测试平台通过Python编写,包含随机激励生成(测试0-12的阶乘)、结果验证(与math.factorial对比)和详细日志输出。测试环境配置使用Icarus Verilog仿真器,通过Makefile简化流程。相比传统Verilog测试平台,cocotb提供更简洁的随机测试实现、丰富的数学函数支持和直观的调试日志。文章还建议了扩展测试方向,包括边界值测试
2025-06-24 23:00:00
286
原创 FPGA基础 -- Verilog 驱动强度(drive strength)与电荷强度(charge strength)
Verilog驱动强度与电荷强度解析 Verilog中驱动强度(8档)和电荷强度(3档)主要用于仿真级建模。驱动强度在多源驱动时决定最终值(如I²C总线),电荷强度描述晶体管电荷保持能力。实际应用中,pullup/pulldown配合弱驱动可模拟外部电阻,而强驱动用于逻辑输出。需注意:综合工具会忽略强度信息,仅在门级仿真有效。最佳实践包括强度差≥1级、testbench专用等,以避免仿真X态。这些特性有助于验证信号争用和总线空闲等场景,但硬件实现需依赖IO Buffer和外部电路。
2025-06-23 23:00:00
570
原创 FPGA基础 -- Verilog 竞争/竞态(Race Condition)
FPGA 基础 Verilog 竞争/竞态(Race Condition)
2025-06-23 23:00:00
783
原创 FPGA基础 -- Verilog 命令行参数变量(Command-line Plusargs)
Verilog命令行参数(Plusargs)使用指南 Plusargs是Verilog/SystemVerilog仿真时通过命令行传递的键值对参数,用于动态配置仿真行为。系统提供两种读取方式: $test$plusargs检测参数是否存在(布尔值) $value$plusargs获取参数值并赋给变量 典型应用包括调试开关、寄存器配置、测试场景选择等。使用时需注意: 必须设置默认值防护 仅用于仿真(不可综合) 不同仿真器支持一致 通过合理使用Plusargs,可以构建灵活的参数化验证平台,建议配合自动化脚本管
2025-06-23 23:00:00
339
原创 FPGA基础 -- Verilog 验证平台
Verilog验证方法全景解析 验证流程分为需求分析、环境架构、用例开发、回归执行和结果分析五个阶段,核心目标是构建自检式、覆盖驱动的可重用验证平台。基础验证方法包括纯Verilog测试平台搭建,需关注DUT例化、时钟复位、激励生成、参考模型和自检机制。高级方法涉及分层架构设计、SystemVerilog随机化验证、覆盖率驱动和断言验证。UVM方法学提供了标准化验证框架,而Python/cocotb则实现了脚本化验证。验证过程中需注意激励与参考模型一致性、时钟同步、随机可重复性等常见问题。最终验证应实现Bu
2025-06-23 23:00:00
687
原创 FPGA基础 -- Verilog 层次路径名
**摘要:Verilog 层次路径名(Hierarchical Path Names)**用于模块信号/子模块的跨层级访问,格式为top.submodule.signal,支持绝对/相对路径。主要应用于仿真调试(如ModelSim信号监视)、时序约束(XDC/SDC)和Testbench验证。使用时需注意:1)工具差异(Vivado用/分隔路径);2)避免RTL代码直接引用;3)规范命名以提升可维护性。调试时可利用工具(如ModelSim的show signals或Vivado Hierarchy视图)查看
2025-06-20 23:00:00
355
原创 FPGA基础 -- Verilog 共享任务(task)和函数(function)
Verilog任务与函数专业培训摘要 Verilog中task与function的核心区别在于:task支持时序控制(#/@)和并发调用,适合复杂时序建模;function仅用于组合逻辑计算,可综合但无延迟。关键设计规范:1)使用automatic避免共享变量冲突;2)task用于仿真建模,function实现可综合逻辑;3)跨模块共享时推荐SystemVerilog的package或include文件方式。特别注意:未声明automatic的task在多处调用时会产生竞态,函数包含延迟语句将导致综合失败。
2025-06-20 23:00:00
830
原创 FPGA基础 -- Verilog 的属性(Attributes)
摘要: Verilog属性(Attributes)是附加在代码对象上的元信息,用于指导EDA工具(如综合器、仿真器)优化、保留或特殊处理特定代码元素,而不会改变功能行为。本文系统化介绍了Verilog属性的语法((*attribute=value*))、分类(保留/时序/综合优化/布局布线)、常见属性(如keep、ram_style)及工具兼容性(Vivado/Quartus等差异)。通过实际案例(如防止优化移位寄存器、强制BRAM推断)说明工程应用,并强调属性需遵循工具链规范。内容适合工程师深入掌握属性在
2025-06-20 23:00:00
845
原创 FPGA基础 -- Verilog 的值变转储文件(VCD:Value Change Dump)
摘要: Verilog的**值变转储文件(VCD)**是记录仿真中信号变化的文本文件,用于波形调试与验证。通过Testbench中的$dumpfile和$dumpvars函数生成,支持层级控制和动态开关($dumpoff/$dumpon)。VCD文件包含时间戳、信号值变化等信息,可用GTKWave工具可视化。优化技巧包括选择性转储信号、分段记录以减少文件体积。注意避免非标准类型,在Vivado等工具中需兼容处理。VCD文件是RTL调试的重要辅助手段,适用于行为验证和时序分析。
2025-06-20 23:00:00
370
原创 FPGA基础 -- Verilog 系统任务与系统函数
Verilog中的系统任务和系统函数是仿真与综合设计中的重要工具。系统任务(如$display、$monitor)用于仿真调试,不返回值,多用于显示、文件IO等操作;系统函数(如$time、$clog2)则可返回值,部分可综合(如$clog2用于总线宽度计算)。关键区别在于系统任务带分号调用且不返回值,系统函数可赋值且返回结果。实际应用中需注意哪些功能仅支持仿真(如$finish),哪些可综合(如$signed)。正确使用这些功能可提升仿真效率与RTL设计质量。
2025-06-19 23:00:00
344
原创 FPGA基础 -- Verilog 概率分布函数
摘要: Verilog作为硬件描述语言,通过$random/$urandom等函数支持伪随机数生成,常用于仿真测试中的随机激励生成。实现概率分布需手动建模:均匀分布用$urandom_range,离散概率通过区间划分,高斯分布可叠加均匀分布近似。SystemVerilog的rand和约束机制(如dist权重)提供了更高效的PDF实现。应用场景包括功能覆盖、误码注入和蒙特卡洛分析。注意避免种子不可复现、范围失控等问题,推荐在验证环境中结合SystemVerilog提升随机测试效率。(150字)
2025-06-19 23:00:00
529
原创 FPGA基础 -- Verilog 禁止语句
Verilog 非综合语句解析与设计规范 本文系统讲解Verilog中禁止用于综合的语句类型及其原因。关键点包括: 禁止语句范围:延迟控制(#)、系统任务($display等)、文件操作及仿真专用初始化行为,均无硬件对应结构。 可综合替代方案:同步时序逻辑(如always @(posedge clk))替代延迟;调试语句仅限testbench使用;ROM初始化需特殊处理。 工具处理机制:综合工具会报错(如Vivado提示"non-constant delay"),建议通过ifdef SY
2025-06-19 23:00:00
305
原创 FPGA基础 -- Verilog 命名事件
摘要: Verilog的“命名事件(Named Events)”是用于仿真的同步机制,通过event定义,用->触发和@等待,适用于模块间同步、Testbench流程控制。它仅用于仿真,不可综合,适用于多线程协调(如fork-join)或行为模型触发,但需避免在RTL设计中使用。典型场景包括DUT-TB同步、FSM通信和仿真事件调度,与信号触发相比,命名事件更轻量但不可见波形。建议在验证环境中灵活应用以提升仿真效率。
2025-06-19 23:00:00
405
原创 FPGA基础 -- Verilog 结构建模之端口的不同位宽处理机制
Verilog结构建模中端口位宽处理是设计可扩展模块的关键。文章详细解析了不同位宽情况:单比特端口适用于控制信号;多比特向量用于数据总线;参数化位宽提升模块重用性;混合位宽需谨慎处理转换。重点介绍了位扩展、截断等转换技巧,以及在顶层例化时的位宽匹配方法。同时指出位宽不匹配可能导致综合警告、仿真差异等问题,并给出工程实践建议:使用参数化位宽、显式处理转换等。通过系统掌握位宽处理机制,可以有效提升Verilog模块的灵活性和可靠性。
2025-06-19 22:00:00
479
原创 FPGA基础 -- Verilog 结构建模之模块参数值
摘要: Verilog中的parameter机制是实现模块可配置设计的核心,用于总线宽度、流水线级数等场景。通过模块头部#(parameter NAME=VALUE)声明,可在实例化时覆盖默认值(推荐命名参数.NAME(VALUE)形式)。localparam用于内部常量计算,与parameter形成互补。典型应用包括FIFO位宽配置、AXI总线适配及条件功能生成(配合generate)。设计规范建议参数大写命名、提供默认值,避免硬编码,并通过分层传递实现统一配置。参数化模块(如通用FIFO)显著提升代码复
2025-06-19 20:00:00
509
原创 FPGA基础 -- Verilog 结构建模之端口
本文系统讲解Verilog结构建模中的端口使用,从基础概念到工程实践。首先介绍Verilog的三种建模方式,重点说明结构建模通过模块例化和端口连接实现电路设计。详细解析输入/输出/双向三种端口类型,对比ANSI和非ANSI两种声明风格。通过加法器实例演示模块例化的两种连接方式,强调命名连接的优势。最后列举结构建模的注意事项和大型项目应用场景,指出其模块化、可重用的核心价值。全文150字,涵盖从基础语法到工程实践的关键知识点。
2025-06-19 02:00:00
355
原创 FPGA基础 -- Verilog 结构建模之模块实例引用语句
Verilog模块实例引用语句详解 模块实例引用(Module Instantiation)是结构建模的核心,用于将预定义模块集成到当前设计中。主要方法包括: 基本语法:推荐命名连接方式(.port(signal)),可增强代码可读性与维护性; 参数化实例化:通过#(.param(value))配置模块参数(如位宽),提升复用性; 多实例管理:利用generate批量例化同类模块(如多通道处理单元); 工程实践:需注意跨文件引用、顶层模块设计规范(命名一致性、层级管理)及EDA工具协同。 典型应用:IP核集
2025-06-19 02:00:00
437
原创 FPGA基础 -- Verilog 结构建模之未连接的端口
Verilog中结构建模时未连接端口处理指南 本文介绍Verilog模块例化中未连接端口(Unconnected Ports)的正确处理方法。主要内容包括: 定义:未连接端口指模块例化时不使用的调试接口、保留通道等。 推荐写法:使用命名连接空写法(.port()),避免位置连接省略带来的可读性问题。 工具处理:综合器通常优化未连接端口,仿真时可能保持高阻态(Z)。 工程规范:建议添加注释说明未连接原因,保留扩展性,避免冗余信号。 场景示例:调试接口、保留通道等典型应用场景。 通过规范化的未连接端口处理,可提
2025-06-19 02:00:00
392
原创 FPGA基础 -- Verilog 数据流建模之幅值比较器
摘要: 幅值比较器用于比较两个N位二进制数大小,输出大于、等于或小于三种状态。数据流建模通过布尔表达式描述逻辑关系,Verilog中使用assign语句实现。1位比较器通过真值表推导逻辑表达式,N位比较器可采用关系运算符或递归逐位比较法实现。数据流建模具有无状态、可综合性强等特点,适用于图像阈值判断、排序比较器等应用。高位宽比较需考虑电路优化,避免组合路径过长。该设计在数字系统中应用广泛,是构建排序网络、优先级编码等模块的基础组件。
2025-06-18 23:30:00
874
原创 FPGA基础 -- Verilog 行为级建模之过程性结构
Verilog 过程性结构摘要:过程性结构(如always/initial块)用于描述硬件行为的顺序执行逻辑,分为顺序结构(begin-end)、条件分支(if/case)和循环(for/while)。其中if/case需完整覆盖条件避免锁存器,for可综合但需固定循环次数。时序逻辑用非阻塞赋值(<=),组合逻辑用阻塞赋值(=)。测试平台可配合fork-join实现并发仿真。注意:while/forever仅限仿真,综合需规避。关键点:明确赋值方式、完整条件分支、区分可综合与仿真专用语法。
2025-06-18 23:30:00
667
原创 FPGA基础 -- Verilog行为级建模之initial语句
Verilog中initial语句块是仿真环境的关键结构,用于在时间0执行一次的行为级建模。主要功能包括变量初始化、时钟信号生成、复位控制和仿真结束管理。语法简单,但不能用于综合,仅适用于testbench设计。多个initial块会并行执行,使用时需注意时间延迟控制以避免竞争条件。常配合task和fork...join组织复杂初始化逻辑,与always块相比,initial只执行一次且支持时间延迟。典型应用包括D触发器测试平台的时钟生成和激励控制。使用时需避免综合误用并注意时序控制。
2025-06-18 23:30:00
409
原创 FPGA基础 -- Verilog行为级建模之alawys语句
Verilog中的always语句是硬件行为建模的核心结构,主要用于时序和组合逻辑设计。时序逻辑采用posedge clk触发和非阻塞赋值,如寄存器建模;组合逻辑使用@(*)触发和阻塞赋值,需完全赋值以避免锁存器。关键注意事项包括:时序/组合逻辑分离建模、正确使用赋值类型(<=或=)、确保敏感列表完整,以及避免变量多处赋值。SystemVerilog的always_ff和always_comb提供更强的语义检查。遵循这些规范可提高代码可读性和综合效果。
2025-06-18 23:30:00
407
原创 FPGA基础 -- Verilog 行为级建模之过程性赋值
摘要:Verilog中的过程性赋值是实现行为级建模的关键,分为阻塞赋值(=)和非阻塞赋值(<=)。阻塞赋值用于组合逻辑,按顺序执行;非阻塞赋值用于时序逻辑,并行调度以避免竞态。正确使用两者可有效构建状态机、触发器等电路。组合逻辑用always @(*)+=,时序逻辑用always @(posedge clk)+<=。避免在时序逻辑中使用阻塞赋值,防止综合问题。示例展示了状态机中两种赋值的典型应用,强调了设计规范与综合可行性。
2025-06-18 23:30:00
340
原创 FPGA基础 -- Verilog 行为级建模之条件语句
摘要: Verilog行为级建模中的条件语句是实现复杂逻辑控制的关键,主要包括if/else、case/casex/casez和三元运算符。组合逻辑需避免未覆盖条件导致的锁存器(LATCH),时序逻辑中常用if控制状态机。case适合多分支优化,casez支持通配匹配但需谨慎使用。SystemVerilog的unique/priority可提升综合效率。工程中应预设默认值、添加default分支,并权衡可读性与综合优化。行为级建模的核心目标是清晰描述“做什么”而非“如何实现”。
2025-06-18 23:30:00
341
原创 FPGA基础 -- Verilog行为建模之循环语句
本文系统讲解了Verilog行为级建模中的循环语句,包括repeat、while、for、forever等类型的使用方法、应用场景和注意事项。重点分析了for循环在仿真和综合中的使用区别,介绍了循环控制语句disable的功能,并提供了工程实践中的典型应用范例。文章还对比了行为级循环与生成语句的差异,给出了仿真调试技巧和常见误区总结。最后强调需掌握循环语句的可综合限制和安全使用规范,以正确应用于硬件描述和仿真建模中。
2025-06-18 23:30:00
1003
原创 FPGA基础 -- Verilog 结构建模
Verilog结构建模采用模块例化方式组装系统,接近硬件连接,适合层次化设计。通过实例讲解1位半加器(由XOR和AND门构成),展示模块连接方法。结构建模支持参数化设计、多实例复用,推荐用于多模块协同、SoC搭建等场景。相比行为建模,它更直观地体现系统架构,是实现FPGA大规模设计的主流方法,但简单逻辑推荐使用行为建模更高效。核心特点是模块化、可重用性和清晰的系统层次结构。
2025-06-18 23:30:00
540
原创 FPGA基础 -- Verilog 数据流建模
Verilog数据流建模摘要(150字) Verilog数据流建模采用assign语句描述组合逻辑,强调信号间的逻辑关系而非时序。其特点包括:面向组合电路、抽象程度高、不依赖时钟信号。常用表达式包括基本逻辑运算、条件选择(三目运算符)以及generate批量生成结构。相比行为建模更简洁高效,易被综合工具优化,但需避免赋值环路、多驱动等陷阱。数据流建模适用于编码器、加法器等组合逻辑设计,配合Testbench验证可确保功能正确性。进阶应用可延伸到复杂算术电路和可扩展逻辑模块的设计实现。
2025-06-18 23:00:00
350
原创 FPGA基础 -- Verilog 锁存器简介
Verilog锁存器(Latch)详解摘要:锁存器是电平敏感的时序逻辑单元,在控制信号有效时透明传输数据,无效时保持状态。Verilog中常因未覆盖完整if/else分支而被综合出锁存器。与边沿敏感的触发器不同,锁存器易引入时序冒险,在FPGA设计中应谨慎使用。建议组合逻辑覆盖所有分支,时序逻辑优先选用触发器。综合工具可检测意外生成的锁存器,通过always_ff和完整赋值可避免此问题。锁存器适用于特定场景如异步采样,但主流设计推荐使用更稳定的触发器结构。
2025-06-18 23:00:00
537
原创 FPGA基础 -- Verilog行为级建模之时序控制
摘要: Verilog行为级建模中的时序控制机制是FPGA设计的关键,本文系统讲解其应用与优化。内容涵盖:1)行为级建模定位,强调其高层抽象特点;2)时序控制三大语法(阻塞/非阻塞赋值、时间控制语句、事件触发);3)综合友好范例(寄存器/状态机建模);4)行为到RTL的优化路径;5)握手协议实例分析;6)常见调试方法。重点指出阻塞赋值(=)用于组合逻辑,非阻塞(<=)用于时序逻辑的设计规范,并提供状态机、仿真调试等实用技巧,适合从入门到进阶的硬件工程师学习参考。(150字)
2025-06-18 23:00:00
454
原创 FPGA基础 -- Verilog行为级建模之并行语句块
摘要: Verilog中的并行语句块(fork...join)用于行为级建模,实现多任务并发执行,但仅限于仿真不可综合。它支持三种同步机制(join、join_any、join_none),适用于Testbench中的多信号驱动、异步事件模拟等场景。典型应用包括并行任务启动、超时监控及多线程行为仿真,但需注意执行顺序控制。与可综合的always块不同,fork...join是仿真语义,不适用于RTL设计。其优势在于简化复杂测试逻辑,但需避免在硬件实现中使用。
2025-06-18 15:13:52
356
原创 FPGA基础 -- Verilog表达式之操作数
摘要:Verilog中的操作数(Operand)是参与运算的对象,包括常量、变量、表达式、位选、信号连接和函数返回值等。操作数具有位宽和类型(有符号/无符号)属性,直接影响硬件电路综合结果。常见使用场景包括算术/逻辑运算、条件判断和状态选择。操作数在电路中对应输入输出线、寄存器或组合逻辑路径。工程实践中需注意位宽对齐、避免隐式扩展,并规范常量书写格式。通过类比烹饪中的原料,可以形象理解操作数在硬件描述语言中的角色。(150字)
2025-06-17 23:30:00
406
原创 FPGA基础 -- Verilog 表达式
Verilog表达式是硬件描述语言中构建逻辑运算的核心元素,不同于软件编程的计算过程,它们直接映射为硬件电路结构。文章系统介绍了六类常见表达式:组合逻辑、算术、比较、位运算、逻辑和三目表达式,通过水管、开关等生活类比解释其硬件实现(如加法器、与门、多路选择器等)。同时指出设计陷阱,包括位宽不匹配、优先级混淆和状态判断问题,建议使用括号、强制位宽匹配等优化技巧。强调Verilog表达式本质是"搭建"而非"计算",合理运用可构建高效可靠的数字电路。全文以技术场景化为特色,
2025-06-17 23:00:00
313
原创 FPGA基础 -- Verilog表达式之操作数:常数
Verilog 常数操作数是固定值,格式为[位宽]'[进制][数值],支持二进制(b)、八进制(o)、十进制(d)和十六进制(h)。常数常用于初始化赋值、条件判断、位运算和移位操作。使用技巧包括:用localparam命名常数避免魔法数,利用{8{1'b1}}快速赋值全1值,注意位宽匹配防止截断。常见错误有漏写撇号、位宽不匹配和二进制位数不足。合理使用常数可提高代码可读性和维护性。
2025-06-17 23:00:00
305
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人