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

建设包包网站的目的seort什么意思

建设包包网站的目的,seort什么意思,泰州网络营销,wordpress文章行距一、简介 在上一篇文章当中我们实现了UART接收模块的相关设计和功能实现,在今天的文章中我们继续实现剩下的发送模块的相关设计和完成完整的串口数据回环的实验。 在文章的最后我会给出完整的工程,给小伙伴们参考。 二、接收模块的基本设计 在接收模块…

一、简介


        在上一篇文章当中我们实现了UART接收模块的相关设计和功能实现,在今天的文章中我们继续实现剩下的发送模块的相关设计和完成完整的串口数据回环的实验。

在文章的最后我会给出完整的工程,给小伙伴们参考。

二、接收模块的基本设计


        在接收模块设计的时候我们就采用了状态机的实现方式,所以在本次的发送模块的设计中我们也采用状态机进行实现。本将状态机划分为四个,第一个就是空闲状态,表示发送模块没有接收到来自接收模块的信号和数据,第二个是开始状态,和接受模块一样也是表示设备检测到起始位,第三个发送数据过程状态,用于表示设备发送数据的过程,最后一个就是停止位,表示设备发送数据完成。

84fb58dcea744f928d012776893bf7ef.png

三、接收模块的波形图绘制


        根据上面的状态机,我们可以据此展开波形图的绘制,分别就是对于来自接收模块转换的数据以及发送信号标志位,状态机转移、相关计数器、busy等信号的表示。

        当发送模块接收到来自接收模块的标志信号时,状态机就从IDLE进入到START,然后利用波特率计数器计数1bit的起始位,来到DATA,利用波特率计数器和bit计数器用于接收数据,接收完数据之后进入STOP,最后利用波特率计数器计数1bit的停止位,状态又回到初始的IDLE状态。

eb445838cadd4df0bc52c963362cb1d3.png

        

四、发送模块代码编写

1、设计代码的编写

在上一篇文章中的基础之上新建一个uart_tx.v文件,如下:在代码中可能会看到中间部分会和屏蔽了一样,这里应该是verilog使用其他语言格式造成的,这里不影响,直接使用代码就行,哪些代码时没有屏蔽的。

//发送模块
module uart_tx (input               clk         ,input               rst_n       ,input   [7:0]       tx_din      ,//进入发送模块准备发送的数据input               tx_din_vld  ,//要发送数据的有效信号output  reg         tx_dout     ,//串行发送出去的数据output              busy      //发送一字节完成信号
);//参数定义localparam  IDLE  = 4'b0001,//空闲状态START = 4'b0010,//发送起始位DATA  = 4'b0100,//发送数据STOP  = 4'b1000;//发送停止位parameter   CLOCK_FRQ   = 50_000_000,//50M时钟BAUD_9600   = 9600      ,//波特率设置BAUD_14400  = 14400     ,BAUD_19200  = 19200     ,BAUD_38400  = 38400     ,BAUD_115200 = 115200    ;//中间信号定义 reg  [12:0]     cnt_bps     ;//波特率计数器,最大值是50M/9600 13位宽wire            add_cnt_bps ;wire            end_cnt_bps ;reg  [3:0]      cnt_bit     ;//bit计数器,只记数据位 8位wire            add_cnt_bit ;wire            end_cnt_bit ;reg  [7:0]      tx_din_r    ;//寄存一次数据,否则第一个数据会被丢弃reg  [3:0]      state_c     ;//现态reg  [3:0]      state_n     ;//次态wire            idle2start  ;//状态机转移条件wire            start2data  ;wire            data2stop   ;wire            stop2idle   ;//状态机
always @(posedge clk or negedge rst_n)beginif(!rst_n)state_c <= IDLE;elsestate_c <= state_n;
endalways @(*)begincase (state_c)IDLE  : beginif(idle2start)beginstate_n = START;endelse beginstate_n = state_c;endendSTART : beginif(start2data)beginstate_n = DATA;endelse beginstate_n = state_c;endendDATA  : beginif(data2stop)beginstate_n = STOP;endelse beginstate_n = state_c;endendSTOP  : beginif(stop2idle)beginstate_n = IDLE;endelse beginstate_n = state_c;endend        default: state_n = IDLE; endcase       
endassign idle2start = state_c == IDLE  && (tx_din_vld );//数据来临有效即可以发
assign start2data = state_c == START && (end_cnt_bps);//发完1bit
assign data2stop  = state_c == DATA  && (end_cnt_bit );//发完8bit
assign stop2idle  = state_c == STOP  && (end_cnt_bps);//发完1bit//tx_din_r
always @(posedge clk or negedge rst_n)begin if(!rst_n)begintx_din_r <= 'd0;end else if(tx_din_vld)begin tx_din_r <= tx_din;end 
end
//cnt_bps
always @(posedge clk or negedge rst_n)begin if(!rst_n)begincnt_bps <= 0;end else if(add_cnt_bps)begin if(end_cnt_bps)begin cnt_bps <= 0;endelse begin cnt_bps <= cnt_bps + 1;end endelse begincnt_bps <= cnt_bps;end
end assign add_cnt_bps = (state_c != IDLE);
assign end_cnt_bps = add_cnt_bps && (cnt_bps == (CLOCK_FRQ/BAUD_115200 - 1));//cnt_bit  
always @(posedge clk or negedge rst_n)begin if(!rst_n)begincnt_bit <= 0;end else if(add_cnt_bit)begin if(end_cnt_bit)begin cnt_bit <= 0;endelse begin cnt_bit <= cnt_bit + 1;end endelse begincnt_bit <= cnt_bit;end
end assign add_cnt_bit = (state_c == DATA && end_cnt_bps);//每发完1bit才会加1
assign end_cnt_bit = add_cnt_bit && (cnt_bit == 8 - 1);//tx_dout
always @(posedge clk or negedge rst_n)begin if(!rst_n)begintx_dout <= 1'b1;end else begin case (state_c)IDLE : tx_dout <= 1'b1;START: tx_dout <= 1'b0;DATA : tx_dout <= tx_din_r[cnt_bit];//LSB发送数据STOP : tx_dout <= 1'b1;default: tx_dout <= 1'b1;endcaseend 
end//busy
assign busy = state_c !=IDLE;endmodule

