从底层结构开始学习FPGA(5)----移位寄存器
文章目錄
系列目錄與傳送門
一、移位寄存器SRL
1.1、概述
1.2、概念
1.3、應(yīng)用
1.4、結(jié)構(gòu)
1.5、級(jí)聯(lián)
三、移位操作
3.1、靜態(tài)操作(移位長度固定)
3.2、動(dòng)態(tài)操作(移位長度可變)
3.3、Timing
四、實(shí)例化
4.1、源語
4.2、推斷方式
五、應(yīng)用
5.1、同步移位寄存器
5.2、固定長度的移位寄存器
六、總結(jié)
系列目錄與傳送門
????????《從底層結(jié)構(gòu)開始學(xué)習(xí)FPGA》目錄與傳送門
一、移位寄存器SRL
1.1、概述
????????移位寄存器內(nèi)的數(shù)據(jù)可以在移位脈沖(時(shí)鐘信號(hào))的作用下依次左移或右移。移位寄存器不僅可以存儲(chǔ)數(shù)據(jù),還可以用來實(shí)現(xiàn)數(shù)據(jù)的串并轉(zhuǎn)換、分頻,構(gòu)成序列碼發(fā)生器、序列碼檢測器,進(jìn)行數(shù)值運(yùn)算以及數(shù)據(jù)處理等,它也是數(shù)字系統(tǒng)中應(yīng)用非常廣泛的時(shí)序邏輯部件之一。
????????在FPGA的底層結(jié)構(gòu)----可配置邏輯塊CLB中,一個(gè)CLB由4個(gè)Slice組成,這4個(gè)Slice又可以分SliceM和SliceL(其比例大致為1:3),其中M是Memory的首字母,L是Logic的首字母,比較SliceM和SliceL,其區(qū)別就是SliceM的查找表具有RAM和ROM的功能,而SliceL的則不具備,所以SliceM比SliceL多的功能就是做存儲(chǔ)器和移位。
1.2、概念
????????SLICEM可以在不使用觸發(fā)器的條件下配置為32位移位寄存器(注意:只能左移)。這樣,每個(gè)LUT可以將串行數(shù)據(jù)延遲1到32個(gè)時(shí)鐘周期。移位輸入D(LUT DI1腳)和移位輸出Q31(LUT MC31腳)可以進(jìn)行級(jí)聯(lián),以形成更大的移位寄存器。一個(gè)SLICEM的4個(gè)LUT6級(jí)聯(lián)可以實(shí)現(xiàn)128個(gè)時(shí)鐘周期的延時(shí)。多個(gè)SLICEM也可以進(jìn)行組合。但SLICEM之間沒有直接連接以形成更長的移位寄存器,在LUT B/C/D處的MC31輸出也沒有。由此產(chǎn)生的可編程延遲可用于平衡數(shù)據(jù)pipeline的時(shí)間。
1.3、應(yīng)用
- 延遲或延遲補(bǔ)償
- 同步FIFO和內(nèi)容尋址存儲(chǔ)器(CAM)
1.4、結(jié)構(gòu)
上圖是由一個(gè)LUT構(gòu)成的最高支持32位移位的移位寄存器SRLC32E結(jié)構(gòu)。?
- CLK:時(shí)鐘
- CE:時(shí)鐘使能,高電平有效
- SHIFTIN(D):數(shù)據(jù)輸入
- A[4:0]:移位長度配置(支持1~32位),需要+1。如9位移位則A[4:0]需配置成1+8(01000)
- SHIFTOUT:32個(gè)長度移位后的數(shù)據(jù)輸出,可用來與其他SRLC32E級(jí)聯(lián),形成更大長度的移位寄存器
- OUTPUT(Q)?:當(dāng)移位長度被確定后,數(shù)據(jù)就會(huì)出現(xiàn)在Q端
1.5、級(jí)聯(lián)
通過兩個(gè)32位的移位寄存器SRL32與一個(gè)MUX2,即可級(jí)聯(lián)成最高支持64位的移位寄存器。
通過三個(gè)32位的移位寄存器SRL32與三個(gè)MUX2,即可級(jí)聯(lián)成最高支持96位的移位寄存器。?
通過四個(gè)32位的移位寄存器SRL32與三個(gè)MUX2,即可級(jí)聯(lián)成最高支持128位的移位寄存器。
而4個(gè)移位寄存器由4個(gè)LUT組成,剛好一個(gè)SLICEM中有4個(gè)LUT,這說明一個(gè)SLICEM可以實(shí)現(xiàn)最多支持128位的移位寄存器。由于4個(gè)LUT同在一個(gè)SLICE里面,所以布線方便且延遲短,有利于時(shí)序收斂。
三、移位操作
3.1、靜態(tài)操作(移位長度固定)
- 輸入(D)被加載到移位寄存器的第一個(gè)位
- 前一個(gè)位被移到下一個(gè)位置并出現(xiàn)在Q輸出上,最高位移到MC31輸出。
- 移位寄存器固定長度為(N + 1),其中N為輸入地址(0-31),由地址總線A[4:0]決定
- 在級(jí)聯(lián)操作中,前一個(gè)移位寄存器的SHIFTOUT鏈接至下一個(gè)移位寄存器的SHIFTIN
3.2、動(dòng)態(tài)操作(移位長度可變)
- 數(shù)據(jù)的移位輸出是異步信號(hào)
- 其他與靜態(tài)操作一致
3.3、Timing
四、實(shí)例化
在實(shí)際的編寫RTL過程中,我們可通過以下方式來生成一個(gè)移位寄存器。
- 源語方式
- 綜合工具推斷方式
4.1、源語
(1)源語類型
- SRL16E:最高可實(shí)現(xiàn)16個(gè)時(shí)鐘周期的移位功能
- SRLC32E:最高可實(shí)現(xiàn)32個(gè)時(shí)鐘周期的移位功能
以上均可以實(shí)現(xiàn)移位寄存器功能,后文以SRLC32E為例進(jìn)行講解。
(2)源語例化
// SRLC32E: 32-bit variable length cascadable shift register LUT (Mapped to a SliceM LUT6) // with clock enableSRLC32E #( .INIT(32'h00000000) // Initial Value of Shift Register ) SRLC32E_inst (.Q(Q), // SRL data output.Q31(Q31), // SRL cascade output pin.A(A), // 5-bit shift depth select input.CE(CE), // Clock enable input.CLK(CLK), // Clock input.D(D) // SRL data input );// End of SRLC32E_inst instantiation關(guān)于參數(shù)與信號(hào)在上面已講解,不贅述。
(3)示例代碼
module test(input clk,input ce, input shift_in, //移位輸入output Q, //移位輸出output shift_out //移位輸出,可級(jí)聯(lián));SRLC32E #(.INIT(32'h00000000) // Initial Value of Shift Register) SRLC32E_inst (.Q(Q), // SRL data output.Q31(shift_out), // SRL cascade output pin.A(5'b01001), // 5-bit shift depth select input,移位長度固定為10----01001+1.CE(ce), // Clock enable input.CLK(clk), // Clock input.D(shift_in) // SRL data input);endmodule上面的模塊是直接使用SRL32源語例化的一個(gè)移位寄存器,移位長度固定為10。 下面是綜合出來的結(jié)構(gòu),可以看到只使用了一個(gè)LUT。
(4)Testbench
`timescale 1ns / 1ns module tb_test();reg clk; reg ce; reg shift_in; wire Q; wire shift_out;test test_inst(.clk(clk),.ce(ce),.shift_in(shift_in),.Q(Q),.shift_out(shift_out));initial beginclk=0;ce=1;shift_in = 1;#330 $finish; endalways#5 clk=~clk;always#10 shift_in<=~shift_in;endmodule(5)仿真結(jié)果
在第一個(gè)周期輸入信號(hào)從0跳轉(zhuǎn)到1;移位長度設(shè)置為10,在第10個(gè)周期Q輸出為1,此后輸出與shift_in一致;在第32個(gè)周期,shift_out開始輸出1,然后輸出與shift_in一致。仿真結(jié)果符合Timing。
4.2、推斷方式
除了直接例化SRL源語外,也可以通過編寫常規(guī)的RTL代碼來實(shí)現(xiàn)移位寄存器的功能。但是需要注意的是,要注意編寫RTL的風(fēng)格,有些風(fēng)格可能導(dǎo)致vivado無法綜合出SRL,而是使用多個(gè)REG來實(shí)現(xiàn),會(huì)造成大量的資源浪費(fèi)。
(1)錯(cuò)誤的推斷方式
module test(input clk,input ce,input shift_in,input rst,output Q,output shift_out);reg [31:0] dff;always@(posedge clk) beginif(rst)dff<=0;else if(ce) begindff[31:0]<={dff[30:0],shift_in}; //拼接運(yùn)算實(shí)現(xiàn)向左移位end endassign shift_out=dff[31]; assign Q=dff[9];endmodule上面代碼的綜合結(jié)果如下,顯然不是用的SRL32,而是數(shù)個(gè)LUT+數(shù)個(gè)FF。其原因在于RTL中使用了復(fù)位信號(hào),而SRL32這個(gè)元件是沒有復(fù)位端口的,因?yàn)榱魉€的結(jié)構(gòu)根本就不需要復(fù)位!復(fù)位的使用完全是畫蛇添足,導(dǎo)致不必要的資源浪費(fèi)。
?
?(2)正確的推斷方式
module test(input clk,input ce,input shift_in,output Q,output shift_out);reg [31:0] dff;always@(posedge clk) beginif(ce) begindff[31:0]<={dff[30:0],shift_in}; //拼接運(yùn)算實(shí)現(xiàn)向左移位end endassign shift_out=dff[31]; assign Q=dff[9];endmodule上面的代碼是刪除復(fù)位后的代碼,綜合結(jié)果如下。
?使用的資源:3個(gè)FF+2個(gè)SRL。因?yàn)槲覀円龅氖?0位移位,所以結(jié)果在第10位被引出。vivado自動(dòng)幫輸入以及輸出做了寄存,所以資源消耗得多一些。??
仿真結(jié)果:?
在第一個(gè)周期輸入信號(hào)從0跳轉(zhuǎn)到1;移位長度設(shè)置為10,在第10個(gè)周期Q輸出為1,此后輸出與shift_in一致;在第32個(gè)周期,shift_out開始輸出1,然后輸出與shift_in一致。仿真結(jié)果符合Timing。
五、應(yīng)用
5.1、同步移位寄存器
????????移位寄存器原語不會(huì)使用同一SLICE中可用的寄存器。要實(shí)現(xiàn)完全同步的讀和寫移位寄存器,輸出引腳Q必須連接到觸發(fā)器FF。移位寄存器和觸發(fā)器共享同一時(shí)鐘,如圖所示。
5.2、固定長度的移位寄存器
????????32位移位寄存器可級(jí)聯(lián)實(shí)現(xiàn)任何靜態(tài)長度模式的移位寄存器,而不需要使用專用的多路復(fù)用器(F7AMUX, F7BMUX和F8MUX)。下圖說明了如何構(gòu)建72位移位寄存器。只有最后一個(gè)SRLC32E原語需要將其地址輸入綁定到ob00111。另外,可以將移位寄存器的長度限制為71位(綁定到obo0110的地址),并且可以使用一個(gè)觸發(fā)器作為最后一個(gè)寄存器。(在SRLC32E原語中,移位寄存器長度為地址輸入+ 1)。
?六、總結(jié)
- 一個(gè)移位操作需要一個(gè)時(shí)鐘沿
- 對(duì)LUT的Q輸出的動(dòng)態(tài)移位長度讀操作是異步的
- 對(duì)LUT的Q輸出的靜態(tài)移位長度讀取操作是同步的
- 數(shù)據(jù)輸入具有 setup-to-clock的時(shí)序規(guī)范
- 在可級(jí)聯(lián)配置中,Q31輸出總是包含最后一位值
- Q31輸出在每次移位操作后同步變化
- SRL結(jié)構(gòu)不需要使用復(fù)位,如果希望使用SRL32減少資源,實(shí)現(xiàn)移位,則建議使用源語方式例化
總結(jié)
以上是生活随笔為你收集整理的从底层结构开始学习FPGA(5)----移位寄存器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用声音传感器的Arduino控制的音乐
- 下一篇: 软件体系结构的第二次实验(解释器风格与管