日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > > ZYNQ


需求:

FPGA設計中,大部分情況下我們都得使用到數(shù)據(jù)選擇器。并且為了設計參數(shù)化,可調,通常情況下我們需要一個參數(shù)可調的數(shù)據(jù)選擇器,比如M選1,M是可調的參數(shù)。

如果,數(shù)據(jù)選擇器是不帶優(yōu)先級的,我們可以使用 verilog VHDL中的二維數(shù)組進行設計 例如,這樣綜合編譯器也是可以正確生成對應的電路。

reg [7:0] din [1:0];assign dout = din[sel];

當我們,需要設計一個參數(shù)化的數(shù)據(jù)選擇器時呢?我們該如何設計呢?以下羅列三種實現(xiàn)方式

方式一:嵌套if來實現(xiàn):

假設我們的多路選擇器,在某些情況下最多位M路,那么我們可以嵌套M個if,這樣,我們就設計出了參數(shù)可調 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實現(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

方式三:采用與門或門搭建。

比如一個二選一的數(shù)據(jù)選擇器應該,這樣一個結構:

一個三選一,帶優(yōu)先級的電路結構

也就是說,我們可以通過代碼,描述出這樣一個電路結構,通過邏輯復制的語句完成參數(shù)化的設計。

具體思路是這樣的,先把地址信號sel 變成只是優(yōu)先級高的那位為1,其他信號為0。例如,低位高優(yōu)先級,sel=1100,變換后sel_prio=0100。然后,將sel_prio與上對應的數(shù)據(jù),可以看出來只有1的那個數(shù)據(jù)才會被選通,其他為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); assign dout = 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 for(j=0;j dat[j] = din[j*DATA_SIZE+i]; end mux_prio[i] = mux_prio_bit(dat,sel_prio(sel)); end endendfunctionfunction [NUM-1:0] sel_prio ; input [NUM-1:0] sel; reg temp; integer i,j; begin sel_prio[0] = sel[0]; for(i=1;i begin temp = 0; for(j=0;j begin temp = temp | sel[j]; end sel_prio[i] = sel[i] && !temp; end  endendfunctionfunction     mux_prio_bit ; input [NUM-1:0]  din; input [NUM-1:0]  sel; integer i; begin mux_prio_bit = din[0]&&sel[0]; for(i=1;i mux_prio_bit = mux_prio_bit | (din[i]&sel[i]);  endendfunctionendmodule

方式四:基于行為級描述。

在前面的設計中我們是根據(jù)數(shù)據(jù)選擇器的電路結構,用硬件語言描述出了這樣的電路,那么我們能不能只描述其功能,然后讓編譯器幫我們理解呢?

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);//基于功能,行為級的描述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 if(temp && sel[i])begin temp = 0; mux_prio_a = din[i*DATA_SIZE+:DATA_SIZE]; end end endendfunctionendmodule

總結:

1、首先,這里提供了了四種描述參數(shù)可配的帶優(yōu)先級的多路選擇器的描述方法。第一種和第二種是常規(guī)的描述方法推薦if-else結構,第三種是根據(jù)電路結構使用HDL描述,第四種是使用代碼描述了其功能。

2、第三種方法從功能描述,看起來描述簡單,好理解,不過這樣的描述方式是看綜合軟件的“智能化程度”的,因為FPGA是基于查找表LUT結構的,這樣的描述方式在描述比較簡單的電路功能,綜合器是可以正確理解的。如果比較復雜的電路,不推薦用這樣的描述方式。

3、值得注意的是,F(xiàn)PGA設計最重要的是理解低層的電路結構,實現(xiàn)過程最好是 功能--》電路--》HDL描述該電路,這才是最好的設計。使用類似第三種描述方式最好還是掌握理解底層電路結構,然后看綜合出來的是不是你需要的電路

參考博客:https://www.cnblogs.com/wystar/p/7245114.html



本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
關閉