HDLBits / 時(shí)序邏輯 / 移位寄存器 -- 答案、相關(guān)知識(shí)、思路整理記錄 / 自用
? ? ? ? 記錄一下HDLBits時(shí)序邏輯移位寄存器這一章的相關(guān)知識(shí)和自己寫(xiě)的代碼,主要是自用,如果有錯(cuò)誤或不足,歡迎交流指正~

4-bit shift register / 4位移位寄存器
要求與思路:右移,areset異步復(fù)位至0,load同步置數(shù)不移位,ena高電平時(shí)開(kāi)始右移,用0補(bǔ)齊。load優(yōu)先級(jí)比ena更高。
相關(guān)知識(shí)點(diǎn):注意區(qū)分左移右移,右移是最左端的位首先發(fā)生變化,在這里是用0補(bǔ)齊,左移反之。另外由于areset是異步復(fù)位,所以敏感事件表中要加上它。
以下為代碼:

left/right rotator? 左、右旋轉(zhuǎn)機(jī)
要求與思路:100bit的左右旋轉(zhuǎn)機(jī),load同步置數(shù);ena為01時(shí)右移1bit,10時(shí)左移1bit,11和00時(shí)不變,情況較多,可以使用case語(yǔ)句;注意與上一題不同,移出的位補(bǔ)到最左端或最右端,而不是用0去補(bǔ)齊。

left / right arithmetic shift by 1 or 8? ? 左右移1位或8位算術(shù)移位寄存器
要求與思路:構(gòu)建一個(gè)64bit的算術(shù)移位寄存器,同步置數(shù)。既可以左移也可以右移,由amount控制。amount為00和01時(shí),分別左移1bit和8bit;為10和11時(shí),分別右移1bit和8bit,還是用case語(yǔ)句比較好。
相關(guān)知識(shí)點(diǎn):
? ? ? ?這里涉及到邏輯移位和算術(shù)移位的不同之處。
1)邏輯移位。上面兩題都是邏輯移位,即移出的位丟棄不用,空位用0補(bǔ)齊。
2)算術(shù)移位。算術(shù)左移與邏輯左移相同,看成是運(yùn)算的話,向左移動(dòng)n位,就相當(dāng)于這個(gè)數(shù)乘上2n,不過(guò)要注意數(shù)值的溢出問(wèn)題。而算術(shù)右移則要固定最高位也就是符號(hào)位不變,然后再將整體右移1位,右邊移出的1位要丟棄不用。向右移動(dòng)n位,就是這個(gè)數(shù)除以2n(注意負(fù)數(shù)都是以補(bǔ)碼形式存在,補(bǔ)碼=反碼+1)。

5-bit LFSR? 5位線性反饋移位寄存器
要求與思路:一個(gè)5位LSFR,抽頭位置在3、5(注意抽頭通常從1開(kāi)始編號(hào))。5處的異或門(mén)一端設(shè)置為0。reset重置為1。這一題只要按照?qǐng)D將q每一位寫(xiě)出來(lái)即可。

相關(guān)知識(shí)點(diǎn):
? ? ? ?在移位寄存器向右移位一位以后,左邊就會(huì)空出一位,這時(shí)如果采用一個(gè)反饋函數(shù),以寄存器中已有的某些序列作為反饋函數(shù)的輸入,在函數(shù)中經(jīng)過(guò)一定的運(yùn)算后,將反饋函數(shù)輸出的結(jié)果填充到移位寄存器的最左端,那么這樣的移位寄存器就會(huì)有源源不斷的輸出。這樣的,擁有反饋函數(shù)的移位寄存器稱為反饋移位寄存器(Feedback Shift Register,FSR)。
? ? ? ??如果反饋移位寄存器的反饋函數(shù)是線性函數(shù)(通常是異或運(yùn)算,XOR),那么這種寄存器就被稱為線性反饋移位寄存器(Linear Feedback Shift Register,LFSR)。我們把參與異或運(yùn)算的位稱為“抽頭”(tap)。n位LSFR可以儲(chǔ)存最多2^n-1個(gè)狀態(tài)(永遠(yuǎn)不會(huì)到達(dá)全0狀態(tài))。