2、测试文件的编写

新建一个uart_tx_tb.v文件,如下:先对编写的发送模块进行一个设计再进行整个回环实验进行一个实现。这里直接对输入数据进行一个8位赋值,观察发送模块发送出的数据。

`timescale 1ns/1nsmodule uart_tx_tb();
//激励信号定义 
reg          clk          ;
reg          rst_n        ;
reg          tx_din_vld   ;
wire         tx_dout      ;
wire         tx_done   ;
//时钟周期参数定义 
parameter CYCLE = 20;uart_tx uart_tx_inst(/*input          */ .clk       (clk       )  ,/*input          */ .rst_n     (rst_n     )  ,/*input   [7:0]  */ .tx_din    (8'b10100101    )  ,//进入发送模块准备发送的数据/*input          */ .tx_din_vld(tx_din_vld && ~busy)  ,//要发送数据的有效信号/*output  reg    */ .tx_dout   (tx_dout   )  ,//串行发送出去的数据/*output  reg    */ .busy      (busy   )   //发送一字节完成信号
);
//产生时钟 
initial  clk = 1'b0; 
always #(CYCLE/2) clk = ~clk; //产生激励 
initial  begin rst_n = 1'b0; #(CYCLE*10+3); rst_n = 1'b1; repeat (10)begin//起始位tx_din_vld = 1;#20;#(434*CYCLE);#(434*CYCLE*8);//停止位#(434*CYCLE);#(CYCLE*100);$stop;end
end 
endmodule

3、波形仿真

通过波形图我们可以看到发送模块的发送端发出的数据和我们设定的值一样,发送模块设计没有问题。

a159276f9c7247ffb08386084f484631.png

五、UART回环实验的实现

1、编写顶层模块

编写一个顶层模块,将接收模块和发送模块两者结合起来,从而实现数据回环,新建一个top.v文件,如下:

 

module top (input       clk     ,input       rst_n   ,input       rx      ,output      tx          
);
wire  [7:0] rx_data;
wire        rx_dout_vld;
wire            busy;
//不加控制模块
uart_rx uart_rx_inst(  /*input		   */	  .clk		   (clk   ),/*input		   */	  .rst_n	   (rst_n ),/*input		   */	  .din_rx      (rx    ),/*output [7:0]*/      .dout_data   (rx_data  ),/*output	   */     .dout_flag   (rx_dout_vld  )	
);	
uart_tx uart_tx_inst(/*input        */ .clk        (clk      ) ,/*input        */ .rst_n      (rst_n    ) ,/*input   [7:0]*/ .tx_din     (rx_data     ) ,//进入发送模块准备发送的数据/*input        */ .tx_din_vld (rx_dout_vld && ~busy    ) ,//要发送数据的有效信号/*output  reg  */ .tx_dout    (tx       ) ,//串行发送出去的数据/*output  reg  */ .busy    (busy   )  //发送一字节完成信号
);endmodule

2、顶层测试文件的编写

`timescale 1ns/1nsmodule top_tb();//激励信号定义 reg				tb_clk  	;reg				tb_rst_n	;reg				rx		;//输出信号定义	 wire            tx     ;
//时钟周期参数定义	parameter		CLOCK_CYCLE = 20;   //模块例化top tb_top( /*input				  */.clk		(tb_clk     ),/*input				  */.rst_n	    (tb_rst_n   ),/*input               */.rx         (rx     ),/*output              */.tx         (tx    )
);	//产生时钟initial 		tb_clk = 1'b0;always #(CLOCK_CYCLE/2) tb_clk = ~tb_clk;//产生激励integer i;initial  begin tb_rst_n = 1'b1;rx = 1;//空闲为高电平#(CLOCK_CYCLE*2);tb_rst_n = 1'b0;#(CLOCK_CYCLE*20);tb_rst_n = 1'b1;#1002;//模拟UART接收模块的串行输入repeat(20)begin//起始位rx = 0;#(434*CLOCK_CYCLE);//数据位:for (i=0;i<8;i=i+1) beginrx = $random;#(434*CLOCK_CYCLE);end//停止位rx = 1;#(434*CLOCK_CYCLE);//两次发送的间隔时间#(CLOCK_CYCLE*1000);end// #(CLOCK_CYCLE*434*11);// $stop;endendmodule 

