RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

常用串行總線——SPI協(xié)議(下)

jf_78858299 ? 來源: Cascatrix ? 作者:Carson ? 2023-01-21 17:03 ? 次閱讀

2. 從模塊(SPI_slave):

module spi_slave(

input           rst_n,

input           cs_n,

input           sclk,

input           mosi,



output          miso,

output [7:0]    reg0_out,

output [7:0]    reg1_out,

output [7:0]    reg2_out,

output [7:0]    reg3_out

);

reg miso_r;

reg [7:0] reg1_out_r;

reg [7:0] reg2_out_r;

reg [7:0] reg3_out_r;

reg [7:0] reg0_out_r;

reg start;

reg wr_rd;

reg [3:0] bit_cnt;

reg [6:0] reg_addr;

reg [7:0] reg_data;

parameter reg0_address = 7'b0000000; //address of reg0

parameter reg1_address = 7'b0000001; //address of reg1

parameter reg2_address = 7'b0000010; //address of reg2

parameter reg3_address = 7'b0000011; //address of reg3

//start

always @ (posedge sclk or negedge rst_n)

begin

if(~rst_n)

start <= 1'b0;

else

start <= 1'b1;

end

//bit_cnt

always @ (posedge sclk or negedge rst_n)

begin

if(~rst_n)

bit_cnt <= 4'b0;

else if(start)

bit_cnt <= bit_cnt + 1'b1;

end

//wr_rd

always @ (posedge sclk or negedge rst_n)

begin

if(~rst_n)

wr_rd <= 1'b0;

else if(bit_cnt == 4'b0 && mosi == 1'b0)

wr_rd <= 1'b0;

else if(bit_cnt == 4'b0 && mosi == 1'b1)

wr_rd <= 1'b1;

end

//reg_addr

always @ (negedge sclk or negedge rst_n)

begin

if(~rst_n)

reg_addr <= 7'b0;

else if(bit_cnt >= 4'd1 && bit_cnt <= 4'd7)

reg_addr <= {reg_addr[5:0],mosi};

end

//reg_data

always @ (posedge sclk or negedge rst_n)

begin

if(~rst_n)

reg_data <= 8'b0;

