欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > DOC文档下载  

    [信息与通信]《CPLD FPGA串行通信》项目报告.doc

    • 资源ID:1968566       资源大小:8.72MB        全文页数:31页
    • 资源格式: DOC        下载积分:6
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要6
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    [信息与通信]《CPLD FPGA串行通信》项目报告.doc

    串行通信接口项目报告学生信息(学生填写)班 级计应095日 期2011-05姓 名曾凡涛学 号0908143530计算机学院30一、项目目标 综合运用所学基本知识,通过在CPLD/FPGA开发板子完成按键响应、蜂鸣器蜂鸣、数码管显示以及其他项目所要达到的效果,最后在开发板上构建成一个全双工的串行通信接口。用户利用这个串行通信接口,可以与PC机或其它设备进行串行通信,并可以自主设置串行通信的数据格式和其他属性。二、项目设备1、硬件:PC机CPLD/FPGA开发板2、软件:WindowsXP/2000系统, Quartus II 7.2 (32-Bit)开发环境,comtools2.0。三、项目内容1、串行通信接口项目,项目内容包括:(1)主模块设计;(2)显示模块设计;(3)时钟模块设计;(4)控制模块设计; (5)收发模块设计;(6)发送模块设计;(7)发送控制模块设计;(8)发送移位寄存器模块设计;(9)接收模块设计;(10)接收控制模块设计。2、设计一个基于CPLD/FPGA硬件平台的串口通信接口,项目的主要元素分为:(1) 在实验板上构成一个全双工的串行通信接口,用户利用这个串行接口,可以与PC机或其它设备进行串行通信,并可以设置串行通信的格式;(2) 系统的状态分成工作状态和设置状态:在工作状态下,进行串行通信;在设置状态下,进行通信格式的设置。(3) 该系统用5个数码管(一个单独的数码管和一个4位数码管)显示串行通信的格式,比如串行通信的波特率是4800,7位数据位,校验方式为偶校验,则数码管显示为“E 48-7”。(4) 当系统处于工作状态时,如果收到串行数据,则把该数据显示在发光管上,如果接收到的数据有错误(包括奇偶校验错误和帧错误),则让蜂鸣器发出响声。3、串口通信接口实现的功能:(1) 在工作状态下,若用户按下K1按键,则把拨码开关上的数据发送出去。(2) 在工作状态下,如果用户按下K2按键,进入设置状态,首先设置进行校验方式的设置:这时单独的数码管闪烁显示,若用户按下K3按键可以改变校验方式(共有O、E、n三个取值)。(3) 在此过程中,如果用户再次按下K2按键,可以进行波特率的设置:这时4位数码管的高两位闪烁,若用户按下K3按键可以改变波特率(共有96、48、24、12四个取值)。(4) 在此过程中,如果用户再次按下K2按键,可以改变数据位位数:这时4位数码管的(5) 最低位闪烁,用户按下K3按键可以改变数据位的位数(共有8、7、6、5四个取值)。(6) 在此过程中,如果用户再次按下K2按键,则系统又回到工作状态。四、项目设计根据设计要求,应把系统分成4个模块来完成,这四个模块分别是:时钟模块(向系统各部分提供各种频率的时钟信号)收发模块(进行串行通信的发送和接收)显示模块(显示通信的数据格式)控制模块(控制系统的工作)1. 程序各模块的逻辑框图项目主模块的逻辑框图如下:2、各个模块逻辑框架图如下:时钟模块控制模块显示模块发送模块发送移位寄存器模块发送控制模块接收模块接收控制模块三、程序代码module mainmodule(k1,k2,k3,Hz24,sw,L4BitSel,L1Seg,L4Seg,Txd,Rxd,shineled,beep);input k1,k2,k3,Hz24,Rxd;input7:0sw;output7:0L1Seg,L4Seg,shineled;output3:0L4BitSel;output Txd,beep;wire enable;wire15:0 bcd;wire4:0 shine;wire Hz1,Hz50,Hz400,Hz1000,send,recv;wire1:0baud,chk,bits;Clk Clk(Hz24,baud,Hz1,Hz50,Hz400,Hz1000,recv,send); /时钟模块Ctrl Ctrl(k2,k3,Hz50,chk,baud,bits,bcd,shine,enable); /控制模块Show Show(bcd,Hz400,chk,shine,Hz1,L1Seg,L4Seg,L4BitSel);/显示模块Send Send(sw,k1,Hz50,enable,send,bits,chk,Txd); /发送模块Rev Rev(recv,Hz1000,enable,bits,chk,Rxd,beep,shineled); /接收模块Endmodulemodule Clk(Hz24M,baud,Hz1,Hz50,Hz400,Hz1000,recv,send); /时钟模块input Hz24M;input 1:0 baud;output Hz1,Hz50,Hz400,Hz1000,send,recv;wire Hz28800,Hz14400,Hz7200,Hz3600,Hz9600,Hz4800,Hz2400,Hz1200;fenpin2 tfenpin1(Hz24M,Hz28800);fenpin3 tfenpin2(Hz24M,Hz400);fenpin1 tfenpin3(Hz24M,Hz1000);onehalffenpin afenpin1(Hz28800,Hz14400);onehalffenpin afenpin2(Hz14400,Hz7200);onehalffenpin afenpin3(Hz7200,Hz3600);threefenpin threefenpin0(Hz28800,Hz9600);onehalffenpin afenpin4(Hz9600,Hz4800);onehalffenpin afenpin5(Hz4800,Hz2400);onehalffenpin afenpin6(Hz2400,Hz1200);Datasel Datasel(Hz28800,Hz9600,Hz14400,Hz4800,Hz7200,Hz2400,Hz3600,Hz1200,baud,recv,send);eightfenpin ffenpin0(Hz400,Hz50);fiftyfenpin gfenpin0(Hz50,Hz1);endmodulemodule Datasel(d1,d2,d3,d4,addr,out);/数据选择器模块input1:0 d1,d2,d3,d4;input1:0 addr;output1:0 out;reg1:0 out;always(d1 or d2 or d3 or d4 or addr)case(addr)2'b00:out=d1;2'b01:out=d2;2'b10:out=d3;2'b11:out=d4;endcaseendmodule module threefenpin(clkin,clkout);/三分频input clkin;output clkout;reg1:0 Q; /寄存器always (negedge clkin)if(Q=2'b10)Q=2'b0;elseQ =Q+1'b1;assign clkout=Q1;endmodulemodule fenpin1(clkin,clkout);/ 24MHz TO 1000Hzinput clkin;output clkout;reg13:0 Q;reg clkout;always (negedge clkin)if(Q=14'd12000-1)beginQ=14'h0000;clkout=clkout;endelseQ=Q+1'b1;endmodule module fenpin2(clkin,clkout);/ 24MHz TO 28800Hzinput clkin;output clkout;reg8:0 Q;reg clkout;always (negedge clkin)if(Q=9'd416)beginQ=9'h0000;clkout=clkout;endelseQ=Q+1'b1;endmodule module fenpin3(clkin,clkout);/ 24MHz TO 400Hzinput clkin;output clkout;reg14:0 Q; /计数器reg clkout;always (negedge clkin)if(Q=15'd30000-1)beginQ=15'h0000;clkout=clkout;endelseQ=Q+1'b1;endmodule module eightfenpin(clkin,clkout);/八分频input clkin;output clkout;reg1:0 Q; /计数器reg clkout;always (negedge clkin)if(Q=2'd3)beginQ=2'h0;clkout=clkout;endelseQ=Q+1'b1;endmodule module onehalffenpin(clkin,clkout);/2分频input clkin;output clkout;reg clkout;always (negedge clkin)clkout=clkout;endmodule module fiftyfenpin(clkin,clkout);/50分频input clkin;output clkout;reg4:0 Q;/计数器reg clkout;always(negedge clkin)if(Q=5'd24)beginQ=5'h0;clkout=clkout;endelseQ=Q+1'b1;endmodule module Ctrl(k2,k3,Hz50,chk,baud,bits,bcd,shine,enable); /控制模块input k2,k3,Hz50;output enable;output1:0 chk,baud,bits;output15:0 bcd;output4:0 shine;wire k2out,k3out;wire1:0 sysmode;wire2:0 outk3;Filter filter1(k2,k3,Hz50,k2out,k3out);/去抖动Cntfour cntfour1(k2out,sysmode);/4计数器K3mux k3m(k3out,sysmode,outk3);/数据分配器Cntfour cntfour2(outk30,bits);/4计数器Cntfour cntfour3(outk31,baud);/4计数器Cntthree cntthree0(outk32,chk);/3计数器Shine shine0(sysmode,shine);/闪烁Bauddecoder bauddecoder0(baud,bcd15:8);/译码器波特率Bitsdecoder bitsdecoder0(bits,bcd3:0);/译码器-位assign bcd7:4=4'b1111;assign enable=|sysmode;endmodule module Filter(D,clk,Q);/去抖input1:0 D;input clk;output1:0 Q;reg1:0 Q;always (negedge clk)Q=D;endmodule module Cntfour(clk,Q); /四进制计数input clk;output1:0 Q;reg1:0 Q;always(negedge clk)Q=Q+1'b1;endmodulemodule Cntthree(clk,Q); / 三进制计数input clk;output1:0 Q;reg1:0 tmp;always(negedge clk)if(tmp=2'b10)tmp=2'b0;elsetmp=tmp+1'b1;/tmp can be 00,01,10,assign Q=tmp+1'b1;/Q can be 01,10,11endmodulemodule K3mux(in,addr,out); /数据分配器input in;input1:0 addr;output2:0 out;reg2:0 out;always(in or addr)case(addr)2'b00: out=3'b111;/zai gong zui2'b01: out=in,2'b11;2'b10: out=1'b1,in,1'b1;/set baud2'b11: out=2'b11,in;/set bitsendcaseendmodulemodule Shine(codein,codeout);/闪烁input1:0 codein;output4:0 codeout;reg4:0 codeout;always(codein)case(codein)2'b00: codeout=5'b00000;2'b01: codeout=5'b10000;2'b10: codeout=5'b01100;2'b11: codeout=5'b00001;endcaseendmodule module Bauddecoder(codein,codeout);/ 波特率译码器input1:0 codein;output7:0 codeout;reg7:0 codeout;always(codein)case(codein)2'b00: codeout=8'h96;2'b01: codeout=8'h48;2'b10: codeout=8'h24;2'b11: codeout=8'h12;endcaseendmodule module Bitsdecoder(codein,codeout);/数据位译码器input1:0 codein;output3:0 codeout;reg3:0 codeout;always(codein)case(codein)2'b00: codeout=4'h8;2'b01: codeout=4'h7;2'b10: codeout=4'h6;2'b11: codeout=4'h5;endcaseendmodulemodule Show(L4bcd,Hz400,chk,shine,Hz1,L1Seg,L4Seg,L4BitSel); /显示模块input15:0L4bcd;input4:0shine;input1:0chk;input Hz1,Hz400;output7:0L1Seg,L4Seg;output3:0L4BitSel;wire7:0L1SegTmp;wire shine1;wire3:0 L4Shine,BitSelTmp,L4BCDTmp;wire1:0 CntOut;L1Decoder L1Decoder1(chk,L1SegTmp);/共阴1个数码管L1tux L1tux1(L1SegTmp,8'h00,shine1,L1Seg);/L1 数据选择器assign shine1=Hz1 & shine4;L4Shinetux L4Shinetux1(shine3:0,4'h0,Hz1,L4Shine);/闪烁数据选择器CountFour Countfour1(Hz400,CntOut);/4 计数VariDecoder Varidecoder1(CntOut,BitSelTmp);/变量译码器assign L4BitSel=L4Shine|BitSelTmp;tux tux1(L4bcd15:12,L4bcd11:8,L4bcd7:4,L4bcd3:0,CntOut,L4BCDTmp); /L4数据选择L4Decoder L4Decoder1(L4BCDTmp,L4Seg);/共阳4个数码管endmodulemodule VariDecoder(in,out); /变量译码器input1:0in;output3:0out;reg3:0 out;always(in)case(in)2'b00:out=4'b0111;2'b01:out=4'b1011;2'b10:out=4'b1101;2'b11:out=4'b1110;endcaseendmodulemodule L4Shinetux(d1,d2,addr,out);/闪烁数据选择器input3:0 d1;input3:0 d2;output3:0 out;input addr;reg3:0 out;always(d1 or d2 or addr)case(addr)1'b0:out=d1;1'b1:out=d2;endcaseendmodulemodule L1Decoder(codein,segout);/共阴1个数码管input1:0 codein;output7:0 segout;reg7:0segout;always(codein)case(codein)2'b01: segout=8'h37;/8'b11101101;/"n"2'b10: segout=8'h79;/8'b01111001;/"E"2'b11: segout=8'h3f;/8'b00111111;/"O"default:segout=8'b00000000;/bu xian shi endcaseendmodulemodule L4Decoder(codein,segout);/共阳4个数码管input3:0 codein;output7:0 segout;reg7:0segout;always(codein)case(codein)4'h0: segout=8'hc0;/8'b11000000;4'h1: segout=8'hf9;/8'b11111001;4'h2: segout=8'ha4;/8'b10101100;4'h3: segout=8'hb0;/8'b10110000;4'h4: segout=8'h99;/8'b10011001;4'h5: segout=8'h92;4'h6: segout=8'h82;4'h7: segout=8'hd8;4'h8: segout=8'h80;4'h9: segout=8'h90;4'hf: segout=8'hbf;default:segout=8'b11111111; endcaseendmodulemodule CountFour(clk,Q);/4计数input clk;output1:0 Q;reg1:0 Q;always(negedge clk)Q=Q+1'b1;endmodulemodule tux(data0,data1,data2,data3,addr,out);/L4数据选择input3:0 data0,data1,data2,data3;input1:0addr;output3:0out;reg3:0out;always(data0 or data1 or data2 or data3 or addr)case(addr)2'b00:out=data0;2'b01:out=data1;2'b10:out=data2;2'b11:out=data3;endcaseendmodulemodule L1tux(d1,d2,addr,out);/L1 数据选择器input7:0 d1;input7:0 d2;output7:0 out;input addr;reg7:0 out;always(d1 or d2 or addr)case(addr)1'b0:out=d1;1'b1:out=d2;endcaseendmodule/发送模块module Send(sw,k1,hz50,enable,sendclk,datebits,check,Txd);/发送模块input k1,hz50,enable;input7:0 sw;input sendclk;input1:0 datebits,check;output Txd;wire8:0 dataout;wire k1out;SendCtrl SendCtrl_1(sw,datebits,check,enable,sendclk,dataout,sendclkout);ClearupShake2 ClearupShake_2(hz50,k1,k1out);send_move send_move_1(k1out,hz50,sendclkout,dataout,Txd);endmodule/发送控制模块module SendCtrl(sw,datebits,check,enable,sendclk,dataout,sendclkout);input sendclk,enable;input1:0 datebits,check;input7:0 sw;output8:0 dataout;output sendclkout;wire2:0 swout1,encoderout,middate1;wire swout2,swout3,jy_bits;encoder_one encoder_one_1(datebits,encoderout);assign swout1 = sw7:5 & encoderout;assign swout2 = swout1,sw4:0;assign swout3 = swout2; /三选一数据选择器dataselone dataselone_1(1'b1,swout2,swout3,check,jy_bits); encoder_two encoder_two_1(datebits,jy_bits,middate1,dataout8);assign dataout7:5 = swout1 | middate1;assign sendclkout = (enable & sendclk);assign dataout4:0=sw4:0;endmodule module encoder_one(in,out);input1:0 in;output2:0 out;reg2:0 out;always(in)case(in)2'b00: out = 3'b111;2'b01: out = 3'b011;2'b10: out = 3'b001;2'b11: out = 3'b000;endcase endmodule module encoder_two(in,date,out,high);input1:0 in;input date;output2:0 out;output high;reg2:0 out;reg high;always(in or date)case(in)2'b00: beginhigh = date;out2 = 1'b0;out1 = 1'b0;out0 = 1'b0;end2'b01: beginhigh = 1'b1;out2 = date;out1 = 1'b0;out0 = 1'b0;end2'b10: beginhigh = 1'b1;out2 = 1'b1;out1 = date;out0 = 1'b0;end2'b11: beginhigh = 1'b1;out2 = 1'b1;out1 = 1'b1;out0 = date;endendcase endmodule module dataselone(data0,data1,data2,addr,out);/三选一数据选择器input data0,data1,data2;input1:0 addr;output out;reg out;always(data0 or data1 or data2 or addr)case(addr)2'b01: out = data0;2'b10: out = data1;2'b11: out = data2;default: out = data0;endcase endmodule module send_move(k1,hz50,senclkout2,date,Txd);/发送移位模块input k1,hz50,senclkout2;input8:0 date;output Txd;mov_reg11 mov_reg11_1(date,k1,Txd,senclkout2);endmodulemodule mov_reg11(date,keyin,out,clkcp);/11位移位寄存器input keyin,clkcp;input8:0 date;output out;reg10:0 Q;assign out = Q0;always(negedge clkcp)if(keyin = 1'b1)Q = date,2'b01;else Q = 1'b1,Q10:1;endmodule module ClearupShake2(clk,D,Q);/去抖动模块input clk;input D;output Q;reg Q;always(negedge clk)Q = D;endmodule module Rev(revclk,hz1000,enable,databits,check,Rxd,beep,shineled); /接收模块input revclk,hz1000,enable;input1:0 databits,check;input Rxd;output beep;output7:0 shineled;wire2:0 regout;wire startbits,judgeout,outrevclk,movenews;wire9:0 revdata;RevCtrl RevCtrl_1(enable,databits,revclk,startbits,revdata,check,hz1000,outrevclk,movenews,beep,shineled);mov_reg3 mov_reg3_1(Rxd,outrevclk,regout,startbits);judgement judgement_1(regout,judgeout);mov_reg10 mov_reg10_1(judgeout,movenews,revdata);endmodule module mov_reg3(Rxd,clk,out,start);/3位移位寄存器input Rxd,clk;output start;output2:0 out;reg2:0 out;assign start = out0 | out1;always(negedge clk)out = Rxd,out2:1;endmodule module judgement(in,out);input2:0 in;output out;reg out;always(in)case(in)3'b000: out = 1'b0;3'b001: out = 1'b0;3'b010: out = 1'b0;3'b011: out = 1'b1;3'b100: out = 1'b0;3'b101: out = 1'b1;3'b110: out = 1'b1;3'b111: out = 1'b1;endcaseendmodulemodule mov_reg10(in,clk,out);input in,clk;output9:0 out;reg9:0 out;always(negedge clk)out = in,out9:1;endmodule/接收控制模块Module RevCtrl(enable,databits,revclk,startbits,revdata,check,hz1000,outrevclk,movenews,beep,shineled);input enable,revclk,startbits,hz1000;input1:0 databits,check;input9:0 revdata;output outrevclk,movenews,beep;output7:0 shineled;wire3:0 countout0,data0,data1,dataout;wire countout1,countout2,dataout2,dataout3,seldataout,seldataout2,Gstart;wire8:0 newdata;wire7:0 shineled0;assign Gstart = startbits | countout1;/或门assign outrevclk = (enable & revclk);assign countout1 = | countout0;/或门assign countout2 = outrevclk & countout1;threefenpin Onethird_2(countout2,movenews);/三分频Gary Gary_1(movenews,Gstart,data0,countout0);/格雷码计数器模块encoder encoder_1(databits,check1,data0,data1);/译码器模块assign dataout = revdata3:0 & data1;/assign newdata = revdata8:4 , dataout;/assign dataout2 = newdata;/异或门assign dataout3 = dataout2;/非门dataselone dataselone_2(1'b1,dataout3,dataout2,check,seldataout);/三选一数据选择器assign seldataout2 = &revdata9,seldataout;/assi

    注意事项

    本文([信息与通信]《CPLD FPGA串行通信》项目报告.doc)为本站会员(音乐台)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开