Vivado初体验LED工程

2023-11-12


前言

本节我们要做的是熟练使用 Vivado 创建工程并实现对 LED 灯控制,每秒钟控制开发板上的 LED 灯翻转一次,实现亮、灭、亮、灭的控制。会控制 LED 灯,其它外设也慢慢就会了。


一、PL 和 PS

在FPGA中

  • PS:处理系统 (Processing System) :就是与 FPGA 无关的 ARM 的 SOC 的部分。
  • PL:可编程逻辑 (Progarmmable Logic): 就是 FPGA 部分。之所以叫 PL,而不是叫 FPGA,用英文简写可能便于理解区分,或者显得比较专业吧。

对于 ZYNQ,就是两大功能块,PS 部分和 PL 部分, ARM 的 SOC 部分,和 FPGA 部分。我们可以通过调用 IP 核,系统会使用 AXI(Advanced eXtensible Interface)接口将 IP 与处理器连接,也就是实现 PL 与 PS 互联。

我们就是要实现基于 PL 的点灯实验。

二、LED 硬件介绍

1、开发板的 PL 部分连接了 1 个红色的用户 LED 灯。这 1 个灯完全由 PL 控制。
在这里插入图片描述
2、我们可以根据原理图的连线关系确定 LED 和 PL 管脚的绑定关系。
LED -> R19

3、原理图中以 PS_MIO 开头的 IO 都是 PS 端 IO,不需要绑定,也不能绑定。
在这里插入图片描述

三、创建 Vivado 工程

1、启动 Vivado,在 Vivado 开发环境里点击 “Create New Project”,创建一个新的工程
在这里插入图片描述
2、弹出一个建立新工程的向导,点击 “Next”
在这里插入图片描述
3、在弹出的对话框中输入工程名和工程存放的目录,我们这里取一个 led 的工程名。需要注意工程路径 “Project location” 不能有中文、空格,路径名称也不能太长。点击 next
在这里插入图片描述
4、在工程类型中选择 “RTL Project”
在这里插入图片描述
5、目标语言 “Target language” 选择 “Verilog”,虽然选择 Verilog,但 VHDL 也可以使用,支持多语言混合编程。
在这里插入图片描述
6、点击 “Next”,不添加任何文件
在这里插入图片描述
7、在 “Default Part” 选项中,器件家族 “Family” 选择 “Zynq-7000”,封装类型 “Package” 选择 “clg400”,减少我们选择范围。AC7010 在下拉列表中选择 “xc7z010clg400-1”,AC7020 在下拉列表中选择 “xc7z020clg400-2”“-2” 表示速率等级,数字越大,性能越好,速率高的芯片向下兼容速率低的芯片。
在这里插入图片描述
8、点击 “Finish” 就可以完成以后名为 “led” 工程的创建。
在这里插入图片描述
9、Vivado 软件界面
在这里插入图片描述

四、创建 Verilog HDL 文件

1、点击 Project Manager 下的 Add Sources 图标(或者使用快捷键 Alt+A)
在这里插入图片描述
2、选择添加或创建设计源文件 “Add or create design sources”,点击 “Next”
在这里插入图片描述
3、选择创建文件 “Create File”
在这里插入图片描述
4、文件名 “File name” 设置为 “led”,点击 “OK”
在这里插入图片描述
5、点击 “Finish”,完成 “led.v” 文件添加
在这里插入图片描述
6、在弹出的模块定义 “Define Module” 中可以指定 “led.v” 文件的模块名称 “Module name”,这里默认不变为 “led”,还可以指定一些端口,这里暂时不指定,点击 “OK”
在这里插入图片描述
7、在弹出的对话框中选择 “Yes”
在这里插入图片描述
8、双击 “led.v” 可以打开文件,然后编辑
在这里插入图片描述
9、编写 “led.v”,这里定义了一个 32 位的寄存器 timer,用于循环计数 0~49999999(1 秒钟),计数到 49999999(1 秒)的时候,寄存器 timer 变为 0,并翻转一个 LED。这样原来 LED 是灭的话,就会点亮,如果原来 LED 为亮的话,就会熄灭。编写好后的代码如下:

`timescale 1ns / 1ps

module led(
    input sys_clk,
    input rst_n,
    output reg  led
    );
reg[31:0] timer_cnt;
always@(posedge sys_clk or negedge rst_n)
begin
	if(~rst_n) begin
        led <= 1'b0;
        timer_cnt <= 32'd0;
    end
    else if(timer_cnt >= 32'd49_999_999)
    begin
        led <= ~led;
        timer_cnt <= 32'd0;
    end
    else
    begin
        led <= led;
        timer_cnt <= timer_cnt + 32'd1;
    end
    
end
endmodule

10、编写好代码后保存,点击菜单 “File -> Save All Files”
在这里插入图片描述

五、添加管脚约束

Vivado 使用的约束文件格式为 xdc 文件,xdc 文件里主要是完成管脚的约束,时钟的约束,以及组的约束。这里我们需要对 led.v 程序中的输入输出端口分配到 FPGA 的真实管脚上。

1、点击 “Open Elaborated Design”
在这里插入图片描述
2、在弹出的窗口中点击 “OK” 按钮
在这里插入图片描述
3、在菜单中选择 “Window -> I/O Ports”
在这里插入图片描述
4、在弹出的 I/O Ports 中可以看到管脚分配情况,给 LED 和时钟分配管脚、电平标准,完成后点击保存(ctrl+s)
①、 LED -> R19
在这里插入图片描述
②、SYS_CLK -> U18
在这里插入图片描述
③、随便选择一个没有接外围设备的引脚,当做 RST 引脚,我这里选择了 T11
RST_N -> T11
在这里插入图片描述
④、因此分配情况如下:
在这里插入图片描述
6、弹出窗口,要求保存约束文件,文件名我们填写 “led”,文件类型默认 “XDC”,点击 “OK”
在这里插入图片描述
此刻我们在这里可以看到多了一个 led.xdc
在这里插入图片描述
7、打开刚才生成的 “led.xdc” 文件,我们可以看到是一个 TCL 脚本,如果我们了解这些语法,完全可以通过自己编写 led.xdc 文件的方式来约束管脚
在这里插入图片描述
下面来介绍一下最基本的 XDC 编写的语法,普通 IO 口只需约束引脚号和电压。

管脚约束如下:

 set_property PACKAGE_PIN "引脚编号" [get_ports “端口名称”]

电平信号的约束如下:

set_property IOSTANDARD "电平标准" [get_ports “端口名称”]

这里需要注意文字的大小写,端口名称是数组的话用 { } 括起来,端口名称必须和源代码中的名字一致,且端口名字不能和关键字一样。

电平标准中 “LVCMOS33” 后面的数字指 FPGA 的 BANK 电压,LED 所在 BANK 电压为 3.3 伏,所以电平标准为“LVCMOS33”。Vivado 默认要求为所有 IO 分配正确的电平标准和管脚编号。

六、添加时序约束

一个 FPGA 设计除了管脚分配以外,还有一个重要的约束,那就是时序约束,这里通过向导方式演示如果进行一个时序约束。
1、点击 “Run Synthesis” 开始综合
在这里插入图片描述
2、弹出对话框点击 “OK”
在这里插入图片描述
可以看到右上角正在进行综合
在这里插入图片描述

3、综合完成以后点击 “Cancel”
在这里插入图片描述
4、点击 “Constraints Wizard”
在这里插入图片描述
5、在弹出的窗口中点击 “Next”
在这里插入图片描述
6、时序约束向导分析出设计中的时钟,这里把 “sys_clk” 频率设置为 50Mhz,然后点击 “Skip to Finish” 结束时序约束向导。
在这里插入图片描述
7、点击 “Finish”
在这里插入图片描述
8、这个时候 led.xdc 文件已经更新,重新加载文件即可

最下面多了一行约束时钟
在这里插入图片描述

七、生成 BIT 文件

1、编译的过程可以细分为综合、布局布线、生成 bit 文件等,这里我们直接点击 “Generate Bitstream”,直接生成 bit 文件。
在这里插入图片描述
2、在弹出的对话框中可以选择任务数量,这里和 CPU 核心数有关,一般数字越大,编译越快,点击 “OK”
在这里插入图片描述
3、这个时候开始编译,可以看到右上角有个状态信息,在编译过程中可能会被杀毒软件、电脑管家拦截运行,导致无法编译或很长时间没有编译成功。
在这里插入图片描述
4、编译中没有任何错误,编译完成,弹出一个对话框让我们选择后续操作,若是接下来想要直接下载到 fpga 上可以选择 “Open Hardware Manger”,跳过下面的八、仿真测试,若是接下来想要先进行仿真一下验证下功能可以继续往下看我这里先进行一下仿真验证下功能,因此点击 Cancel。
在这里插入图片描述

八、仿真测试

仿真在 FPGA 的设计中是很重要的,它可以在前期帮我们验证我们的设计以及功能是否是正确的,可以省去我们后期调试很多的问题。

1、右键 SIMULATION -> simulation Settings
在这里插入图片描述
2、仿真时间修改为 50ms(这是一个初始的仿真时间),其他保持不变,点击 “OK”
在这里插入图片描述
3、添加源文件
①、点击 “+”
在这里插入图片描述
②、添加或者创建仿真源
在这里插入图片描述
③、Create File
在这里插入图片描述
④、在弹出的窗口输入 File name 为 vtf_led_test
在这里插入图片描述
⑤、点击 “Finish”
在这里插入图片描述
⑥、弹出窗口再点击 “OK”
在这里插入图片描述
⑦、弹出窗口再点击 “Yes”
在这里插入图片描述
4、在 Simulation Sources 下面可以看到我们创建的 vtf_led_test.v 文件
在这里插入图片描述
5、把下面的测试代码拷贝到 vtf_led_test.v 中

`timescale 1ns/1ps    // 时间单位/精度