else if(!wr_rd && bit_cnt >= 4'd7)

reg_data <= {reg_data[6:0],mosi};

else if(wr_rd && bit_cnt == 4'd6)

reg_data <= reg2_out_r;

else if(wr_rd && bit_cnt >= 4'd7)

reg_data <= {reg_data[6:0],reg_data[7]};

end

//reg_out

assign reg0_out = reg0_out_r;

assign reg1_out = reg1_out_r;

assign reg2_out = reg2_out_r;

assign reg3_out = reg3_out_r;

always @ (negedge sclk or negedge rst_n)

begin

if(~rst_n)

begin

reg0_out_r <= 8'b0;

reg1_out_r <= 8'b0;

reg2_out_r <= 8'b0;

reg3_out_r <= 8'b0;

end

else if(!wr_rd && bit_cnt == 4'd0)

case(reg_addr)

reg0_address: reg0_out_r <= reg_data;

reg1_address: reg1_out_r <= reg_data;

reg2_address: reg2_out_r <= reg_data;

reg3_address: reg3_out_r <= reg_data;

endcase

end

//miso

assign miso = miso_r;

always @ (negedge sclk or posedge rst_n)

begin

if(~rst_n)

miso_r <= 1'b0;

else if(wr_rd && bit_cnt >= 4'd7)

miso_r <= reg_data[7];

end

endmodule

3. Testbench(tb):

`timescale 1us/1us

module tb();

regclk_40k;

regrst_n;

reg [7:0] data_in;

regsend_start;

wiresclk;

wirecs_n;

wiremosi;

wiremiso;

wire [7:0] data_out;

wire data_out_vld;

wire [7:0] reg0_out;

wire [7:0] reg1_out;

wire [7:0] reg2_out;

wire [7:0] reg3_out;

spi_master i_spi_master(

.clk_40k          (clk_40k),     

.rst_n              (rst_n),

.data_in          (data_in),

.send_start     (send_start),

.sclk               (sclk),

.cs_n              (cs_n),

.mosi              (mosi),

.miso              (miso),

.data_out        (data_out),  

.data_out_vld (data_out_vld)

);

spi_slave i_spi_slave(

.rst_n            (rst_n),       

.cs_n             (cs_n),

.sclk             (sclk),        

.mosi            (mosi),      

.miso            (miso),      

.reg0_out      (reg0_out), 

.reg1_out      (reg1_out), 

.reg2_out      (reg2_out), 

.reg3_out      (reg3_out)

);

initial

begin

rst_n = 1'b0;

#10rst_n = 1'b1;

end

initial

begin

clk_40k = 1'b0;

forever

#1clk_40k = ~clk_40k;

end

initial

begin

send_start = 1'b0;

data_in = 8'd0;

forever

begin

    #200;

    data_in = $random()%256;

    send_start = 1'b1;

    #2

    send_start = 1'b0;

    #8000;

end

end

endmodule

4. 仿真結(jié)果:

按照testbench對(duì)SPI主從設(shè)備進(jìn)行仿真,仿真結(jié)果如圖:

圖片

  1. 系統(tǒng)時(shí)鐘和SPI時(shí)鐘不一致,clk_40k為高頻系統(tǒng)時(shí)鐘,利用計(jì)數(shù)器分頻實(shí)現(xiàn)1k波特率SPI時(shí)鐘;
  2. 復(fù)位信號(hào)rst_n低電平有效,正常傳輸時(shí)始終處于高電平;
  3. 開始傳輸時(shí)send_start信號(hào)拉高,傳輸結(jié)束時(shí)data_out_vld信號(hào)拉高;
  4. SPI主設(shè)備將輸入數(shù)據(jù)data_in并行轉(zhuǎn)mosi串行輸出,SPI從設(shè)備將接收到的串行存入數(shù)據(jù),將移位后的數(shù)據(jù)data_out并行轉(zhuǎn)miso串行輸出。

05

SPI的優(yōu)缺點(diǎn)

5.1 SPI協(xié)議優(yōu)點(diǎn)

  1. 全雙工同步串行通信;
  2. 允許數(shù)據(jù)逐位傳遞;
  3. 允許數(shù)據(jù)傳輸暫停;
  4. 硬件結(jié)構(gòu)簡單,不需要精密時(shí)鐘;
  5. 從機(jī)不需要唯一地址,也不需要收發(fā)器。

5.1 SPI協(xié)議缺點(diǎn)

  1. 需要4個(gè)引腳接口
  2. 支持傳輸距離較短;
  3. 硬件層面沒有定義校錯(cuò)協(xié)議和從機(jī)應(yīng)答信號(hào)。
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    17123

    瀏覽量

    350978
  • SPI
    SPI
    +關(guān)注

    關(guān)注

    17

    文章

    1706

    瀏覽量

    91501
  • 串行端口
    +關(guān)注

    關(guān)注

    0

    文章

    31

    瀏覽量

    11662
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    常用的串口通信協(xié)議SPI協(xié)議簡析

    SPI(serial peripheral interface)也是一種同步串行通信協(xié)議。這里為啥要說“也”呢,回想上一篇介紹的PS/2不也是同步串行通信
    發(fā)表于 07-07 09:33 ?4300次閱讀

    常用串行總線協(xié)議有哪些

    一、常用串行總線協(xié)議目前常用的微機(jī)與外設(shè)之間進(jìn)行數(shù)據(jù)傳輸?shù)?b class='flag-5'>串行
    發(fā)表于 11-03 07:14

    SPI總線協(xié)議介紹及硬件設(shè)計(jì)資料分享

    typora-copy-images-to: typora_picture基于FPGA與MCU通信的SPI協(xié)議設(shè)計(jì)1. SPI總線協(xié)議介紹及
    發(fā)表于 11-10 07:06

    常用串行總線協(xié)議有哪些

    常用串行總線協(xié)議I2C總線、SPI總線、SCI
    發(fā)表于 11-19 06:46

    常用串行擴(kuò)展總線有哪些呢

    常用串行擴(kuò)展總線有:I2C總線,SPI總線,單總線
    發(fā)表于 01-11 08:15

    SPI協(xié)議的作用介紹

    目錄SPI協(xié)議簡介SPI物理層SPI協(xié)議SPI協(xié)議
    發(fā)表于 02-17 07:02

    介紹一SPI協(xié)議

    硬件接口協(xié)議在芯片是被廣泛使用的,上篇博文詳細(xì)介紹了I2C協(xié)議,這次來介紹一spi協(xié)議。一、SPI
    發(fā)表于 02-17 07:44

    SPI、I2C、UART三種串行總線協(xié)議的區(qū)別

    SPI、I2C、UART三種串行總線協(xié)議的區(qū)別
    發(fā)表于 07-17 17:23 ?0次下載

    一文介紹SPI串行總線

    SPI協(xié)議是由摩托羅拉公司提出的通訊協(xié)議(SerialPeripheralInterface),即串行外圍設(shè)備接口,是一種高速全雙工的通信總線
    發(fā)表于 07-16 17:58 ?2962次閱讀
    一文介紹<b class='flag-5'>SPI</b><b class='flag-5'>串行</b><b class='flag-5'>總線</b>

    基于SPI串行總線接口的Verilog實(shí)現(xiàn)

    簡 介: 集成電路設(shè)計(jì)越來越向系統(tǒng)級(jí)的方向發(fā)展,并且越來越強(qiáng)調(diào)模塊化的設(shè)計(jì)。SPI(Serial Peripheral Bus)總線是Motorola公司提出的一個(gè)同步串行外設(shè)接口,容許CPU
    的頭像 發(fā)表于 05-29 10:16 ?5095次閱讀
    基于<b class='flag-5'>SPI</b><b class='flag-5'>串行</b><b class='flag-5'>總線</b>接口的Verilog實(shí)現(xiàn)

    基于FPGA與MCU通信的SPI協(xié)議設(shè)計(jì)

    typora-copy-images-to: typora_picture基于FPGA與MCU通信的SPI協(xié)議設(shè)計(jì)1. SPI總線協(xié)議介紹及
    發(fā)表于 11-05 15:35 ?16次下載
    基于FPGA與MCU通信的<b class='flag-5'>SPI</b><b class='flag-5'>協(xié)議</b>設(shè)計(jì)

    SPI協(xié)議

    目錄SPI協(xié)議簡介SPI物理層SPI協(xié)議SPI協(xié)議
    發(fā)表于 12-22 19:17 ?34次下載
    <b class='flag-5'>SPI</b><b class='flag-5'>協(xié)議</b>

    spi協(xié)議介紹

    硬件接口協(xié)議在芯片是被廣泛使用的,上篇博文詳細(xì)介紹了I2C協(xié)議,這次來介紹一spi協(xié)議。一、SPI
    發(fā)表于 12-22 19:21 ?19次下載
    <b class='flag-5'>spi</b><b class='flag-5'>協(xié)議</b>介紹

    常用串行總線(二)——SPI協(xié)議(Verilog實(shí)現(xiàn))

    SPI(Serial Perripheral Interface, 串行外圍設(shè)備接口)是 Motorola 公司推出的一種同步串行接口技術(shù)。SPI
    的頭像 發(fā)表于 01-06 14:35 ?8362次閱讀

    常用串行總線——SPI協(xié)議(上)

    SPI(Serial Perripheral Interface, 串行外圍設(shè)備接口)** 是 Motorola 公司推出的一種同步串行接口技術(shù)。SPI
    的頭像 發(fā)表于 01-21 17:00 ?1443次閱讀
    <b class='flag-5'>常用</b><b class='flag-5'>串行</b><b class='flag-5'>總線</b>——<b class='flag-5'>SPI</b><b class='flag-5'>協(xié)議</b>(上)
    RM新时代网站-首页