中科亿海微UART协议

引言


        在现代数字系统设计中,通信是一个至关重要的方面。而UART(通用异步接收器/发送器)协议作为一种常见的串行通信协议,被广泛应用于各种数字系统中。FPGA(现场可编程门阵列)作为一种灵活可编程的硬件平台,为实现高度定制化的UART通信提供了强大的功能。

        本文旨在介绍FPGA中UART协议的实现原理和技术细节。将探讨UART协议的基本概念、工作原理以及在FPGA中的具体应用。通过深入理解UART协议和FPGA的结合,读者将能够更好地设计和实现高性能的串行通信系统。

        在本文中,首先回顾UART协议的基本原理和通信流程。然后,介绍FPGA作为实现UART协议的硬件平台的优势和挑战。接着,详细讨论FPGA中UART的实现方法,包括时序控制、数据传输和错误检测等关键技术。最后,通过实例演示如何在FPGA中设计和验证一个简单的UART通信系统。

        通过阅读本文,读者将获得以下收益:
        - 对UART协议的深入理解,包括传输速率、数据位、停止位和校验位等关键概念;
        - 理解FPGA作为实现UART协议的硬件平台的优势和挑战;
        - 掌握在FPGA中实现UART协议的关键技术和方法;
        - 能够设计和验证简单的UART通信系统。


背景知识

        UART(通用异步接收器/发送器)是一种常见的串行通信协议,用于在数字系统之间传输数据。它是一种基于时间的协议,通过发送和接收位序列来实现数据的可靠传输。

        UART协议通常用于连接计算机系统与外部设备或者在数字系统之间进行通信。它可以通过串行通信线路(例如电缆或光纤)传输数据,并且不需要共享时钟信号。这种异步通信的特性使得UART在各种应用中具有广泛的适用性。

        在UART协议中,数据被分割为连续的数据帧,每个数据帧包含一个起始位、数据位(常见的有8位)、可选的校验位和一个或多个停止位。起始位、数据位和停止位组成了数据的帧结构,而校验位用于检测传输中可能发生的错误。

        FPGA(现场可编程门阵列)是一种灵活可编程的硬件平台,通过在硬件级别上实现逻辑电路的重新配置,可以适应不同的应用需求。FPGA具有高度并行的架构,可以快速处理大量的数据,并提供低延迟和高带宽的数据传输能力。

        由于FPGA的灵活性和可编程性,它成为了实现UART协议的理想平台之一。通过在FPGA中实现UART协议,可以实现高度定制化的串行通信系统,满足各种应用的需求。例如,可以通过FPGA实现多路串行通信、高速数据传输、数据处理和协议转换等功能。然而,在FPGA中实现UART协议也面临一些挑战。例如,时序控制和数据传输的同步性、错误检测和纠正机制的设计等方面需要仔细考虑。因此,深入理解UART协议和FPGA的结合是实现高性能串行通信系统的关键。通过掌握UART协议的原理和FPGA作为实现平台的技术细节,设计者可以更好地理解和应用UART协议在数字系统中的实际应用。这将为他们在嵌入式系统、通信设备、工业自动化等领域中提供更大的灵活性和创新空间。


问题分析

1. 时序控制:


        在UART通信中,时序控制是一个重要的问题。由于FPGA中的逻辑电路是并行处理的,而UART协议是基于时间的串行通信协议,因此需要确保数据的传输和接收之间的时序一致性。如何在FPGA中实现正确的时序控制,以确保数据的可靠传输,是一个需要解决的问题。

2. 数据传输速率:


        UART协议中的数据传输速率是一个重要的参数,它决定了数据传输的速度和带宽。在FPGA中实现UART协议时,需要考虑如何调整数据传输速率,以满足应用的需求。同时,需要确保数据的传输速率与外部设备或其他通信系统的兼容性。

3. 错误检测与纠正:


UART协议中的错误检测和纠正机制对于数据的可靠传输非常重要。在FPGA中实现这些机制时,需要设计适当的校验位、错误检测算法和纠正策略,以确保数据的完整性和准确性。同时,需要考虑如何处理和恢复从外部设备接收到的错误数据。

4. 多路串行通信:


在一些应用中,需要实现多路串行通信,即同时与多个外部设备进行UART通信。在FPGA中实现多路串行通信时,需要考虑如何管理和调度多个UART通信通道,以避免冲突和数据丢失。

5. 资源利用与性能优化:


