在學(xué)習(xí)verilog之前,我們先學(xué)習(xí)一下D觸發(fā)器以及它的代碼。 FPGA的設(shè)計(jì)基礎(chǔ)是數(shù)字 電路,因此很多同學(xué)會(huì)認(rèn)為我們要先學(xué)好數(shù)字電路之后,才學(xué)習(xí)FPGA。但是,數(shù)字電路教材的內(nèi)容很多.例如:JK觸發(fā)器、RS觸發(fā)器、真值表、卡諾圖等。但是,這里的很多內(nèi)容其實(shí)已經(jīng)過時(shí)了。此外,對(duì)于FPGA的學(xué)習(xí)來講,我們只用到了其中很少很少的一部分內(nèi)容。如果沒有數(shù)字電路的基礎(chǔ),我們建議就看一部分,知道D觸發(fā)器就夠了。 那么D觸發(fā)器是什么樣子的呢? 這個(gè)就是D觸發(fā)器的示意圖。其中,clk為時(shí)鐘,rst_n為復(fù)位,d為輸入,q為輸出。這個(gè)功能非常簡單,復(fù)位有效的時(shí)候,這個(gè)q的值你可以認(rèn)為是0。如果復(fù)位無效的時(shí)候,那么在時(shí)鐘上升沿的時(shí)候,就把d的值給了q。就是這么簡單,記住這個(gè)動(dòng)作,先有時(shí)鐘上升沿,再有把d的值給了q。這就意味著,時(shí)鐘上升沿的時(shí)候q的值還是沒變的。只有時(shí)鐘上升沿之后,q的值才變化。這是一個(gè)很重要的概念,也就是說先有時(shí)鐘上升沿才有q的變化。如果下一個(gè)時(shí)鐘上升沿沒有到來,那么q的值就保持不變。因此,q的值是在時(shí)鐘上升沿之后一點(diǎn)點(diǎn)變化。這就是D觸發(fā)器,我們所有的FPGA電路都是基于這個(gè)結(jié)構(gòu)來進(jìn)行設(shè)計(jì)的。就是這么簡單,諸如JK觸發(fā)器、RS觸發(fā)器之類完全不需用到。我們就用最簡單的結(jié)果來進(jìn)行設(shè)計(jì)。有些同學(xué)會(huì)問為什么如此簡單就足以進(jìn)行設(shè)計(jì)呢?其實(shí)我們要做一個(gè)系統(tǒng),一個(gè)穩(wěn)定的系統(tǒng),一定是從一個(gè)最簡單的結(jié)構(gòu)搭建起來的,而不會(huì)是一個(gè)很復(fù)雜的結(jié)構(gòu),因此我們FPGA電路里面就是利用D觸發(fā)器的穩(wěn)定性,把它搭建起來的。 那么D觸發(fā)器所對(duì)應(yīng)的波形圖是怎么樣的呢? 這個(gè)是波形圖,你可以看一看q,它都是在時(shí)鐘上升沿之后變化的,在第2個(gè)時(shí)鐘上升沿,看到d的值為0,那么q就輸出0,q的值就保持不變了直到下一個(gè)時(shí)鐘上升沿的到來。下一個(gè)時(shí)鐘上升沿d的值為1,那么q就輸出1,如此類推。這就是我們d觸發(fā)器的功能,非常非常地簡單。 那么這個(gè)D觸發(fā)器在FPGA里面用verilog代碼怎么描述呢? 其實(shí)就是這樣的代碼,可以看出來,這個(gè)代碼跟這個(gè)D觸發(fā)器是完全一樣的,描述的就是D觸發(fā)器。怎么講,可以分析一下這個(gè)代碼: 1····總是(always)在時(shí)鐘(clk)上升沿(posedge)的時(shí)候或者下降沿(negedge)復(fù)位(rst_n)的時(shí)候執(zhí)行2~8的代碼,如果不滿足則q的值不變。 2····如果是復(fù)位就執(zhí)行3的代碼; 3····q就等于0; 5····如果不是復(fù)位,而是時(shí)鐘上升沿就執(zhí)行6的代碼; 6····將d的值給了q; 這個(gè)代碼描述的就是一個(gè)D觸發(fā)器,一個(gè)always就生成了一個(gè)D觸發(fā)器。你可以認(rèn)為D觸發(fā)器就是我們電路上的一個(gè)元件。 總結(jié)要點(diǎn):1. q的值只有在時(shí)鐘上升沿才變化。 2. 時(shí)鐘上升沿時(shí),將d的值賦給q。即先有上升沿,才有信號(hào)變化。 為什么強(qiáng)調(diào)先有上升沿,才有信號(hào)變化呢?有什么用呢?例如: 明德?lián)P的波形,默認(rèn)的情況下都是同步信號(hào),這意味著en和dout都是由D觸發(fā)器產(chǎn)生的。因此信號(hào)的變化,都是在時(shí)鐘上升沿之后才開始的,en也是在時(shí)鐘上升沿之后一點(diǎn)點(diǎn)才變化的;在2的上升沿這個(gè)點(diǎn)上看到en的值是0的,因?yàn)閑n還沒變化;而在3的上升沿這個(gè)點(diǎn)上看到en的值是1,dout的值是0;最后,在10的上升沿這個(gè)點(diǎn)上看到dout的值是1。
|