r323串口介绍_第1页
r323串口介绍_第2页
r323串口介绍_第3页
r323串口介绍_第4页
r323串口介绍_第5页
已阅读5页,还剩7页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、module serial(clk,rst,rxd,txd,en,seg_data,key_input,lowbit);input clk,rst;input rxd;/ 串行数据接收端 input key_input;/ 按键输入output 7:0en;output7:0 seg_data;reg7:0 seg_data;output txd;/串行数据发送端output lowbit;/inner reg/reg15:0 div_reg;/ 分频计数器,分频值由波特率决定。分频后得到频率 8 倍波特率的时 钟reg2:0div8_tras_reg;/该寄存器的计数值对应发送时当前位于的时

2、隙数reg2:0div8_rec_reg;/ 该寄存器的计数值对应接收时当前位于的时隙数reg3:0 state_tras;/发送状态寄存器reg3:0 state_rec;/接受状态寄存器reg clkbaud_tras;/以波特率为频率的发送使能信号reg clkbaud_rec;/以波特率为频率的接受使能信号reg clkbaud8x;/ 以 8 倍波特率为频率的时钟, 它的作用是将发送或接受一个 bit 的时钟周期分为 8 个时隙reg recstart;/开始发送标志reg recstart_tmp;reg trasstart;/ 开始接受标志reg rxd_reg1;/ 接收寄存器

3、 1reg rxd_reg2;/ 接收寄存器 2,因为接收数据为异步信号,故用两级缓存reg txd_reg;/ 发送寄存器reg7:0 rxd_buf;/接受数据缓存reg7:0 txd_buf;/发送数据缓存reg2:0 send_state;/每次按键给PC发送Welcome字符串,这是发送状态寄存器reg19:0 cnt_delay;/延时去抖计数器reg start_delaycnt;/开始延时计数标志reg key_entry1,key_entry2;/确定有键按下标志/parameter div_par=16h104;/ 分频参数,其值由对应的波特率计算而得,按此参数分频的 时钟

4、频率是波倍特率的 8/ 倍,此处值对应 9600 的波特率,即分频出的时钟频率是9600*8/assign txd=txd_reg;assign lowbit=0;assign en=8b11111110;/7 段数码管使能信号赋值always(posedge clk )beginif(!rst) begincnt_delay=0;start_delaycnt=0;endelse if(start_delaycnt) begin if(cnt_delay!=20d800000) begincnt_delay=cnt_delay+1;endelse begin cnt_delay=0; star

5、t_delaycnt=0; endendelse beginif(!key_input&cnt_delay=0)start_delaycnt=1;endalways(posedge clk)beginif(!rst) key_entry1=0;else begin if(key_entry2) key_entry1=0;else if(cnt_delay=20d800000) begin if(!key_input)key_entry1=1;endendendalways(posedge clk )beginif(!rst)div_reg=0;else begin if(div_reg=div

6、_par-1) div_reg=0;else div_reg=div_reg+1;endendalways(posedge clk)/ 分频得到 8 倍波特率的时钟beginif(!rst) clkbaud8x=0;else if(div_reg=div_par-1)clkbaud8x=clkbaud8x;endalways(posedge clkbaud8x or negedge rst)beginif(!rst)div8_rec_reg=0;else if(recstart)/接收开始标志div8_rec_reg=div8_rec_reg+1;/ 接收开始后,时隙数在 8 倍 波特率的时钟