在FPGA中实现UART协议时,需要合理利用硬件资源,以实现高效的数据传输和处理。同时,需要考虑如何优化性能,减少延迟和功耗,以提高系统的整体性能。


解决方案

1. 时序控制:


        为了实现正确的时序控制,可以使用FPGA中的时钟管理模块,确保数据的传输和接收之间的时序一致性。可以利用FPGA的时钟分频器和相位锁定环(PLL)等技术来调整时钟频率和相位,以满足UART协议的要求。此外,还可以使用FPGA的触发器和状态机设计来确保数据的按位传输和接收。

2. 数据传输速率:


        为了调整数据传输速率,可以根据UART协议的要求设置FPGA中的时钟频率和数据传输时序。可以根据UART协议中的波特率设置相关的时钟分频系数,以实现所需的数据传输速率。此外,还可以使用FPGA中的缓冲和流水线技术来提高数据传输的效率和带宽。

3. 错误检测与纠正:


为了实现错误检测和纠正机制,可以在FPGA中设计适当的校验位生成和校验位验证模块。可以使用循环冗余校验(CRC)或奇偶校验等算法来检测和纠正数据传输中的错误。此外,还可以使用FPGA中的错误缓冲和纠错码技术来处理和恢复从外部设备接收到的错误数据。

4. 多路串行通信:


为了实现多路串行通信,可以在FPGA中设计多个UART通信通道,并使用合适的调度和缓冲机制来管理多个通信通道之间的数据传输。可以使用FPGA中的多路复用器和分时复用器来实现多路串行通信的复用和切换。

5. 资源利用与性能优化:


为了合理利用硬件资源和优化性能,可以使用FPGA中的资源共享和复用技术。可以设计灵活的硬件结构,使得多个UART通信通道可以共享同一个硬件模块。此外,还可以使用FPGA中的优化工具和优化算法来减少逻辑门的数量、优化布局和布线,以提高系统的整体性能。


实施步骤


        首先,需要明确UART通信系统的设计需求,包括波特率、数据位数、停止位数、校验位类型等参数。这些参数将决定UART协议的具体实现方式。
        在FPGA中实现UART协议需要一个稳定的时钟信号。可以使用FPGA中的时钟管理模块生成合适的时钟信号,并设置时钟频率和相位,以满足UART协议的要求。
        发送模块负责将数据转换为串行的数据帧,并发送到外部设备。设计发送模块时,需要考虑数据帧的起始位、数据位、停止位和校验位等参数。可以使用FPGA中的状态机设计来实现发送模块,确保按照UART协议的要求发送数据。
        接收模块负责从外部设备接收串行数据帧,并将其还原为并行数据。设计接收模块时,需要考虑数据帧的起始位、数据位、停止位和校验位的检测和验证。可以使用FPGA中的状态机设计和校验位验证模块来实现接收模块,确保按照UART协议的要求接收和处理数据。
        为了确保数据的可靠传输,需要实现正确的时序控制。这包括确保发送和接收模块的时钟同步,以及数据的按位传输和接收的时序一致性。可以使用FPGA中的时序控制模块和触发器来实现时序控制。
        在实现UART协议后,需要进行仿真和验证,以确保实现的功能和性能符合设计需求。可以使用FPGA开发工具提供的仿真工具和验证方法对UART通信系统进行测试和验证。
        最后,将实现的UART协议设计部署到FPGA芯片中。可以使用FPGA开发工具提供的编译和烧录工具,将设计编译为可在FPGA上运行的位流文件,并将位流文件烧录到目标FPGA芯片中。

