|
我們來做一個(gè)4選一的Mux的實(shí)驗(yàn),首先是利用if…else語句來做,如下。 (由輸入xsel來選擇輸出的路數(shù)xin0,xin1,xin2,xin3其一,輸出yout) Ex3: input clk; input xin0,xin1,xin2,xin3; input[1:0] xsel; output yout; reg youtr; always @ (posedge clk) if(xsel == 2'b00) youtr RTL視圖如下: 上面的視圖里,可以看出有三個(gè)等于比較器,然后在觸發(fā)器前會(huì)有三個(gè)2選1的選擇器。和我們的代碼是一樣的,第一個(gè)if語句的優(yōu)先級(jí)是最高的(這里所謂的優(yōu)先級(jí)最高不是軟件意義上的高優(yōu)先級(jí),由于HDL設(shè)計(jì)的并行性,判斷語句綜合后不是先后進(jìn)行判斷,而是在同一時(shí)刻進(jìn)行判斷,也就是說if和后面的if else 或者else其實(shí)是同時(shí)進(jìn)行判斷的),看紅線連接的網(wǎng)絡(luò),如果它的等于比較器的邏輯值為1,那么決定了最后一個(gè)2選1mux的值必定是和xin0連接的而與前面的結(jié)果無關(guān)。依次類推,如果它的等于比較器的值為0,那么最后的輸出就由前面的邏輯來決定。其實(shí),綜合出來這樣的結(jié)果和我們的設(shè)想還是有出入的,一個(gè)4選1mux何必如此復(fù)雜呢。 下面就看用case語句來做這個(gè)4選1mcu吧。 input clk; input xin0,xin1,xin2,xin3; input[1:0] xsel; output yout; reg youtr; always @ (posedge clk) case (xsel) 2'b00: youtr RTL視圖如下: 呵呵,上面應(yīng)該就是我們所要的,4選1的mux,一目了然。Case與if的用法還是應(yīng)該根據(jù)具體的情況而定,但是盡量多用case往往會(huì)更簡化硬件電路。 |