7、下加 1 循环endalways(posedge clkbaud8x or negedge rst)beginif(!rst)div8_tras_reg=0;else if(trasstart)div8_tras_reg=div8_tras_reg+1;/ 发送开始后,时隙数在 8倍波特率的时钟下加 1 循环endalways(div8_rec_reg)beginif(div8_rec_reg=7)clkbaud_rec=1;/ 在第 7 个时隙, 接收使能信号有效, 将数据打 入 elseclkbaud_rec=0;endalways(div8_tras_reg)beginif(div8_t

8、ras_reg=7)clkbaud_tras=1;/ 在第 7 个时隙,发送使能信号有效,将数据 发出elseclkbaud_tras=0;always(posedge clkbaud8x or negedge rst)beginif(!rst) begintxd_reg=1;trasstart=0;txd_buf=0;state_tras=0;send_state=0;key_entry2=0;endelse beginif(!key_entry2) beginif(key_entry1) beginkey_entry2=1;txd_buf=8d119; /wendendelse begin

9、case(state_tras)4b0000: begin / 发送起始位if(!trasstart&send_state7)trassta rt=1;else if(send_state7) beginif(clkb aud_tras) begintxd_reg=0;state_tras=state_tras+1;end end else beginkey_entry2=0;ras=0;begin=txd_buf0;6:0=txd_buf7:1;ras=state_tras+1;begin=txd_buf0;6:0=txd_buf7:1;ras=state_tras+1;begin=txd_

10、buf0;6:0=txd_buf7:1;state_tendend4b0001: begin /发送第 1 位if(clkbaud_tras)txd_regtxd_bufstate_t endend4b0010: begin /发送第 2 位if(clkbaud_tras)txd_regtxd_bufstate_t endend4b0011: begin /发送第 3 位if(clkbaud_tras)txd_reg txd_bufstate_tras=state_tras+1;begin=txd_buf0;6:0=txd_buf7:1;ras=state_tras+1;begin=txd_b

11、uf0;6:0=txd_buf7:1;ras=state_tras+1;begin=txd_buf0;6:0=txd_buf7:1;end end 4b0100: begin /发送第 4 位if(clkbaud_tras)txd_regtxd_bufstate_tendend4b0101: begin /发送第 5 位if(clkbaud_tras)txd_regtxd_bufstate_tendend4b0110: begin /发送第 6 位if(clkbaud_tras)txd_regtxd_bufstate_tras=state_tras+1;endend4b0111: begin

12、/发送第 7 位begin=txd_buf0;6:0=txd_buf7:1;ras=state_tras+1;begin=txd_buf0;6:0=txd_buf7:1;ras=state_tras+1;begin=1;=8h55;ras=state_tras+1;if(clkbaud_tras)txd_regtxd_buf state_t endend4b1000: begin / 发送第 8 位if(clkbaud_tras)txd_regtxd_buf state_t endend4b1001: begin / 发送停止位if(clkbaud_tras)txd_regtxd_buf st

13、ate_t endend4b1111:beginif(clkbaud_tras)beginstate_tras=state_tras+1;send_state=send_state+1;trasstart=0;case(send_state)3b000:txd_buf=8d101;/e3b001:txd_buf=8d108;/l3b010:txd_buf=8d99;/c3b011:txd_buf=8d111;/o3b100:txd_buf=8d109;/m3b101:txd_buf=8d101;/e default:txd_buf=0;endcaseendenddefault: beginif

14、(clkbaud_tras)beginstate_t ras=state_tras+1;trassta rt=1;end end endcase endendendalways(posedge clkbaud8x or negedge rst)接受 PC机的数据beginif(!rst) begin rxd_reg1=0; rxd_reg2=0; rxd_buf=0;state_rec=0;recstart=0;recstart_tmp=0;endelse begin rxd_reg1=rxd; rxd_reg2=rxd_reg1;if(state_rec=0) begin if(recstart_tmp=1) begin recstart=1; recstart_tmp=0;检测到state_rec=state_rec+1; end else if(!rxd_reg1&rxd_reg2) / 起始位的下降沿,进入接受状态recstart_tmp=1&state_rec=8) begin if(clkbaud_rec) begin rxd_buf7=rxd_reg2; rxd_buf6:0=rxd_buf7:1;state_rec=state_rec+1; end end else if(state_rec=9) begin if(clkbaud_r

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论