当前位置: 首页 > news >正文

iis 网站目录权限广东优化疫情防控措施

iis 网站目录权限,广东优化疫情防控措施,政务公开与网站建设工作总结存在问题和困难,网站流量的主要来源有一、UART相关介绍 UART是我们常用的全双工异步串行总线,常用TTL电平标准,由TXD和RXD两根收发数据线组成。 那么,利用硬件描述语言实现UART对应的电路和51单片机内部配合寄存器实现的电路到底有何区别呢?接下来我们对照看一下。 …

一、UART相关介绍

UART是我们常用的全双工异步串行总线,常用TTL电平标准,由TXD和RXD两根收发数据线组成。

那么,利用硬件描述语言实现UART对应的电路和51单片机内部配合寄存器实现的电路到底有何区别呢?接下来我们对照看一下。

二、FPGA实现UART异步串行收发方式

对于FPGA而言,利用verilog实现这个过程,其实最重要的就是安排好对应的计数器并配合移位寄存器串并转换即可完成。

FPGA发送端对应的代码如下:

module uart_tx(input wire clk ,input wire rst_n ,input wire [7:0] pi_data ,input wire pi_flag ,output reg tx );reg [7:0] pi_data_reg;//用于寄存传进来的数据reg tx_flag ;reg [12:0] cnt_baud ;reg bit_flag1;reg [3:0] bit_cnt ;//在接收到pi_flag为高电平的时候寄存输入数?always@(posedge clk or negedge rst_n)beginif(!rst_n)pi_data_reg <= 'd0;else if(pi_flag == 1'b1)pi_data_reg <= pi_data ;endalways@(posedge clk or negedge rst_n)beginif(!rst_n)tx_flag <= 1'b0;else if(bit_flag1 == 1'b1 && bit_cnt == 'd8)tx_flag <= 1'b0;else if(pi_flag == 1'b1)tx_flag <= 1'b1;end always@(posedge clk or negedge rst_n)beginif(!rst_n)cnt_baud <= 'd0;else if(tx_flag == 1'b0)cnt_baud <= 'd0;else if(cnt_baud == 'd5207 && tx_flag == 1'b1)cnt_baud <= 'd0;else if(tx_flag == 1'b1)cnt_baud <= cnt_baud + 1'b1;endalways@(posedge clk or negedge rst_n)beginif(!rst_n)bit_flag1 <= 1'b0;else if(cnt_baud == 5206)bit_flag1 <= 1'b1;else bit_flag1 <= 1'b0;endalways@(posedge clk or negedge rst_n)beginif(!rst_n)bit_cnt <= 'd0;else if(bit_cnt == 'd8 && bit_flag1 == 1'b1)bit_cnt <= 'd0;else if(bit_flag1 == 1'b1)bit_cnt <= bit_cnt + 1'b1;end always@(posedge clk or negedge rst_n)beginif(!rst_n)tx <= 1'b1;//空闲状态else if(pi_flag == 1'b1)tx <= 1'b0;//起始?else if(bit_flag1 == 1'b1 && bit_cnt <= 'd7)tx <= pi_data_reg[bit_cnt];//8位数?else if(bit_cnt == 'd8 && bit_flag1 == 1'b1)tx <= 1'b1;//空闲?end
endmodule
FPGA接收端对应的代码如下:
module uart_rx(input wire clk ,input wire rst_n ,input wire rx ,output reg [7:0] po_data ,output reg po_flag);//用于打拍的寄存器reg rx1;reg rx2;reg rx2_reg ;reg rx_flag ;reg [12:0] cnt_baud ;reg bit_flag ;reg [3:0] bit_cnt ;//对接收到的外部信号进行打拍寄存always@(posedge clk)beginrx1 <= rx ;rx2 <= rx1 ;rx2_reg <= rx2 ;end//检测下降沿,拉高rx_flagalways @(posedge clk or negedge rst_n) beginif (!rst_n) beginrx_flag <= 1'b0;endelse if (rx2 == 1'b0 && rx2_reg == 1'b1) beginrx_flag <= 1'b1;endelse if(bit_flag == 1'b1 && bit_cnt == 'd8)rx_flag <= 1'b0;endalways @(posedge clk or negedge rst_n) beginif (!rst_n) cnt_baud <= 'd0;else if(rx_flag == 1'b0)cnt_baud <= 'd0;else if(cnt_baud == 'd5207 && rx_flag == 1'b1)//5207为波特率是9600时对应的计数值cnt_baud <= 'd0;else if(rx_flag == 1'b1)cnt_baud <= cnt_baud + 1'b1;endalways @(posedge clk or negedge rst_n) beginif (!rst_n) bit_flag <= 1'b0;else if(cnt_baud == 'd2603 && rx_flag == 1'b1)bit_flag <= 1'b1;else bit_flag <= 1'b0;end always @(posedge clk or negedge rst_n) beginif (!rst_n) bit_cnt <= 'd0;else if(bit_cnt == 'd8 && bit_flag == 1'b1)bit_cnt <= 'd0;else if(bit_flag == 1'b1 && rx_flag == 1'b1)bit_cnt <= bit_cnt + 1'b1;endalways @(posedge clk or negedge rst_n) beginif (!rst_n) po_data <= 'd0;else if(bit_flag == 1'b1 && bit_cnt >= 'd1)po_data <= {rx2_reg,po_data[7:1]};end always @(posedge clk or negedge rst_n) beginif (!rst_n) po_flag <= 1'b0 ;else if(bit_flag == 1'b1 && bit_cnt == 'd8)po_flag <= 1'b1 ;else po_flag <= 1'b0;endendmodule
顶层代码如下:
module top_uart(input wire clk ,input wire rst_n ,input wire rx ,output wire tx);wire [7:0] po_data ;wire po_flag ;uart_rx inst_uart_rx (.clk(clk), .rst_n(rst_n), .rx(rx), .po_data(po_data), .po_flag(po_flag));uart_tx inst_uart_tx (.clk(clk), .rst_n(rst_n), .pi_data(po_data), .pi_flag(po_flag), .tx(tx));endmodule
经过综合后,生成的对应原理图如下:

