某協議接收響應模組

2021-07-25 16:03:31 字數 3235 閱讀 9466

最近一直在研究iic和spi協議,嘗試用verilog寫出來,前輩建議從spi入手,因為相對簡單,但是針對spi的4種模式大框架搭起來了,但是內部並轉串怎麼寫毫無頭緒。剛好看到夏宇聞老師編寫的《verilog數字系統設計教程》一書中第15章有講這類內容,就抄了一下**大概感受了一下。

抄沒用,得自己寫。先從簡單的接收模組寫起,進行替代。

協議內容如下:

scl為不斷輸出的時鐘訊號,如果scl為高電平時,sda由高變低時刻,序列資料開始;如果scl為高電平時,sda由低變高,序列資料結束。sda訊號的序列資料位必須在scl為低時變化,若變高則為1,否則為0.(接收模組在scl為高電平進行取樣)

該接收模組接收到資料後轉換為相應的16條訊號線的高電平。即資料為1,則第一條線路為高電平;資料為n,則第n條路線為高電平。

這個協議是不是有點臉熟?簡直就是簡化版本的iic協議啊。

將夏老師的**邏輯看懂後,自己寫的**如下:

module

echo(scl,sda,outhigh);

input scl;

input sda;

output [15:0] outhigh;

reg [15:0] outhigh;

reg startflag;

reg endflag;

reg [4:0] mstate;

reg [3:0] pdata;

reg [3:0] pdatabuf;

parameter

sbit0 = 5'b0_0001,

sbit1 = 5'b0_0010,

sbit2 = 5'b0_0100,

sbit3 = 5'b0_1000,

sbit4 = 5'b1_0000;

always @ (negedge sda)

begin

if (scl)

startflag <= 1;

//else

if (endflag)

startflag <= 0;

endalways @ (posedge sda)

begin

if (scl)

begin

endflag <= 1;

pdata <= pdatabuf;

endelse

endflag <= 0;

endalways @ (pdata)

begin

case (pdata)

4'b0001:

outhigh <= 16'b0000_0000_0000_0001;

4'b0010:

outhigh <= 16'b0000_0000_0000_0010;

4'b0011:

outhigh <= 16'b0000_0000_0000_0100;

4'b0100:

outhigh <= 16'b0000_0000_0000_1000;

4'b0101:

outhigh <= 16'b0000_0000_0001_0000;

4'b0110:

outhigh <= 16'b0000_0000_0010_0000;

4'b0111:

outhigh <= 16'b0000_0000_0100_0000;

4'b1000:

outhigh <= 16'b0000_0000_1000_0000;

4'b1001:

outhigh <= 16'b0000_0001_0000_0000;

4'b1010:

outhigh <= 16'b0000_0010_0000_0000;

4'b1011:

outhigh <= 16'b0000_0100_0000_0000;

4'b1100:

outhigh <= 16'b0000_1000_0000_0000;

4'b1101:

outhigh <= 16'b0001_0000_0000_0000;

4'b1110:

outhigh <= 16'b0010_0000_0000_0000;

4'b1111:

outhigh <= 16'b0100_0000_0000_0000;

4'b0000:

outhigh <= 16'b1000_0000_0000_0000;

default:

outhigh <= 16'b0000_0000_0000_0000;

endcase

endalways @ (posedge scl)

begin

if (startflag)

case (mstate)

sbit0:

begin

mstate <= sbit1;

pdatabuf[3] <= sda;

endsbit1:

begin

mstate <= sbit2;

pdatabuf[2] <= sda;

endsbit2:

begin

mstate <= sbit3;

pdatabuf[1] <= sda;

endsbit3:

begin

mstate <= sbit4;

pdatabuf[0] <= sda;

endsbit4:

begin

mstate <= sbit0;

enddefault: mstate <= sbit0;

endcase

else

mstate <= sbit0;

endendmodule

自己寫的過程中,優化了狀態機的位數,並增加了case語句的default項(雖然用不上)。

同時發現有以下幾個注意事項:

1.msb還是lsb在前取決於狀態機中第一次取樣放入的是資料暫存器的最高位還是最低位。

2.elsemstate <= sbit0;這條語句不能省略,因為這條語句相當於在開始訊號到來之前將狀態機初始化為sbit0.缺了這句,會導致狀態機要在開始訊號到來之後的第乙個時鐘週期之後才能初始化為sbit0.

比如:訊號00010

不缺訊號源00010

資料位3210

狀態機 0123

取樣值0001

缺訊號源00010

資料位3210

狀態機 0123

取樣值0010

結果會導致只在1,3,5。。。等位迴圈輸出,達不到想要的效果。

Spring json接收與響應(demo)

1 匯入jar包 2 相關註解 responsebody,requestbody requestbody 表示從前端接收乙個json物件,responsebody返回乙個json物件 json responsebody public student json requestbody student ...

Http響應協議

響應首行 響應頭資訊 server apache coyote 1.1 content type text html charset utf 8 content length 777 date sat,09 feb 2012 18 30 52 gmt 空行,下面是響應正文,即html 響應協議為ht...

響應模組分析

響應類構造器 rest framework.response.response def init self,data none,status none,template name none,headers none,exception false,content type none param da...