3-bit LFSR 3位線性反饋移位寄存器
要求與思路:注意將R輸入連接到SW,將時(shí)鐘連接到KEY[0],L連接到KEY[1]。將?Q 輸出連接到紅燈?LEDR。其余部分與上一題相似,按照?qǐng)D寫(xiě)出來(lái)即可,注意0-1選擇器可以用x?x:x語(yǔ)句完成。

代碼如下:

32-bit LSFR? 32位線性反饋移位寄存器
要求與思路:構(gòu)建一個(gè)32位LSFR,在32、22、2和1處有抽頭。此題原理與5bit LSFR相同,但是顯然不可能使用相同的代碼,否則太過(guò)冗長(zhǎng)??紤]使用for循環(huán),抽頭處另寫(xiě)。
注意:抽頭編號(hào)從1開(kāi)始,所以相應(yīng)序號(hào)應(yīng)該減1才是對(duì)應(yīng)的q的位。另外中間和末尾的抽頭都是前一個(gè)和q[0]異或,而最高位是和0進(jìn)行異或。

shift register 移位寄存器(Exams/m2014 q4k)
要求和思路:寫(xiě)出以下電路的verilog代碼。注意這個(gè)reset是一個(gè)低電平有效的同步復(fù)位端。這道題的重點(diǎn)在于out和in都是1bit,所以需要引入一個(gè)寄存器temp儲(chǔ)存暫態(tài)。


shift register 移位寄存器(Exam/2014 q4b)
要求與思路:如以下這個(gè)n-bit的電路所示,取n=4,并且引用之前寫(xiě)過(guò)的一個(gè)MUXDFF模塊。R給SW,clk給KEY[0],E給KEY[1],L給KEY[2],w給KEY[3],輸出信號(hào)給LEDR[3:0]。其實(shí)這道題只要將每個(gè)模塊的w信號(hào)搞清楚就解決了,注意后一個(gè)模塊的w信號(hào)是前一個(gè)模塊的輸出,第一個(gè)模塊的w就是KEY[3]。


3-input LUT? 3輸入查找表
要求:
在8x1存儲(chǔ)器中設(shè)計(jì)一個(gè)電路,其中寫(xiě)入存儲(chǔ)器是通過(guò)移入位完成的,讀取是“隨機(jī)訪問(wèn)”,就像在典型的RAM中一樣。然后使用電路實(shí)現(xiàn)3輸入邏輯功能。
首先,創(chuàng)建一個(gè)具有8個(gè)D觸發(fā)器的8位移位寄存器。標(biāo)記輸出為Q[0]至[7]。移位寄存器輸入應(yīng)稱為S,它為Q[0]的輸入供電(MSB首先移位)。enable輸入控制是否移位。然后,擴(kuò)展電路具有3個(gè)額外的輸入A,B,C和一個(gè)輸出Z。電路的功能為:當(dāng) ABC 為 000 時(shí),Z=Q[0],當(dāng) ABC 為 001 時(shí),Z=Q[1],依此類(lèi)推。電路應(yīng)僅包含8位移位寄存器和MUX。
思路:
按照題目要求所給,首先建立一個(gè)8位SR,注意這個(gè)SR是左移的,輸入的S替換左移后留下的Q[0]空位。MSB指的是最高位,它首先移位也能看出是左移。后面的電路功能可以看出是一個(gè)8選1多路選擇器,用case語(yǔ)句即可。注意case語(yǔ)句開(kāi)頭中敏感時(shí)間表應(yīng)該用*,和SR寫(xiě)在一個(gè)always中的話會(huì)導(dǎo)致到下一個(gè)clk脈沖才進(jìn)行選擇,結(jié)果輸出錯(cuò)誤。
以下為代碼:

以上就是我自己整理的所有題目的答案,下面是一些總結(jié):
?移位寄存器要注意左移右移的問(wèn)題,以及是算術(shù)還是邏輯移位。
?移位寄存器代碼還是較為簡(jiǎn)單的,用if語(yǔ)句即可完成,重點(diǎn)在于輸出部分究竟由什么構(gòu)成,也就是{ }中的內(nèi)容。
由于SR是由多個(gè)DFF構(gòu)成的,因此相鄰DFF輸入輸出問(wèn)題也要重點(diǎn)關(guān)注。
移位寄存器和MUX結(jié)合運(yùn)用場(chǎng)景較多,MUX用case語(yǔ)句即可完成,但是要根據(jù)題目要求注意敏感時(shí)間表的內(nèi)容。