//------------<模块及端口声明>----------------------------------------
module vtf_led_test;
// Input
reg sys_clk;
reg rst_n;
// Output
wire led;

//------------<例化被测试模块>---------------------------------------
led uut (
    .sys_clk(sys_clk),
    .rst_n(rst_n),
    .led(led)
);

//------------<设置初始测试条件>----------------------------------------
initial
begin
    sys_clk = 1'b0;               // 初始时钟为0
    rst_n = 1'b0;
    #5;                          // 5个时钟周期后
    rst_n = 1'b1;
end
//------------<设置时钟>----------------------------------------------
always #10 sys_clk = ~ sys_clk;     // 系统时钟周期20ns

endmodule 

6、保存后可以看到层级关系
在这里插入图片描述
7、进行仿真,左键 Run Simulation -> Run Behavioral Simulation 进行行为级仿真
在这里插入图片描述
8、仿真初始界面
在这里插入图片描述
9、将 timer_cnt 拖拽到仿真界面 Name 栏目中
在这里插入图片描述
10、timer_cnt 右键 -> Radix -> Unsigned Decimal
在这里插入图片描述
11、执行 Run All(F3)
在这里插入图片描述
12、等待一会儿时间停止运行,搜索 1s 的时候(右键 Go To Time),可以看 led 从 0 变成了 1,如此反复
在这里插入图片描述

九、下载测试

1、AC7020 开发平台支持三种启动模式。这三种启动模式分别是 JTAG 调试模式,QSPI FLASH 和 SD 卡启动模式,ZYNQ7000 芯片上电后会检测响应 MIO 口的电平来决定那种启动模式。可以通过核心板上的 J13 的跳线来选择不同的启动模式,我们这里选择链接右边两个引脚,启动模式是 JTAG
在这里插入图片描述

