Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

搜索
1 2 3 4
查看: 25008|回復: 11
打印 上一主題 下一主題

[問題求助] 請問~Verilog 設計資料排序~

  [複製鏈接]
跳轉到指定樓層
1#
發表於 2010-3-31 22:43:39 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
請問大大們~* k7 j* v" {5 \5 O
我有9筆資料 同時輸入 A1~A9# |! T# R& d9 i2 d0 _; A9 r
要如何設計才能達到按照數值大小排序輸出X1~X9
1 b% \$ S2 }9 I4 S( F有辦法達到real time輸出嗎?% [+ G% K2 Q/ R$ Z, h' C8 G
還起大大們提點
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂3 踩 分享分享
推薦
發表於 2010-4-15 19:48:08 | 只看該作者
資料量少的話,用插入排序法則也不錯.5 V# o& ]- D$ E- ]! M  C$ @

" b& L" z. y3 p+ a; h5 W假設有九個registers,每個register附帶1個comparator,
! D, P3 B" C. G' G每個clk有一筆data input,每個register會比較input data 與 自己register 的值. 假設第n個register 為 Reg_n
5 }/ Q- @- J* c4 ~& R/ Y+ kif (Reg(n) > Input_value) ( B4 _! z& l+ Q% ]. i& G
% v: r/ T  y; L/ M7 i2 d4 H
       Reg(n) <= Reg(n);                   //保持原來的值$ U% i2 S& V- F$ X- o; [9 K" q. Z

) Q" c8 U+ o. V) J0 v5 |5 W8 r" \else if ((Reg(n)<= In_value)&&( Reg(n-1)<= In_value))7 t( a$ m8 S2 a1 c7 k5 Q5 A

1 }' r( O% h& \, Q1 f  E       Reg(n)  <= Reg(n-1);             //shift in 前一級的值
" c3 c5 O$ s* S5 ~. \  R$ w5 V
8 {8 a8 {5 t9 i/ `- ~4 Felse if ((Reg(n)<=In_value)&&( Reg(n-1)> In_value))# ^4 H* Y8 K7 c$ ~4 n
     
3 K  v6 O  C) V5 |5 N      Reg(n)  <=In_value;             //load input value! o* A  k+ n# a8 K& ~! o
         1 w  n  W, @, }2 _/ j
每個clk 這些 registers array  都是排序好. 一直到最後的input結束,直接輸出第 Reg(5)即是 median value,再 reset all registers.

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有帳號?申請會員

x
回復 支持 2 反對 0

使用道具 舉報

2#
發表於 2010-4-5 16:30:41 | 只看該作者
你把A1~A9吃進來後~要先排序處理吧~( e3 e* Q  k! g( x$ t
: {) T* K" _& `% `
至於你real time輸出~不太懂你要表達意思~7 P5 M) a) a# j6 ?8 Y! n' K: v

+ _& z: u4 R; A$ A$ c# }/ G% ~+ x. z* O你可以把你整個架構描述完整點7 Z; G, j3 R, @/ k# `+ F
! J- u/ A  b; h& \) h
這樣比較好給意見~!!!
3#
 樓主| 發表於 2010-4-5 21:41:38 | 只看該作者
回復 2# kokonut
1 q4 x2 [$ d. K/ ?# g- P4 [( L8 x$ X
* z1 n1 R8 o6 b/ d
    是這樣的~我前面是影像讀進來的資料~我要做一個3*3遮罩的 中值濾波器 4 S5 m: [1 I: I" J, [  k3 C
   所以要將畫面中9個數值做排序後輸出中間的數值& C0 L, g+ k0 y0 ^
因為資料是不斷的進來(暫不考慮使用RAM處理),所以輸出中值的時間只允許1個CLK內完成- M/ N: p  K1 t4 w, E: G
大概是這樣子...0.0
4#
發表於 2010-4-6 14:12:39 | 只看該作者
首先看排序方法
9 J. ?% B; g6 R2 U2 o: ~8 e& g再來看比較器有幾層,還有比較器的寬度
5#
發表於 2010-4-11 15:41:07 | 只看該作者
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案2 }! u; G4 z+ c7 W
至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了.
& O0 v' a' {3 ~1 J
0 j: D' ?+ J7 `舉個4進4出的例子:1 s) u  j- g! q, _
input [word length] a[4];
5 [1 c7 G! _5 ^# K2 yreg [word length] b[4], c[4];
5 O& z3 n+ `! e) |, K/ ~第一次排序
6 v* u! l* [5 eb[0]=min(a[0], a[1]);
& _9 n! u+ M$ Y5 f% m( [5 q5 Yb[1]=max(a[0], a[1]);: ~! M0 ]5 k# @/ J
b[2]=min(a[2], a[3]);# J. q2 P0 `  ?' C* {( w
b[3]=max(a[2], a[3]);- y# J2 B( W  E% i2 e" S- S
第二次排序3 ^# {2 X* ?" [
c[0]=min(b[0], b[2]); //real minmum
' N7 X9 i# F+ X2 uc[1]=max(b[0], b[2]);
9 g" q/ d0 [6 Ac[2]=min(b[1], b[3]);% Z3 y4 U# w9 L: A
c[3]=max(b[1], b[3]);//real maximum  h( p$ B/ U3 h# p; G, D
第三次修正項2 W6 Z$ D! O$ z9 O
d[0]=c[0]; //real minmum
- @1 H" D$ T  Y$ Y: Sd[1]=min(c[1], c[2]);
) T$ ^9 o# }: S( wd[2]=max(c[1], c[2]);6 f" z: s/ A% l: Y3 M7 a* s$ g" y
d[3]=c[3];//real maximum
3 b, \* W% ~9 _0 h' P9 Z//d[0]~d[3]就是依序小到大的答案  k2 `, ?6 z4 g2 l$ }* W+ F
$ o( b7 d1 V% j4 \& y6 w8 V
這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要)
- H7 {7 s( }% b1 ^+ b
! H! r& v; b7 d. W: G  d( _0 X實做的考量
& _9 `% S! X- k/ b) D% T: B6 C1. 實做上min()跟max()應該是一起做的
4 c, ]- a9 ^, E& E if(a>b); J$ f! i) D0 ?9 n; c2 J9 g$ ?
     min = b;. m! z7 v# j) ]5 X
     max = a;: S0 B/ U* v/ `! d& {  c! J
  else
1 T+ @8 Q( Z4 p0 R- f/ h/ X    min = a;
& o* o3 \  K( m1 A5 _6 `0 x1 w    max = b;4 ]' f& ^+ y0 _3 Y+ w9 O
2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性.; b9 z5 m3 {7 j; X
3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項.( ]% ?; U7 ?5 A9 Y! O$ y
P.S. 用我的方法寫conference paper記得要掛我名字哦...XD
6#
 樓主| 發表於 2010-4-12 21:05:13 | 只看該作者
本帖最後由 呆頭鴨 於 2010-4-12 09:06 PM 編輯 ! M* q) a( Z$ g8 I* \4 H" l: {
5 T% _. u2 e# I+ m
回復 5# tommywgt
3 p, D1 U" n, c$ _4 D5 Z( `% l1 m4 `( p1 f; u& T

, m# j0 p* w8 c$ t$ Z    謝謝大大熱心分享* R: J5 ]& _+ p/ q  b+ c
我目前的做法是這樣的,提出來給大家研究討論一下....." s8 L9 A( }2 H/ e& n# R5 t
我將輸入的9筆資料 拆成3段來做 假設輸入是1~9 順序是 5 9 6 7 8 2 1 3 4) d8 T. Q0 v& P3 u4 R
則想像成
2 y4 f2 b* t& Z6 a5 9 6
1 U2 a2 z% z, K+ P, z( I% s( \5 \7 8 2
7 y4 e9 q" G/ y$ n  \# T% p1 3 4% e7 a* m  j8 t3 D8 g/ \. K' ~. b$ X* U
不過要先完成一個輸入 3筆資料 可以將之按大小排列輸出的小程式,這邊簡稱R1 y: P% m8 I" C. O7 N# n
將3段數值分別丟入R 得到 # B+ [% M3 t- s
5 6 9
/ J$ `; H5 u7 x! Q6 m2 7 8  P# y8 A- V# L
1 3 4
1 C% s4 n- M4 @這時候再將 垂直列的3筆丟入R可得到
7 g+ m: B$ t/ o8 s/ m& O. h" f1 2 50 v2 C6 y- j5 I: ?' m9 h, [
3 6 7( ?& V: g: T) G! V1 _% W
4 8 9  (這邊為了方便辨識 所以排橫的 值的橫的沒差@@)
9 C9 q) T$ a# p* }
+ P. T- D! a* }$ c最後一步驟~將右上至左下的3筆資料丟入R 重新排列後再輸出~可得到
( B$ }0 T% j( q) Q1 2 4
; s8 T( h( x2 |1 A0 \4 h" a9 ^3 5 7
/ G$ T7 e" T% a2 y2 D6 8 94 x# S7 \7 z5 H+ W; B1 s
這時候可以發現
, X0 _! ^1 H" @1 {/ S8 S中間的數值確實是9筆資料按大小排列後的中值(5)
( F+ J) b- ]/ ?/ }9 A" L& ^8 a* B雖然其於8筆資料未必有造大小排列,不過目前測 中值的部份還沒算到有問題的...
7#
發表於 2010-4-12 22:31:10 | 只看該作者
啪啪啪
" s8 B. s7 g' v: ^& x其實你的想法已經跟我的想法是一樣的了, 我想已經你知道我一開始講的那個方法的最大問題了6 T5 j( r  m! p5 H  Y
最大問題在於, 第二次的結果只保証最大值及最小值是對的, 對於修正項, 需要更多的運算
7 Q. t; e0 I$ E' }+ W, n7 H; v當亂度能包含所有的項時, 答案一定是對的
9 a& ~0 b" N' t+ S- N1 d* G* u所以關鍵就在於如何用最少的運算次數達到最大的亂度.
0 W; _2 j5 i/ N8 Z1 ]左上到右下不用再算的理由是, 左上一定是最小值, 右下一定是最大值, 所以根本不用算$ }0 S2 @3 A7 P8 B( i
所以在最大的亂度中, 8-1=7次應是最多的運算了, * Y! i8 |+ ~6 u" j8 O2 ^
2 e; T& Y3 O6 s8 [! v! S% X6 a) c9 n
有人有更佳解嗎?
9#
 樓主| 發表於 2010-4-15 22:34:46 | 只看該作者
回復 8# kevin ! |5 u2 g0 v3 j1 p# ]
4 Y& m9 l: Z- {1 A
3 T' n; H  T% r! p$ D
    大大的方法真不錯~ 我怎麼沒有想到呢XD....
10#
發表於 2010-4-16 09:18:15 | 只看該作者
桶米版大 真是太棒嚕
11#
發表於 2010-4-19 20:39:23 | 只看該作者
沒聲大大, 其實大家都很棒啊.
12#
發表於 2010-6-17 15:13:37 | 只看該作者
我覺得 對於3x3的median filter& C7 `8 H' {$ c! x
22排序 看起來是不錯的做法, 1 clock 即可做完.
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

首頁|手機版|Chip123 科技應用創新平台 |新契機國際商機整合股份有限公司

GMT+8, 2024-6-15 10:42 PM , Processed in 0.136017 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表