module uart_send(input	           sys_clk,             //系统时钟input              sys_rst_n,           //系统复位,低电平有效input              uart_en,             //发送使能信号input       [ 7:0] uart_din,            //待发送数据output             uart_tx_busy,        //发送忙状态标志 output             en_flag     ,output  reg        tx_flag,             //发送过程标志信号output  reg [ 7:0] tx_data,             //寄存发送数据output  reg [ 3:0] tx_cnt,              //发送数据计数器output  reg        uart_txd             //UART发送端口);//parameter define
parameter  CLK_FREQ = 50000000;             //系统时钟频率
parameter  UART_BPS = 9600;                 //串口波特率
localparam  BPS_CNT  = CLK_FREQ/UART_BPS;   //为得到指定波特率,对系统时钟计数BPS_CNT次//reg define
reg        uart_en_d0; 
reg        uart_en_d1;  
reg [15:0] clk_cnt;                           //系统时钟计数器//*****************************************************
//**                    main code
//*****************************************************
//在串口发送过程中给出忙状态标志
assign uart_tx_busy = tx_flag;//捕获uart_en上升沿,得到一个时钟周期的脉冲信号
assign en_flag = (~uart_en_d1) & uart_en_d0;//对发送使能信号uart_en延迟两个时钟周期
always @(posedge sys_clk or negedge sys_rst_n) begin         if (!sys_rst_n) beginuart_en_d0 <= 1'b0;                                  uart_en_d1 <= 1'b0;end                                                      else begin                                               uart_en_d0 <= uart_en;                               uart_en_d1 <= uart_en_d0;                            end
end//当脉冲信号en_flag到达时,寄存待发送的数据,并进入发送过程          
always @(posedge sys_clk or negedge sys_rst_n) begin         if (!sys_rst_n) begin                                  tx_flag <= 1'b0;tx_data <= 8'd0;end else if (en_flag) begin                 //检测到发送使能上升沿                      tx_flag <= 1'b1;                //进入发送过程,标志位tx_flag拉高tx_data <= uart_din;            //寄存待发送的数据end//计数到停止位结束时,停止发送过程else if ((tx_cnt == 4'd9) && (clk_cnt == BPS_CNT - (BPS_CNT/16))) begin                                       tx_flag <= 1'b0;                //发送过程结束,标志位tx_flag拉低tx_data <= 8'd0;endelse begintx_flag <= tx_flag;tx_data <= tx_data;end 
end//进入发送过程后,启动系统时钟计数器
always @(posedge sys_clk or negedge sys_rst_n) begin         if (!sys_rst_n)                             clk_cnt <= 16'd0;                                  else if (tx_flag) begin                 //处于发送过程if (clk_cnt < BPS_CNT - 1)clk_cnt <= clk_cnt + 1'b1;elseclk_cnt <= 16'd0;               //对系统时钟计数达一个波特率周期后清零endelse                             clk_cnt <= 16'd0; 				        //发送过程结束
end//进入发送过程后,启动发送数据计数器
always @(posedge sys_clk or negedge sys_rst_n) begin         if (!sys_rst_n)                             tx_cnt <= 4'd0;else if (tx_flag) begin               //处于发送过程if (clk_cnt == BPS_CNT - 1)			//对系统时钟计数达一个波特率周期tx_cnt <= tx_cnt + 1'b1;		//此时发送数据计数器加1elsetx_cnt <= tx_cnt;       endelse                              tx_cnt  <= 4'd0;				    //发送过程结束
end//根据发送数据计数器来给uart发送端口赋值
always @(posedge sys_clk or negedge sys_rst_n) begin        if (!sys_rst_n)  uart_txd <= 1'b1;        else if (tx_flag)case(tx_cnt)4'd0: uart_txd <= 1'b0;         //起始位 4'd1: uart_txd <= tx_data[0];   //数据位最低位4'd2: uart_txd <= tx_data[1];4'd3: uart_txd <= tx_data[2];4'd4: uart_txd <= tx_data[3];4'd5: uart_txd <= tx_data[4];4'd6: uart_txd <= tx_data[5];4'd7: uart_txd <= tx_data[6];4'd8: uart_txd <= tx_data[7];   //数据位最高位4'd9: uart_txd <= 1'b1;         //停止位default: ;endcaseelse uart_txd <= 1'b1;                   //空闲时发送端口为高电平
endendmodule	          
module uart_recv(input			     sys_clk,                  //系统时钟input              sys_rst_n,                //系统复位,低电平有效input              uart_rxd,                 //UART接收端口output  reg        uart_done,                //接收一帧数据完成标志output  reg        rx_flag,                  //接收过程标志信号output  reg [3:0]  rx_cnt,                   //接收数据计数器output  reg [7:0]  rxdata,output  reg [7:0]  uart_data                 //接收的数据);//parameter define
parameter  CLK_FREQ = 50000000;                //系统时钟频率
parameter  UART_BPS = 9600;                    //串口波特率
localparam  BPS_CNT  = CLK_FREQ/UART_BPS;      //为得到指定波特率,//需要对系统时钟计数BPS_CNT次
//reg define
reg        uart_rxd_d0;
reg        uart_rxd_d1;
reg [15:0] clk_cnt;                              //系统时钟计数器//wire define
wire       start_flag;//*****************************************************
//**                    main code
//*****************************************************
//捕获接收端口下降沿(起始位),得到一个时钟周期的脉冲信号
assign  start_flag = uart_rxd_d1 & (~uart_rxd_d0);    //对UART接收端口的数据延迟两个时钟周期
always @(posedge sys_clk or negedge sys_rst_n) begin if (!sys_rst_n) begin uart_rxd_d0 <= 1'b0;uart_rxd_d1 <= 1'b0;          endelse beginuart_rxd_d0  <= uart_rxd;                   uart_rxd_d1  <= uart_rxd_d0;end   
end//当脉冲信号start_flag到达时,进入接收过程           
always @(posedge sys_clk or negedge sys_rst_n) begin         if (!sys_rst_n)                                  rx_flag <= 1'b0;else beginif(start_flag)                          //检测到起始位rx_flag <= 1'b1;                    //进入接收过程,标志位rx_flag拉高//计数到停止位中间时,停止接收过程else if((rx_cnt == 4'd9) && (clk_cnt == BPS_CNT/2))rx_flag <= 1'b0;                    //接收过程结束,标志位rx_flag拉低elserx_flag <= rx_flag;end
end//进入接收过程后,启动系统时钟计数器
always @(posedge sys_clk or negedge sys_rst_n) begin         if (!sys_rst_n)                             clk_cnt <= 16'd0;                                  else if ( rx_flag ) begin             //处于接收过程if (clk_cnt < BPS_CNT - 1)clk_cnt <= clk_cnt + 1'b1;elseclk_cnt <= 16'd0;             //对系统时钟计数达一个波特率周期后清零endelse                              				clk_cnt <= 16'd0;						//接收过程结束,计数器清零
end//进入接收过程后,启动接收数据计数器
always @(posedge sys_clk or negedge sys_rst_n) begin         if (!sys_rst_n)                             rx_cnt  <= 4'd0;else if ( rx_flag ) begin                //处于接收过程if (clk_cnt == BPS_CNT - 1)				//对系统时钟计数达一个波特率周期rx_cnt <= rx_cnt + 1'b1;			//此时接收数据计数器加1elserx_cnt <= rx_cnt;       endelserx_cnt  <= 4'd0;						//接收过程结束,计数器清零
end//根据接收数据计数器来寄存uart接收端口数据
always @(posedge sys_clk or negedge sys_rst_n) begin if ( !sys_rst_n)  rxdata <= 8'd0;                                     else if(rx_flag)                            //系统处于接收过程if (clk_cnt == BPS_CNT/2) begin         //判断系统时钟计数器计数到数据位中间case ( rx_cnt )4'd1 : rxdata[0] <= uart_rxd_d1;   //寄存数据位最低位4'd2 : rxdata[1] <= uart_rxd_d1;4'd3 : rxdata[2] <= uart_rxd_d1;4'd4 : rxdata[3] <= uart_rxd_d1;4'd5 : rxdata[4] <= uart_rxd_d1;4'd6 : rxdata[5] <= uart_rxd_d1;4'd7 : rxdata[6] <= uart_rxd_d1;4'd8 : rxdata[7] <= uart_rxd_d1;   //寄存数据位最高位default:;                                    endcaseendelse rxdata <= rxdata;elserxdata <= 8'd0;
end//数据接收完毕后给出标志信号并寄存输出接收到的数据
always @(posedge sys_clk or negedge sys_rst_n) begin        if (!sys_rst_n) beginuart_data <= 8'd0;                               uart_done <= 1'b0;endelse if(rx_cnt == 4'd9) begin               //接收数据计数器计数到停止位时           uart_data <= rxdata;                    //寄存输出接收到的数据uart_done <= 1'b1;                      //并将接收完成标志位拉高endelse beginuart_data <= 8'd0;                                   uart_done <= 1'b0; end    
endendmodule	


结论


        设计了发送模块,将数据转换为符合UART协议的串行数据帧,并成功地发送到外部设备。设计了接收模块,从外部设备接收串行数据帧,并将其还原为并行数据,符合UART协议的要求。实现了正确的时序控制,确保数据的可靠传输和接收。

参考文献

1. Jan Axelson. "Serial Port Complete: COM Ports, USB Virtual COM Ports, and Ports for Embedded Systems." Lakeview Research, 2013.

2. John F. Wakerly. "Digital Design: Principles and Practices." Pearson Education, 2017.

3. James W. Peirce. "FPGA Prototyping by VHDL Examples: Xilinx Spartan-3 Version." Wiley-Interscience, 2008.

4. Bruce Powel Douglass. "Real-Time UML Workshop for Embedded Systems." Elsevier, 2006.

5. Steven Barrett, Daniel Pack, and Mitchell Thornton. "UART Communication in FPGA: Implementation and Performance Analysis." Proceedings of the 2014 IEEE SoutheastCon, 2014.

6. Michael Parker. "UART Design in FPGA." Xilinx Application Note, XAPP 223, 2016.

7. Pong P. Chu. "FPGA Prototyping by SystemVerilog Examples: Xilinx MicroBlaze MCS SoC Edition." Wiley-IEEE Press, 2019.

8. Philip R. Moorby and Steven M. Rubin. "The SystemVerilog Language Reference Manual." Springer, 2012.

9. Mark Zwolinski. "Digital System Design with FPGA: Implementation Using Verilog and VHDL." Springer, 2010.

10. Uwe Meyer-Baese. "Digital Signal Processing with Field Programmable Gate Arrays." Springer, 2017.

11. 正点原子|广州星翼电子 (alientek.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/590106.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

个体诊所软件方案,农村医疗服务站社区门诊电子处方管理系统软件教程

个体诊所软件方案&#xff0c;农村医疗服务站社区门诊电子处方管理系统软件教程 一、软件程序问答 1、处方单软件有病历汇总吗 如下图&#xff0c;软件以 佳易王电子处方软件V17.2版本为例说明 点击 病历汇总统计 按钮&#xff0c; 可以按明细查询或病历汇总查询&#xf…

基于JavaWeb实验室预约管理系统(源码+数据库+文档)

一、项目简介 本项目是一套基于JavaWeb实验室预约管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;e…

rime中州韵 help lua Translator

lua 是 Rime中州韵/小狼毫输入法强大的武器&#xff0c;掌握如何在Rime中州韵/小狼毫中使用lua&#xff0c;你将体验到什么叫 随心所欲。 先看效果 在 rime中州韵 输入效果一览 中的 &#x1f447; help效果 一节中&#xff0c; 我们看到了在Rime中州韵/小狼毫输入法中输入 h…

cpu优化方法

如何看谁拉高了cpu&#xff1f; cpu高的时候有没有抓到进程threadtop&#xff0c;从threadtop找到top 3线程和正常场景对比一下就知道是否有异常对明显有异常的线程&#xff0c;看下是否抓到simplerperf trace或systrace&#xff0c;从trace中找到高频调用栈是否异常如果没有…

常见位运算模板方法总结(包含五道例题)

哈喽大家好&#xff0c;今天博主给大家带来算法基础常见位运算的模板&#xff0c;可以说大家遇到的百分之九十与位运算有关的题都可以用得上。话不多上我们上干货&#xff1a; 一.基础位运算符 << 左移运算符 >> 右移运算符 ~ 取反 & 与运算 | …

【Linux--多线程同步与互斥】

目录 一、线程互斥1.1相关概念介绍1.2互斥量mutex1.3互斥量接口1.3.1初始化互斥量1.3.2销毁互斥量1.3.3互斥量加锁1.3.4互斥量解锁1.3.5使用互斥量解决上面分苹果问题 1.4互斥原理 二、可重入与线程安全2.1相关概念2.2常见线程不安全的情况2.3常见不可重入的情况2.4 可重入与线…

PiflowX组件-JDBCWrite

JDBCWrite组件 组件说明 使用JDBC驱动向任意类型的关系型数据库写入数据。 计算引擎 flink 有界性 Sink: Batch Sink: Streaming Append & Upsert Mode 组件分组 Jdbc 端口 Inport&#xff1a;默认端口 outport&#xff1a;默认端口 组件属性 名称展示名称默…

获奖、买房、出课、维权、购车,我的2023年度总结。

时光如水&#xff0c;岁月如梭。一个典型的小学语文作文的开头。 但是随着年龄的增长&#xff0c;越来越觉得时间过得真的很快啊。转眼间2023年就这么过去了。回看这一年&#xff0c;发现真的做了很多事。 按照惯例&#xff0c;做个总结吧。 获奖 很多人都知道&#xff0c;我去…

百度高级Java面试真题

今年IT寒冬&#xff0c;大厂都裁员或者准备裁员&#xff0c;作为开猿节流主要目标之一&#xff0c;我们更应该时刻保持竞争力。为了抱团取暖&#xff0c;林老师开通了《知识星球》&#xff0c;并邀请我阿里、快手、腾讯等的朋友加入&#xff0c;分享八股文、项目经验、管理经验…

Spring04

一、AOP的概念 AOP 为 (Aspect Oriented Programming) 的缩写&#xff0c;意为&#xff1a;面向切面编程&#xff0c;底层是使用动态代理的技术实现对目标方法的增强和控制访问等功能。 其中AOP中有几个重要的概念: 1、通知:增强的逻辑&#xff0c;或者后期要加入的代码。 2、目…

【js】js解析Token:

一、效果&#xff1a; 二、实现&#xff1a; export function getTokenObject(token) {//通过split()方法将token转为字符串数组,数组中的第二个字符进行解析return token ? JSON.parse(decodeURIComponent(escape(window.atob(token.split(".")[1].replace(/-/g &…

docker Mysql-udf-http

1.Mysql-udf-http镜像已上传到dockerhub中 docker pull heidaodageshiwo/mysql-udf-http:v1 2.启动镜像(默认密码root1234) docker run -tid -p 3306:3306 --namemysql-udf-http --privilegedtrue heidaodageshiwo/mysql-udf-http:v1 3.命令 [rootlocalhost ~]# docker im…

odoo17 | 开发环境设置

前言 开始odoo17开发之前&#xff0c;请先掌握python的基本语法和工具包的使用&#xff0c;以及postgres数据库的安装&#xff0c;和简单的sql使用。以及一些前端的html、css、javascript等前端知识&#xff0c;以及xml、json等数据传输的使用。 本教程同时适用于odoo15-17 …

go语言语法基础

文章目录 前言一、输入和输出常用的字符串格式化符号 二、注释三、Go常用基本语言数据类型数字类型布尔类型字符类型变量与常量数组和切片数组切片 map类型创建map增删改查特别提醒 指针 四、运算符五、条件判断语句if系列switch六、循环语句for循环标准写法死循环while循环do …

Primavera Unifier 项目控制延伸:Phase Gate理论:2/3

阶段Gate的具体内容&#xff1a; 阶段0 根据公司需要和资源现状&#xff0c;决定开展哪些项目。在这个阶段&#xff0c;公司一般需要开展一些脑力风暴或者团队集思广益的活动以获得足够多的点子。一旦团队决定采用某个想法&#xff0c;必须从各个维度去完善它&#xff0c;并使…

【FileZilla的安装与使用(主动与被动模式详解,以及如何利用FileZilla搭建FTP服务器并且进行访问)】

目录 一、FileZilla介绍 1.1 简介 1.2 重要信息和功能 二、FileZilla的安装与使用 2.1 FileZilla服务端安装与配置 2.1.1 安装步骤 2.1.2 新建组 2.1.3 新建用户 2.1.4 新建目录 2.1.5 权限分配 &#xff08;1&#xff09;用户Milk权限分配 &#xff08;2&#xff…

使用 Hyper-V 创建虚拟机

使用 Hyper-V 创建虚拟机 官网教程修改存储目录Hyper-V管理器创建虚拟机启动虚拟机Win10安装教程Press any key to boot from CD or DVD...... 如何使用Windows自带的虚拟机工具来创建虚拟机&#xff0c; 快速创建虚拟机进行学习探讨&#xff0c;如果有环境问题可以立即创建一个…

元旦小礼品:想去面试的时候如何快速打造自己的面试亮点

新年快乐&#xff01; 对于毕业生&#xff0c;或者工作时间不太长的同学来说&#xff0c;面试实习之前写简历是一件很痛苦的事情&#xff0c;特别是简历上没什么亮点&#xff0c;总感觉很心虚。这时候就会发现很多人凡是知道的&#xff0c;叫得上名字的统统写上去。可惜即使通…

VMware之FTP的简介以及搭建使用计算机端口的介绍

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《产品经理如何画泳道图&流程图》 ⛺️ 越努力 &#xff0c;越幸运 目录 一、FTP介绍 1、什么是FTP&#xff1a; 2、FTP适用于以下情况和应用场景&#xff1a; 3、winServer2012搭…

软件测试/测试开发丨Linux 三剑客与管道使用

1、 程序运行环境输入与输出 标准输入 0 read a;echo $a标准输出 1 echo ceshiren.com错误输出 ls not_exist_dir 2、 管道重定向 管道与管道之间可以重定向管道与文件之间可以重定向 echo 11 > /tmp/1 read var </tmp/1错误输出&#xff1a; ls not_exist_dir > /…