最近的項(xiàng)目邏輯資源不夠,因?yàn)閼?yīng)用需求,要一組256個(gè)四輸入的模塊,后來改吧改吧,改成了一組165個(gè)6輸入的模塊,解決了需求問題,為什么啊,因?yàn)樗妮斎氲哪莻€(gè)模塊浪費(fèi)xilinx的資源了,xilinx的LUT是六輸入的,xilinx在7系列前的LUT還是五輸入的,現(xiàn)在都變成了六輸入(其實(shí)是兩個(gè)五輸入共享連接線)。
具體應(yīng)用不說了,來看看關(guān)于LUT表這件事。
LUT表是最基本的邏輯單元,入門書籍必有的內(nèi)容,基本原理這里不說了。
一般的,有SLICEM和SLICEL兩種,M代表存儲(chǔ),L代表邏輯,好記吧。
L的功能M也能實(shí)現(xiàn),M比L更復(fù)雜,所以我們直接去看SLICEM。
圖上面時(shí)直接從工具里面截的,這里面包括了:
6位讀地址輸入(A1-A6)
8位寫地址輸入(WA1-WA7)
寫時(shí)鐘(CLK)
寫使能(WEN)
數(shù)據(jù)輸入(DI1)
數(shù)據(jù)輸出(O6)
移位寄存器輸出(MC31)
除此之外,由于DI2輸入線和O5輸出的存在,這片LUT還可以被配置為32-depth,2-bit-data-wide的RAM。
為什么寫是8位,讀是6位呢?有疑惑就看datasheet或者user guide啊,翻出UG474,里面有張圖,看了就明白了:
拿一個(gè)SLICEM的四個(gè)LUT搭一個(gè)256的單口RAM,看到了吧,寫地址8位直接用,讀地址用6位,然后高兩bit,一個(gè)給F7MUX,一個(gè)給F8MUX,相當(dāng)于做了兩級(jí)二選一。
還有一個(gè)重點(diǎn)要說的是移位寄存器,移位寄存器用的最多的地方就是做delay 了。
下面是簡單的兩段代碼:
always @(posedge clk )begin
shift_r <= {shift_r[62:0],rxp} ;
end
always @(posedge clk )begin
txp <= shift_r[63];
end
大概的意思就是將rxp輸入延遲64個(gè)時(shí)鐘周期,然后輸出。在很多文檔里面都說過了,LUT單元是可以直接生成移位寄存器的,當(dāng)然必須是SLICEM里面的LUT的,我們看看最后生成的結(jié)果是啥樣的:
有點(diǎn)不好看啊,我倆簡單解釋一下:
1.紅線代表LTU讀地址輸入,讀地址代表了移位寄存器輸出的位數(shù),寫31就是延遲32位,可見所有的地址都被連接在一個(gè)高電平上,5h11111=31,一般情況下,是A[5:1]表征地址,A[0]固定為高
2.青色是時(shí)鐘,這對(duì)于SLICEL來說是沒有的,因?yàn)橛辛藭r(shí)鐘,才可能同步操作;
3.藍(lán)色是需要移位的數(shù)據(jù),程序里面的rxp,直接輸入到了LUT-B的數(shù)據(jù)DI1口
4.黃色從LUT-B的MC31輸出的結(jié)果,一個(gè)LUT可以作為32位的移位寄存器,因?yàn)樾枰莆?4次, 所以需要兩個(gè)LUT級(jí)聯(lián)才能完成完整的移位結(jié)果
5.白色是最后的輸出,注意是從O6輸出的,即級(jí)聯(lián)之后64位移位后的結(jié)果,再過一級(jí)FF之后,就是txp 。
這種寫法比較簡單直觀,也有一些同學(xué)想要規(guī)范,那我們調(diào)用一下官方的原語試試:
SRL16E #(
.INIT(16'h0000), // Initial contents of shift register
.IS_CLK_INVERTED(1'b0) // Optional inversion for CLK
)
SRL16E_inst (
.Q(SRL10_r), // 1-bit output: SRL Data
.CE(1), // 1-bit input: Clock enable
.CLK(clk), // 1-bit input: Clock
.D(rxp ), // 1-bit input: SRL Data
// Depth Selection inputs: A0-A3 select SRL depth
.A0(0),
.A1(1),
.A2(0),
.A3(1) //0x1010= 10
);
這是一個(gè)經(jīng)典的16位寄存器的小模塊,看看布線后成啥樣:
1.紅線代表LTU讀地址輸入,讀地址代表了移位寄存器輸出,一般情況下,是A[5:1]表征地址,但是我們看到黃色線代表的數(shù)據(jù)激怒的是DI2,也就是用了兩個(gè)5輸入LUT中的一個(gè),所以真實(shí)的地址是4‘h1010 = 10,也就是移位10+1次,A[0]固定為高
2.青色是時(shí)鐘;
3.黃色是輸入,rxp ,注意是從DI2口輸入的
4.白色是最后的輸出,注意是從O6輸出的,即10位移位后的結(jié)果,也就是SRL10_r。
7系列因?yàn)長UT表地址位增加,因此還支持32位移位的原語,我們來看看:
SRLC32E #(
.INIT(32'h00000000), // Initial contents of shift register
.IS_CLK_INVERTED(1'b0) // Optional inversion for CLK
)
SRLC32E_inst (
.Q(SRL20_r), // 1-bit output: SRL Data
.Q31(SRL31_r), // 1-bit output: SRL Cascade Data
.A(5'd20), // 5-bit input: Selects SRL depth
.CE(1), // 1-bit input: Clock enable
.CLK(clk), // 1-bit input: Clock
.D(rxp ) // 1-bit input: SRL Data
);
看看會(huì)是怎樣布線的:
1.紅線代表LTU讀地址輸入,讀地址代表了移位寄存器輸出,一般情況下,是A[5:1]表征地址,是5‘h10100 = 20,也就是移位20次,A[0]固定為高
2.青色是時(shí)鐘;
3.黃色是輸入,rxp ,注意是從DI1口輸入的
4.白色時(shí)最后的輸出,注意是從O6輸出的,即20+1位移位后的結(jié)果,也就是SRL20_r。
5.咖啡色是32位移位后的結(jié)果,也就是SRL31_r
這個(gè)移位跟信號(hào)實(shí)際delay的關(guān)系,還要看個(gè)仿真才能看明白:
圖要放大看,rxp_r信號(hào)delay了11個(gè)時(shí)鐘節(jié)拍(計(jì)數(shù)器從750到761)得到信號(hào)SRL10_r,delay了21個(gè)時(shí)鐘節(jié)拍得到了信號(hào)SRL20_r,delay了32個(gè)時(shí)鐘節(jié)拍得到信號(hào)SRL31_r。
也就是delay的時(shí)鐘節(jié)拍N,與配置的LUT地址A之間的關(guān)系為:
N = A + 1
-
移位寄存器
+關(guān)注
關(guān)注
3文章
270瀏覽量
22356
原文標(biāo)題:二大爺聊FPGA(8).LUT與移位寄存器
文章出處:【微信號(hào):zhuyandz,微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論