3、波形仿真

从最后的仿真图中我们可以看到接收端和发送端最后的数据都是一样,说明我们的串口回环实验设计成功。

4ea5b71b32ab436eaf773efd4fd817e4.png

4、下板验证

经过我们最后的下板验证之后,发现数据能够正确的进行回环,如图所示:

d03ad8a49460441481a1455ebcbc5b9b.png

 到这里UART回环就设计完成了。

六、完整工程

 

https://pan.baidu.com/s/12IrXc6A00a_zLP3SHXlriA?pwd=7f9i 
提取码:7f9i

 

http://www.dtcms.com/wzjs/247393.html

相关文章:

  • 网站充值提现公司账务怎么做51外链代发网
  • 效果图哪个网站好今日热搜新闻头条
  • 有什么可以做任务赚钱的网站软文营销推广
  • 网站建设中的时尚资讯seol英文啥意思
  • 安徽网站开发培训价格夸克搜索入口
  • 为什么在百度搜不到我的网站全自动推广引流软件
  • 仿站工具下载后咋做网站百度seo排名推广
  • 网页图片高清郑州外语网站建站优化
  • 温州市住建委住宅建设网站中国搜索
  • 手机网站建设的价格所有关键词
  • 郑州富士康详细地址上海做网站优化
  • 成都网站建设公司浅谈百度小说app
  • 网站怎么做全屏的网络营销的整体概念
  • 秦皇岛网站推广百度浏览器打开
  • 档案安全网站安全建设免费b2b
  • 淘宝直接怎么做网站百度服务中心电话
  • 做景观素材有哪几个网站推广网络推广平台
  • 企业建立自己网站主要方式技能培训网
  • 商洛网站建设哪家好网络推广员是干嘛的
  • diango做的网站怎么用手机创建网站教程
  • 国外推广国内网站网络营销公司热线电话
  • 做拍卖的网站有哪些亚马逊关键词搜索器
  • 视频网站开发的论文百度首页 百度一下
  • .org做商业网站网站关键词如何优化上首页
  • cos wordpress郑州seo排名哪有
  • 常见b2c电商平台有哪些关键词优化排名用哪些软件比较好
  • 页面设计合同上海外包seo
  • 商标被注册了做网站网址之家
  • 建模e-r跟做网站有什么关系专业模板建站
  • 网站建设易网拓seo同行网站