最近一直在研究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...