需求:
在FPGA設(shè)計(jì)中,大部分情況下我們都得使用到數(shù)據(jù)選擇器。并且為了設(shè)計(jì)參數(shù)化,可調(diào),通常情況下我們需要一個(gè)參數(shù)可調(diào)的數(shù)據(jù)選擇器,比如M選1,M是可調(diào)的參數(shù)。
如果,數(shù)據(jù)選擇器是不帶優(yōu)先級(jí)的,我們可以使用verilog VHDL中的二維數(shù)組進(jìn)行設(shè)計(jì) 例如,這樣綜合編譯器也是可以正確生成對(duì)應(yīng)的電路。
reg[7:0]din[1:0]; assign dout = din[sel];
當(dāng)我們,需要設(shè)計(jì)一個(gè)參數(shù)化的數(shù)據(jù)選擇器時(shí)呢?我們?cè)撊绾卧O(shè)計(jì)呢?以下羅列三種實(shí)現(xiàn)方式
方式一:嵌套if來(lái)實(shí)現(xiàn):
假設(shè)我們的多路選擇器,在某些情況下最多位M路,那么我們可以嵌套M個(gè)if,這樣,我們就設(shè)計(jì)出了參數(shù)可調(diào) 2~M的多路選擇器。
always@(*)begin if(sel[0])//1 dout = din[0*DATA_SIZE+:DATA_SIZE]; else if(sel[1])//2 dout = din[1*DATA_SIZE+:DATA_SIZE]; else if(sel[2])//3 dout = din[2*DATA_SIZE+:DATA_SIZE]; else if(sel[3])//4 dout = din[3*DATA_SIZE+:DATA_SIZE]; else if(sel[4])//5 dout = din[4*DATA_SIZE+:DATA_SIZE]; else if(sel[5])//6 dout = din[5*DATA_SIZE+:DATA_SIZE]; else if(sel[6])//7 dout = din[6*DATA_SIZE+:DATA_SIZE]; else if(sel[7])//8 dout = din[7*DATA_SIZE+:DATA_SIZE]; else//0 dout = 0; en
方式二:casez實(shí)現(xiàn):
always @(*)begin casez(sel) 8'b0000_0001:dout=din[0*DATA_SIZE+:DATA_SIZE]; 8'b0000_001?:dout=din[1*DATA_SIZE+:DATA_SIZE]; 8'b0000_01??:dout=din[2*DATA_SIZE+:DATA_SIZE]; 8'b0000_1???:dout=din[3*DATA_SIZE+:DATA_SIZE]; 8'b0001_????:dout=din[4*DATA_SIZE+:DATA_SIZE]; 8'b001?_????:dout=din[5*DATA_SIZE+:DATA_SIZE]; 8'b01??_????:dout=din[6*DATA_SIZE+:DATA_SIZE]; 8'b1???_????:dout=din[7*DATA_SIZE+:DATA_SIZE]; default:dout=0; endcase end
方式三:采用與門或門搭建。
比如一個(gè)二選一的數(shù)據(jù)選擇器應(yīng)該,這樣一個(gè)結(jié)構(gòu):
一個(gè)三選一,帶優(yōu)先級(jí)的電路結(jié)構(gòu):
也就是說(shuō),我們可以通過(guò)代碼,描述出這樣一個(gè)電路結(jié)構(gòu),通過(guò)邏輯復(fù)制的語(yǔ)句完成參數(shù)化的設(shè)計(jì)。
具體思路是這樣的,先把地址信號(hào)sel 變成只是優(yōu)先級(jí)高的那位為1,其他信號(hào)為0。例如,低位高優(yōu)先級(jí),sel=1100,變換后sel_prio=0100。然后,將sel_prio與上對(duì)應(yīng)的數(shù)據(jù),可以看出來(lái)只有1的那個(gè)數(shù)據(jù)才會(huì)被選通,其他為0
module mux #( parameter DATA_SIZE = 8, parameter NUM = 8 ) ( input [NUM*DATA_SIZE-1:0] din, input[NUM-1:0]sel, output[DATA_SIZE-1:0]dout ); assigndout=mux_prio(din,sel); function[DATA_SIZE-1:0]mux_prio; input [NUM*DATA_SIZE-1:0] din; input [NUM-1:0] sel; reg [NUM-1:0] dat; integer i,j; begin for(i=0;i
方式四:基于行為級(jí)描述。
在前面的設(shè)計(jì)中我們是根據(jù)數(shù)據(jù)選擇器的電路結(jié)構(gòu),用硬件語(yǔ)言描述出了這樣的電路,那么我們能不能只描述其功能,然后讓編譯器幫我們理解呢?
module mux #( parameter DATA_SIZE = 8, parameter NUM = 8 ) ( input [NUM*DATA_SIZE-1:0] din, input [NUM-1:0] sel, output [DATA_SIZE-1:0] dout ); assign dout = mux_prio_a(din,sel); //基于功能,行為級(jí)的描述 function [DATA_SIZE-1:0] mux_prio_a ; input [NUM*DATA_SIZE-1:0] din; input [NUM-1:0] sel; reg temp; integer i; begin temp = 1; mux_prio_a = 0; for(i=0;i
總結(jié):
1、首先,這里提供了了四種描述參數(shù)可配的帶優(yōu)先級(jí)的多路選擇器的描述方法。第一種和第二種是常規(guī)的描述方法推薦if-else結(jié)構(gòu),第三種是根據(jù)電路結(jié)構(gòu)使用HDL描述,第四種是使用代碼描述了其功能。
2、第三種方法從功能描述,看起來(lái)描述簡(jiǎn)單,好理解,不過(guò)這樣的描述方式是看綜合軟件的“智能化程度”的,因?yàn)镕PGA是基于查找表LUT結(jié)構(gòu)的,這樣的描述方式在描述比較簡(jiǎn)單的電路功能,綜合器是可以正確理解的。如果比較復(fù)雜的電路,不推薦用這樣的描述方式。
3、值得注意的是,F(xiàn)PGA設(shè)計(jì)最重要的是理解低層的電路結(jié)構(gòu),實(shí)現(xiàn)過(guò)程最好是 功能--》電路--》HDL描述該電路,這才是最好的設(shè)計(jì)。使用類似第三種描述方式最好還是掌握理解底層電路結(jié)構(gòu),然后看綜合出來(lái)的是不是你需要的電路
審核編輯:湯梓紅
-
FPGA設(shè)計(jì)
+關(guān)注
關(guān)注
9文章
428瀏覽量
26465 -
Verilog
+關(guān)注
關(guān)注
28文章
1343瀏覽量
109924 -
數(shù)據(jù)選擇器
+關(guān)注
關(guān)注
2文章
116瀏覽量
16419 -
編譯器
+關(guān)注
關(guān)注
1文章
1617瀏覽量
49015
原文標(biāo)題:Verilog實(shí)現(xiàn)可參數(shù)化的帶優(yōu)先級(jí)的數(shù)據(jù)選擇器
文章出處:【微信號(hào):ZYNQ,微信公眾號(hào):ZYNQ】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論