2、连接好开发板的 JTAG 接口(仿真器线),给开发板上电(电源线)
3、在 “HARDWARE MANAGER” 界面点击 “Auto Connect”,自动连接设备
在这里插入图片描述
4、可以看到 JTAG 扫描到 arm 和 FPGA 内核(图中为 xc7z020,AC7010 开发板实际为 xc7z010_1,AC7020 开发板实际为 xc7z020_1),还有一个 XADC,可以检测系统电压、温度
在这里插入图片描述
5、选择 xc7z020_1,右键 “Program Device…”
在这里插入图片描述
6、在弹出窗口中点击“Program”
在这里插入图片描述
7、等待下载
在这里插入图片描述
8、下载完成以后,我们可以看到 1 颗 LED 开始每秒变化一次。(因为未将程序下载到 flash 里面,因此掉电后程序不可保存

fpga_led闪烁


我的qq:2442391036,欢迎交流!


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vivado初体验LED工程 的相关文章

  • Quartus II 安装

    本次介绍使用的 Quartus 版本为 10 1 目前 Quartus II 官网已经没有 13 1 以下版本的安装包 大家可以安装 13 1 以上版本的软件 功能都是大同小异 下载地址 FPGA Software Download Cen
  • STM32【复习串口】

    串口复习加深理解笔记 杂谈 USART FLAG TXE发送缓冲区空标志 说明可以往数据寄存器写入数据了 但并不代码数据发送完成了 USART FLAG TC发送完成标志 这个才是代表USART在缓冲区的数据发送完成了 即从机接收到了数据
  • 【Xilinx Vivado时序分析/约束系列6】FPGA开发时序分析/约束-IO时序输入延时

    目录 源同步FPGA输入时序分析的模型 input delay约束 极限input delay 往期系列博客 源同步FPGA输入时序分析的模型 以下为源同步FPGA输入时序分析的模型的示意图 在之前的文章中介绍过 在此介绍一下各个时钟延时的
  • Verilog:【1】时钟分频电路(clk_divider.sv)

    碎碎念 作为Basic Verilog的第一个学习笔记 打算用这种命名方式来对博客进行命名 应该有助于检索 简单阅览了部分工程的代码 发现里面有很多嵌套关系 因此决定先从基础模块开始 也是为了整个博客内容的流畅性 读者朋友有问题的话 也可以
  • 平头哥(T-Head )开源RISCV处理器OpenC906 RTL仿真

    在过去的几年里 阿里集团平头哥陆续推出了几款RISCV处理器 有些处理器已经在产业界得到了应用 比如在某志的D1处理器中 就嵌入了平头哥的玄铁C906内核为 芯 RISCV虽然是一个开放标准 并且网络上也不乏一些开源核的RTL实现 但是商用
  • Vivido添加pynq-Z2开发板

    一 下载pynq z2开发板文件 下载地址 https www tulembedded com FPGA ProductsPYNQ Z2 html 二 将下载的文件解压到vivado安装的位置 如果boards目录下面没有boards fi
  • MIPI D-PHY介绍(二) FPGA

    MIPI D PHY介绍 二 FPGA 随着移动设备的广泛普及 MIPI D PHY作为其最主要的物理层标准之一 被越来越多地使用在各种嵌入式系统中 本文将详细介绍MIPI D PHY的工作原理和在FPGA设计中的实现方法 MIPI D P
  • 硬件基础知识

    SPI是串行外设接口 Serial Peripheral Interface 的缩写 是一种高速的 全双工 同步的通信总线 SCLK SCLK是一种有固定周期并与运行无关的信号量 CLK CLK是一种脉冲信号 TDNN 时延神经网络 它的两
  • verilog中wire和reg类型的区别

    module counter parameter CNT MAX 25 d24 999 999 input wire sys clk input wire sys rst n output reg led out reg 24 0 cnt
  • 关于Keil中Memory中观察不到数据变化的问题以及启动文件栈的初始化

    关于Keil中Memory中观察不到数据变化的问题 在KEIL中观察Memory数据变化 一定要记得只能在RAM地址或ROM之内观察 如下图所示 RAM的地址设置在地址为0x20000000开始的地方 大小为0x20000 因此只有在这个范
  • 用Vscode编辑verilog代码配置

    这篇教程感觉很详细了 我这里分享一下vscode和插件的安装包链接 都是官网下载的 放心食用 用VSCode编辑verilog代码 iverilog编译 自动例化 自动补全 自动格式化等常用插件 链接 https pan baidu com
  • 跨时钟域处理方法(一)——打拍

    一 说明 处理跨时钟域的数据可以分为单bit数据和多bit数据 而打拍的方法主要常见于处理单bit数据的跨时钟域问题 打拍的本质是通过添加寄存器 对输入的数据进行延拍 其主要目标是消除亚稳态的影响 常见的是打2拍 也就是添加2级寄存器 二
  • 实验1-FPGA编程入门

    文章目录 一 认识全加器 二 输入原理图实现1位加法器 一 半加器原理图输入 二 全加器原理图输入 三 Verilog语言实现全加器 四 总结 五 资料参考 一 认识全加器 一 半加器 1 逻辑分析 如下图所示 半加器只有两个输入和两个输出
  • FIFO读写控制

    如果在两个模块之间传输数据 两个模块之间的处理速率不同 会导致采集数据的遗漏或错误 在他们之间加一个数据缓存器 所有数据先经过缓存器缓存 再输入数据接送模块 创建两个模块 一个 作为发送模块 一个作为接受模块 发送模块检测到 fifo为空开
  • 小梅哥Xilinx FPGA学习笔记9——语法(阻塞与非阻塞赋值)

    阻塞赋值与非阻塞赋值详解 注意 阻塞赋值 1 设计文件 2 激励文件 3 原理图 4 仿真图 非阻塞赋值 1 设计文件 2 激励文件 3 原理图 4 仿真图 注意 阻塞赋值与非阻塞赋值 只有在时序逻辑中才有 不是阻塞赋值 也不是非阻塞赋值
  • Verilog之assign

    Verilog中的关键词assign主要用于如下两个地方 数据流建模 用于数据流建模的显示连续赋值语句语法格式如下
  • 吃透Chisel语言.18.Chisel模块详解(五)——Chisel中使用Verilog模块

    Chisel模块详解 五 Chisel中使用Verilog模块 上一篇文章讲述了用函数实现轻量级模块的方法 可以大幅度提升编码效率 Chisel中也提供了一些好用的函数 方便我们编写代码 也方便Chisel编译器优化生成的硬件电路 在Chi
  • 蓝桥杯真题:迷宫

    目录 题目描述 运行限制 dfs bfs 结果 题目描述 本题为填空题 只需要算出结果后 在代码中使用输出语句将所填结果输出即可 下图给出了一个迷宫的平面图 其中标记为 11 的为障碍 标记为 00 的为可以通行的地方 010000 000
  • 画时序图软件——TimeGen和Timing Designer下载

    在写实验报告的时候需要画波形图 但是手头没有很好的软件 就上网搜了一些 分享出来 这里分享的是TimeGen和Timing Designer两个软件 资源均来自网上 有侵权请联系 TimeGen使用和安装都比较简单 我发的应该里面有破解方法
  • 无线网络管理系统与无线路由器的区别

    第5章 波形发生器软件设计 本章我们将介绍系统的软件设计 系统中控制软件占有很重要的地位 它不仅要产生波形数据 控制波形的发生 还要控制显示电路和键盘电路 因此系统软件的好坏直接决定着系统的功能和稳定 5 1软件的总体结构 在本系统中 由于

随机推荐

  • 禁用Android切换动画

    禁用Android切换动画 前言 最近有个功能要禁用安卓activity的切换动画 找了几个方法 这里记录下 使用Theme 最简单的就是设置没有动画的主题了 在activity上增加notAnimation的theme属性 android
  • 4.5.7 c++求灯塔数量

    4 5 7 灯塔数量 有一八层灯塔 每一层的灯数都是上一层的一倍 共有765盏灯 求最上层和最下层的灯数 include
  • C++:map&&set的简单使用

    目录 关联式容器 键值对 树形结构的关联式容器 set find与count multiset map multimap 关联式容器 在初期我们接触到的vector list deque queue等 这些容器都称为序列式容器 因为其底层为
  • python for循环九九乘法表_python初学者-使用for循环做一个九九乘法表

    原博文 2020 03 22 08 51 for i in range 1 10 for j in range 1 i 1 print j i i j end end 以 结尾 print 相关推荐 2019 12 24 10 44 whi
  • 自学SQL习题答案整理(lesson4--)

    前几天看到一个学SQL的网站 感觉挺好的 但是比较少人用 链接 自学SQL 在这里放上一部分题目的答案 自己在mysql里实现了一下 方便以后再做这个练习的时候自查 主要是学习一些查询语句的运用 SELECT distinct direct
  • 力扣算法合集

    algo 鸡汤篇 排序算法 二叉树 哈希表 栈和队列 数组 链表 字符串 算法套路 双指针 排序 贪心思想 二分查找 搜索 动态规划 斐波那契数列 矩阵路径 数组区间 分割整数 最长递增子序列 01背包 股票交易 字符串编辑 算法题解 动态
  • 突破Cloudflare验证码的秘密方法

    Cloudflare是一种广泛使用的验证码方式 它旨在取代传统的CAPTCHA 提供更简单 更私密的验证方式 以区分真实用户和机器人 然而 对于爬虫工程师而言 这也带来了一些挑战 理解Cloudflare验证码的工作原理 在突破Cloudf
  • 手把手带你理解Vue的列表渲染?

    概念 v for 指令基于一个数组来渲染一个列表 v for 指令需要使用 item in items 形式的特殊语法 其中 items 是源数据数组 而 item 则是被迭代的数组元素的别名 2 代码
  • 关于PN节为什么会形成电场

    这个问题我纠结了很久 后面终于弄明白了 来备注一下 防止下次又忘记了 首先 我们了解一下P型半导体和N型半导体 P型半导体 硅晶体在参入 3价元素 用硼来举例 后 硅原子会和硼原子形成共价键 形成共价键的原因我们不需要知道 就当它们发生了反
  • unity 第二次作业

    3D游戏设计 Unity 一 简答题 1 GameObject 和 Assets的区别和联系 是游戏中实实在在的游戏项目文件夹中所需要堆放的资源 比如 var obj Resource Load Prefabs testItem 这个obj
  • 23哈尔滨工程大学计算机电子信息复试经验

    哈尔滨工程大学计算机电子信息复试经验 0 前言 1 笔试 2 机试 2 1 备考分析 2 2 备考建议 3 面试 3 1 政治 3 2 英语 3 3 专业基础 3 4 工程项目 0 前言 今年的复试拖的太长了 复试要求 名单等迟迟不出 复试
  • React Hooks 使用详解

    本文对 16 8 版本之后 React 发布的新特性 Hooks 进行了详细讲解 并对一些常用的 Hooks 进行代码演示 希望可以对需要的朋友提供点帮助 一 Hooks 简介 Hooks 是 React v16 7 0 alpha 中加入
  • 多益网络校招笔试题(前端工程师)

    1 写出inline和inline block的差别 布局方式相同 唯一的区别在inline block可以设置宽高 inline不可以 另外 inline设置上下内边距和上下外边距会造成一些mess 详见 What is the diff
  • 源码编译安装部署LAMP平台(使用Apache,MySQL与PHP搭建Discuz论坛实例)

    文章目录 一 LAMP平台与编译安装 一 LAMP平台概述 二 构建LAMP平台顺序 二 编译安装的优点 三 各组件的主要作用 二 部署步骤 一 编译安装Apache httpd服务 二 编译安装mysqld 服务 三 编译安装PHP 解析
  • 一定能用到的简单但实用的五种按钮样式(HTML+CSS步骤详解,含详细注释)

    前言一 按钮在前端开发中往往是一个必不可少的元素 也有许多精美好看的样式资源供开发者直接使用 但博主认为 对于初学者而言 总是去cv别人做好的 而不理解其中的原理 是很不好的 本人作为一名计科的学生 在大二也选修了校内的前端基础教程的课 但
  • 【Blender学习】界面

    界面 改变语言 学习笔记 改变语言 将blender改变成中文可以通过一下步骤 1 选择Files gt user preference 2 选中右下角inernational Fonts里的inerface和tooltips 再选择lan
  • Xmake实战---xmake 与 vscode 集成环境使用

    xmake vscode 插件介绍 我们之前的所有实验 都是使用 xmake 的命令行程序在终端下操作完成的 这对于一些初学者来说还是有不少门槛的 并且操作起来也不能够像其它 IDE 等带有可视化界面的开发环境那样顺手 尤其是代码的编辑 编
  • 05-RabbitMQ之原生API使用

    使用RabbitMQ提供的原生客户端API进行交互 一 Maven依赖
  • Tailwind CSS入门(二)——基本介绍和特性

    上一篇文章简要的介绍了原子类CSS 以及个人对语义化 原子化的一些经验和理解 从这篇文章开始 正式开始分享Tailwind CSS的特性 使用和技巧 Tailwind CSS是一个为快速开发而精心设计的原子类CSS框架 在此我们将搭建一个V
  • Vivado初体验LED工程

    文章目录 前言 一 PL 和 PS 二 LED 硬件介绍 三 创建 Vivado 工程 四 创建 Verilog HDL 文件 五 添加管脚约束 六 添加时序约束 七 生成 BIT 文件 八 仿真测试 九 下载测试 前言 本节我们要做的是熟