• 大小: 0.30M
    文件类型: .pdf
    金币: 1
    下载: 0 次
    发布日期: 2021-03-28
  • 语言: 其他
  • 标签: 其他  

资源简介


关于SPI技术的Verilog实现代码,里面详细讲解了SPI的通信协议
数据接收: P"LLPH上P2mL叫上 l g out_buf 了工a Lu out_ dat 4183 图2、数据接收 数据接收与数据发送使用同一个时钟信号SCK和片选信号CS。其工作情况大纹如下:在 每个SCK时钟的上升沿对接收数据进行采样。由图2可知,在一个bu信号使能阶段,采 到的数据为l0110111,即丨进制183。在busy信号关闭使能后,只有片选使能且处于允许 读状态,接收到的数据才会被存储,否则丢弃。 Chipscope数据抓取 E waveform - CEV 0 MyDewlced ( xC5SLX150T) UNIT O MyI L AO (LA)9999992929993929999992999 Ef a Bus/Signal X in11515155 ⊥,,,囪,,,,,,,,,,,,,L,,⊥ DataPort[3] DataEort [21 DataEort[21] 00 Dataform [20] Dataror 21=0 Window=) Cample= Datafort[19 Datagort [16 DataEort [151 DataEort [14] D孟Et[13] TAF∩Tt[11 Da品Et[10] Dotolort[5] 1 DataPort!S]- DataPort[o]:busy、sdo、addr、cs、wr、ro Patapon21- DataPort[14]:待发送8bit数据 DataPort13]- DataPort6]:接收的8bit数据 总结 完成时间:124-1212 前期:该阶段主要是熟悉SPⅠ工作原理,进一步掌握和认识SP通信协议。( Chipcore的使 用之前木曾接蝕,在这阶段,我先通过简单编程结合开发板抓取数据进行分析达到 对其的基本掌握。 中期:在熟悉SPI的工作原理之后,开始尝试编写代码。写了两三次代码,效果均不理想 很多问题在编写代码的时候没有考虑清楚,导致到了仿真阶段结果与预期有所差距, 且代码冗长复杂。参考了一些资料,效果也不是很好,特別是数据传输暂停部分,很 多都省略了。不过借鉴别人写的代码也让我收获了不少编写的经验,有些情况下,运 用不同的逻辑思维可以让代码史简洁、更只有健壮性。当然期间也遇到了一些自己无 法解决的问,非常感谢福星学长耐心的指导,让我学到了不少知识和经验。 后期:该阶段主要是对代码进行再修改、波豗仿真以及抓数据调试 问题及分析 小问题遇到不少,不过大多都通过eror的提小,或者上网搜索,找到了问题的原因 并予以解决。也有软件上的原因,比如:第一次裝ISE的时候可能没有安装好,上板调试的 时候, cable不能识别。经过测试分析发现ISE里的 drive没有装上。考虑到这样一个问题的 岀现可能还会附带有一些软仵上的漏洞,重装了一遍ISE,问题解决。 使用 chipscope的时候,芯片配置不对连接失败,査阅该电路板的资料,重新配置,问 题解决。在 chipscope里面有些触发信号找不到,经分析是被优化了,通过简单修改代码避 免它被优化后,问题解决。运行 chipscopc后发现 waveform始终没反应,经过一番分析,认 为吋钟线的引脚配置有问题,重换个吋钟信号线IO引脚,问题解决。解决后发现抓取的 波形没有明显的高低跳变,经分析可能是参考时钟选取不对,重选后问题解决。 附录: 流程图 开始 NO SCK触发? 寄存器左移,低 位接收sd信号。 数据接收 开始 NO NO Cs使能? Yes缓存器发 送并移位 NO cs=1)wh wI- ck周期计数器1P=busy置0 Yes NO addr=0? busy置0 sck信号反转 侍发送数据存入缀 存器,busy置1 数据发送 代码: module spi mosi(addr, rd, wr,cs, clk, sdi, sdo, sck, spi bps, data) input wirc addr: Input wire rd; Input wire wr Input wire cs, Input wire clk output[siz.c: 1] data Input sdl inout sdo inout sck. nout spl bps reg size: 1] out data= 0; reg sck buffer=0; reg sdo buffer=0 busy=0; reg [size: 1] in buffer=0; reg size: l out buffer=0 re 0 reg [7: 0] clkcount =0 spl bps reg reg[12: 0] clk cnt; reg size: I in data=8b10101001 parameter size=8 parameter para=6400 parameter para half3200 assign data - out da assign sck=sck buffer; assign sdo= sdo buffer assign spi bps=spi bps reg / 分频模块 lways(a(posedge clk begin if( (clk cnt >=0)&&(clk cnt<para half)) gin clk cnt<=clk cnt+1b1 spi bps reg<=1'b0 end eIse if((clk cnt>=para half)&&(clk cnt< para)) n clk cnt<=clk cnt+1bl spi bps reg<-1b1 end else clk ent<=13'd0: cnd 100 iiil1l1m1i1 发送接收模块 always(a (cs or rd or busy) if(busy & cs & rd) begin out data= out bu lter;end∥接收数据存入 out dala else begin out data=8b0: end end al ways(a(posedge spi bps) )eg ∥空状态 begin if(cs & wr) ∥片选使能且处于写状态 begin e(addr 1b0: begin in buffer= in data;busy=1bl;end待发数据存入缓存区, 转入工作状态 1bl: begin busy=1b0; end endcase end begin if(cs) begin clkcount= clkcount+1b1 if(clkout>8b10)∥挖制SCK周期 gIn clkcount =0 if( count%2)=0)发送数据 qIn sdo buffer-in buffer[ 8] in buffer= in buffer << I if( count >0&& count<17 在未达到8个sck周期时,每次触发 条件满足,信号反转次 begin sck buffer msck buffer count= count +1 b1 f(count>I7) egin count =0: end end al ways(a(posedge sck buffer egin out buffer s out buffer < I out buffer1=sdi /接收从机发送过来的数据 end endmodule 触发信号控制部分 module spi mem(spi bps, rd, wr, cS, sdi, addr) Input output oulput Wr output output output g wr re cs reg g ddr rcg assign rd=rd reg assign wrwr reg assign cs-cs reg, assign sdi=sdi rcg; assign addr-addr reg; reg size: 1 cnt set: ze cnt sdi: always(a (posedge spi bps begin f(cnt set<8'd250) begin cnt set<-cnt set+1bl; end eIse begin cnt set<=8d0; end al ways(a(posedge spi bps) gl if(cnt sdi<8'd9) begin cnt sdi<=cnt sdi+1bl; end else begin cnt sdi<=8d0: end end al ways(@(posedge spi bps) begin f(cnt sdis 8'd5) begin sdi reg<=1bl; end else begin sdi reg<=1b0; end al ways a( poscdgc spi bps)∥产生触发信号便于仿真 g if(cnt set<8d9) begin cs reg <=1'b0 =1b0; rd reg < -Ib0 addr reg <=1bl else il((cnt set>=8'd9)&&(cnt sel<8d24)) cs reg <=lbl addr reg <=1b1 rcg <=1 b0 rd reg <-=1,b0 en else if((cnt set>=8'd24 )&&(cnt set<8'd35)) gin cs rcg <=1b1 addr reg <=1b0; wr reg<=1,b1 rd reg <=1bl end clsc if((ent sct>=8'd35)&&(ent sct<8'd89)) eg ddr reg <=1'b0: wr reg<=1,b1 d reg<-1,b1 else if((cnt set>=8'd89)&&(cnt set<8d105) egIn cs reg <=1b1 addr reg <=1b1; 1b1 rd reg <=1b1 else if(cnt set>-8d105)&&(cnt set<8d115)) cS reg <=1b0 addr reg <=1'b0 wr reg∈1bl; rd reg <=lb0 end clsc if(ent sct>=8d1 15)&&(cnt sct<8'd124) cs reg<=1b1 ddr reg <=lbl wr reg←=1b0, rd rcg <=1,b0 else if((cnt set>=8'd12 4)&&(cnt set<8'd153) begin cs reg <= 1'b0 ddr reg<=1'b0 g rd reg <=1bl cnd else il((ent set>=8d153)&&(ent set<8'd200)) cs reg <=lb0 addr reg<=1bl wr rcg <=1b1 egIn cS rcg <=1b1 addr reg =1b0; wr reg <=1bl; end endmodule 10

资源截图

代码片段和文件信息

评论

共有 条评论