首页 » 解决方案 » Verilog串口通讯设计

Verilog串口通讯设计

作者:  时间:2009-03-02 22:58  来源:
 3 系统软件设计

  FPGA模块是本设计的主体,使用Verilog硬件描述语言进行编写,本段代码共有两个子模块,分别实现提取八位数据和串行数据发送的功能。

  下面是verilog源代码

module SIMO(din,clk,rst,dout_ser);
input din; //串行输入数据
input clk; //时钟信号
input vat; 复位信号
reg[7:0] indata_buf; //输入缓冲寄存器,存提取的有效位
reg[9:0] dout_buf; //输出缓冲寄存器,加了起停位
output reg dout_ser; //串行数据输出
reg nclk; //提取八位有效数据的采样时钟.是4倍于波特率的时钟
reg txclk; //发送数据时钟。发数据取11.2k的波特率
integer bitpos="7"; //当前位
parameter s0=0,s1=1,s2=2,s3=3;
reg[2:0]state;
reg[4:0]counter; //用来计算报头报尾中1的个数
reg tag,tag1;
reg[2:0]cnt3;
reg txdone="1"'b1;//一个字节数据传输完毕标志

  *********提取有效数据位并按串行通讯格式装载数据********
always@ (posedge nclk or posedge rst) begin
 if(rst)
  begin
   state<=0;
   counter<=0;
   tag1=0;
   tag="0";
   indata_buf<=8'bz;
   dout_buf<=10'bz;
   bitpos="7";
   cnt3<=0;
  end
 else case(state)
  s0:begin
   tag="0";//表示数据没有装好
   if(din)
begin
 counter<=counter+1;
 state<=s0;
 if(counter==15)//如果检测到16个1则转入s1状态检测接下来的是不是0
begin
 state<=s1;
 counter<=0;
end
   end
else begin
 counter<=0;
 state<=s0;
end
   end
   s1:if(!din)//如果是0的话,转入s2状态,提取八位有效数据
state<=s2;
   else //否则转到s0状态重新检测
state<=s0;
   s2:if(cnt3==3)//是否采集四次数据
begin
 cnt2<=0;
 indata_buf[bitpos]<=din; //先进来的是高位数据
   bitpos="bitpos-1";
   if(bitpos==-1)
begin
 bitpos=7;state<=s3;end
end
   else cnt3<=cnt3+1;
   s3:begin
 tag1=tag;
 tag=1'b1; //标志输入寄存器满。表明已把有用数据装入寄存器
if(tag&&~tag1)&&txdone) //检测到tag的上升沿以及txdone为高才把输入缓冲数据放到输出缓冲去
dout_buf<={1'b1,indata_buf[7:0],1'b0};//停止位,高位,低位,起始位
state<=s0;
   end
  endcase
end

  //***********发送数据模块
reg[3:0] state_tx=0;
always@(posedge txclk or posedge rst)
begin
 if(rst)
  begin
dout_ser<=1'bz;
state_tx<=0;
txdone=1;
  end
 else

相关推荐

Gartner:抢移动通讯市场 模拟设计是关键

通讯  模拟  2013-07-11

全球GDP改善2013年晶片市场可成长6%

通讯  晶片  CAGR  2012-11-28

周鸿祎:360不会做即时通讯 看好雷军的小米

通讯  小米  2012-09-11

基于串口的通用的单片机在系统编程设计及实现

ISP  串口  2011-09-13

基于串口的通用的单片机在系统编程设计及实现

ISP  串口  2011-07-11

首个国产高性能芯片“安徽造”填补国产化空白

DSP  物联网  通讯  魂芯一号  2011-03-18
在线研讨会
焦点