顶层:

tx:可以发现,这里其实每一位寄存器都对应着一个D触发器,剩余的逻辑由LUT实现。

rx:接收端同理。

三、单片机内部UART异步串行收发实现方式

对于51单片机而言,它内部是CPU控制一些在物理层面已经连接好寄存器,通过对寄存器的控制配合电路的改变完成整个任务。

对于串口通信这个任务而言,它的整个实现过程总结如下:

整个实现可分为三大部分,定时器、中断系统及对应的缓冲寄存器完成,三大部分配合内部CPU便可完成收发任务,具体示意图如下:

红色区域是定时器部分,它外部连接着晶振,通过对TH1和TL1寄存器写入初始值可实现具体溢出频率的控制,假设晶振频率位12MHz(12T模式下1us计数一次),TH1和TL1填入0xF3(对应十进制243),一共256,则每隔256-243=13个数就会溢出一次,则溢出率为1/13us=0.07692MHz,当SMOD=1时,频率只经过16也就对应4800Hz,就会对应波特率4800Baud。配合控制器即可完成对波特率的控制。

蓝色部分是用于发送和接收数据的缓冲区;

黄色部分是串口中断器,这个中断器在接收数据的时候需要使用,TI和RI是中断标志。

在使用方式上,对涉及的寄存器进行初始化后,将数据写入SBUF或通过中断读取SBUF内的数据即可完成发送接收任务。

对应配置代码如下:

#include <REGX51.H>/***  @brief 串口初始化,4800bps@11.0592MHz*  @param 无	*  @retval 无*/
void UART_Init()
{//对串行寄存器配置SCON=0x50;		//串行控制寄存器,涉及模式选择PCON &= 0x7F;		//电源控制寄存器(包括波特率)//对定时器0进行配置#11.0592MTMOD &= 0x0F;		//设置定时器模式,低4位保持不变TMOD |= 0x20;		//设置定时器模式,串口对应的模式需要是双8位模式TL1 = 0xFA;		//设定定时初值TH1 = 0xFA;		//设定定时器重装值ET1 = 0;		//禁止定时器1中断TR1 = 1;		//启动定定时器1//串口中断配置EA=1;//启动所有中断ES=1;//启动串口中断
}
/***  @brief 串口发送1个字节数据,4800bps@11.0592MHz*  @param Byte 要发送的一个字节数据*  @retval 无*/
void UART_SendByte(unsigned char Byte)
{SBUF=Byte;//将数据写入发送缓冲器即可while(TI==0);//是否有中断请求位TI=0;//软件置0
}//串口中断函数的模板,需要用的时候复制到主函数中
/*
//注意:一个函数不能既在主函数中出现,又在中断函数中出现
void UART_Routine() interrupt 4 //串口中断对应的中断号
{if(RI==1)//接收到了串口中断{P2=~SBUF;UART_SendByte(SBUF);RI=0;//需要由软件清0}}
*/

主函数代码如下:

#include <REGX51.H>
#include "Delay.h"
#include "UART.h"void main()
{UART_Init();while(1){}
}//注意:一个函数不能既在主函数中出现,又在中断函数中出现
void UART_Routine() interrupt 4 //串口中断对应的中断号
{if(RI==1)//接收到了串口中断{P2=~SBUF;UART_SendByte(SBUF);RI=0;//需要由软件清0}}

四、总结

均由寄存器加逻辑电路组成,只不过二者工作模式及灵活性差别很大,单片机依赖冯诺依曼架构需要控制器控制且电路固定(使得定时器、寄存器等资源有限),FPGA的并行及灵活性在这里体现的淋漓尽致。

http://www.yidumall.com/news/28396.html

相关文章:

  • 怎样做p2p网站菏泽地网站seo
  • 惠州做网站乐云seo广东搜索引擎优化
  • logo网站免费win7优化大师官网
  • 百度竞价排名是什么意思网站优化方案模板
  • 商城网站设计费用太原网站推广排名
  • 建立网站分为几阶段中国公关公司前十名
  • 台州网站排名优化学生个人网页制作html
  • 网页设计网站的分析成都关键词优化服务
  • 中国制造网官方网站首页app开发需要哪些技术
  • 青岛seo整站优化哪家专业网络宣传的方法渠道
  • 一个网站的建设要经过哪几个阶段子域名大全查询
  • 公司网站建设的签订合同国内seo做最好的公司
  • 做网站版权所有怎么写360搜索首页
  • 网络规划设计师 最高分seo是什么
  • 今日最新网页游戏开服表汕头最好的seo外包
  • 杭州品牌网站建设广告发布
  • 苏中建设网站营销策略都有哪些方面
  • 阿里云网站怎么做东莞哪种网站推广好
  • 太仓网站制作网站建设免费的关键词挖掘工具
  • 网站做全景图预览营销推广方案案例
  • 国内免费工厂网站建设零基础学seo要多久
  • wordpress什么样子东莞seo优化推广
  • 视频网站开发论文网站网络推广服务
  • vs2010如何做网站app拉新推广一手接单平台
  • 企业网站总结谷歌推广培训
  • 中心网站设计百度关键词seo公司
  • 在线设计平台canva南宁网络优化seo费用
  • 外贸公司英文网站建设百度地图导航网页版
  • 如何建一个网站多少钱北京百度推广客服电话多少
  • 福州公交集团网站建设百度营业执照怎么办理