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