Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

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

  [複製鏈接]
跳轉到指定樓層
1#
發表於 2010-3-31 22:43:39 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
請問大大們~' ?2 X. b# f3 o2 k! K: F5 ?% ]
我有9筆資料 同時輸入 A1~A9+ m7 J; Q- S* z+ |
要如何設計才能達到按照數值大小排序輸出X1~X92 k3 C: T1 y$ B/ H
有辦法達到real time輸出嗎?
) a" M* g% \  z. _還起大大們提點
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂3 踩 分享分享
推薦
發表於 2010-4-15 19:48:08 | 只看該作者
資料量少的話,用插入排序法則也不錯.
7 o2 R7 P4 R- K" V6 E
$ J' R; N3 q( w; T/ s7 R# L假設有九個registers,每個register附帶1個comparator,
# x7 {- M4 m& M5 M: c: |每個clk有一筆data input,每個register會比較input data 與 自己register 的值. 假設第n個register 為 Reg_n4 P" @, O% o3 N
if (Reg(n) > Input_value) , e/ l+ S% Q; V" P( B8 G
/ N8 _4 m# k0 C
       Reg(n) <= Reg(n);                   //保持原來的值
( D& ~8 o5 a8 Z9 T2 z% t- f/ c
9 C& ^: h; a. I  oelse if ((Reg(n)<= In_value)&&( Reg(n-1)<= In_value))
3 N3 x. n6 p8 \  ~3 C/ w- M. E: Y7 ~& M  G: X0 t  ~8 J
       Reg(n)  <= Reg(n-1);             //shift in 前一級的值; ~6 @2 E7 C3 K" S3 y9 i$ X* h/ W
9 Q8 o" g8 F$ C6 Z
else if ((Reg(n)<=In_value)&&( Reg(n-1)> In_value))! P. v2 \$ }& E8 l& N5 Z
     . h3 q0 G* ]6 o
      Reg(n)  <=In_value;             //load input value) J0 m' a# w) E5 S
         : A( Z9 m9 S3 W
每個clk 這些 registers array  都是排序好. 一直到最後的input結束,直接輸出第 Reg(5)即是 median value,再 reset all registers.

本帖子中包含更多資源

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

x
回復 支持 2 反對 0

使用道具 舉報

2#
發表於 2010-4-5 16:30:41 | 只看該作者
你把A1~A9吃進來後~要先排序處理吧~; q/ i9 U6 n4 A$ v- z4 p) e6 G

% j* l: ?6 `$ w/ B, B. l# b0 J' x4 M至於你real time輸出~不太懂你要表達意思~
! w. S% i( ^  R: O- o9 D0 J5 Y# l. X& X5 R9 W
你可以把你整個架構描述完整點
& L. k# d7 q! b4 U/ Y  h6 Z! I
2 V( J) }/ \2 N2 f# e這樣比較好給意見~!!!
3#
 樓主| 發表於 2010-4-5 21:41:38 | 只看該作者
回復 2# kokonut
, [" H$ `( L# v- r4 r! Z2 ~5 \9 V6 X
5 K. D7 T8 U: c6 W2 @& l
    是這樣的~我前面是影像讀進來的資料~我要做一個3*3遮罩的 中值濾波器 % a* E. O4 }( m) n
   所以要將畫面中9個數值做排序後輸出中間的數值
+ |# v& y" g7 C$ e- i因為資料是不斷的進來(暫不考慮使用RAM處理),所以輸出中值的時間只允許1個CLK內完成9 y9 _3 b  p9 P3 s
大概是這樣子...0.0
4#
發表於 2010-4-6 14:12:39 | 只看該作者
首先看排序方法
. |9 Y8 p$ T- E1 w9 [1 |" y/ r再來看比較器有幾層,還有比較器的寬度
5#
發表於 2010-4-11 15:41:07 | 只看該作者
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案; ?, y0 {2 f; m) m2 q" P' [
至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了.: w6 A  x8 W+ j: z0 D

) S. v: i8 m+ U, T舉個4進4出的例子:
5 N& e$ H! R, V" ~input [word length] a[4];
$ R4 }/ |9 l# c* Wreg [word length] b[4], c[4];, ]. r5 B. A1 a# j
第一次排序
+ E* M. t- M  Z3 t+ ~b[0]=min(a[0], a[1]);% f1 Z8 C& g  d4 h  v
b[1]=max(a[0], a[1]);/ j4 t6 |  [) Q6 C* x
b[2]=min(a[2], a[3]);
3 R7 N) ?+ q4 L  i: w5 Bb[3]=max(a[2], a[3]);' {' s9 f0 y: `; f1 n" M
第二次排序
0 `/ m' B5 P2 L2 f' N9 o+ ]c[0]=min(b[0], b[2]); //real minmum
. B8 v( X6 Z# X7 M# Q( ~5 P+ n( Ac[1]=max(b[0], b[2]);
; @: u1 H' k3 U+ gc[2]=min(b[1], b[3]);
# W( O4 z# J. l% ]c[3]=max(b[1], b[3]);//real maximum
( L3 N; T) o5 o- Q第三次修正項
7 n, T: j' k3 C/ Gd[0]=c[0]; //real minmum
) S6 I, \% f, R, G5 R5 _, Qd[1]=min(c[1], c[2]);
0 `3 ?' `' }9 j% ud[2]=max(c[1], c[2]);
& ]& J: _- o$ Q. i7 J8 ud[3]=c[3];//real maximum5 B) |1 I6 H0 `; H+ o
//d[0]~d[3]就是依序小到大的答案
) a; A8 o* i/ {  |3 Z4 f  O  E; ^8 h. S# z. g  N
這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要)& E$ ^- C/ q* _6 U

9 `, S2 ^/ L) W; a6 K實做的考量/ e: H6 p6 t; [" ]
1. 實做上min()跟max()應該是一起做的" W, h+ C2 ~% N2 }" j' z) t! M) ^. }
if(a>b)
& \  L* y7 ^( F     min = b;
- r* e$ ]: m: `, L2 C& T     max = a;
! ~" y2 Q, n7 `) B2 m: p# ~  else$ P+ L/ Z  m; U- b5 R, w
    min = a;
) Q# Z& \2 F7 G6 Q5 G  Q    max = b;
& i! [" I. k6 ~& g, l2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性.
9 M. u$ ]* E* Y; V$ _3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項.
, e% W2 I2 L: {0 h' WP.S. 用我的方法寫conference paper記得要掛我名字哦...XD
6#
 樓主| 發表於 2010-4-12 21:05:13 | 只看該作者
本帖最後由 呆頭鴨 於 2010-4-12 09:06 PM 編輯 2 u4 S6 t( n5 S$ I" p

  S* Q: g4 S4 L( U回復 5# tommywgt
$ Z+ L$ E' D6 X/ z4 I$ q1 b5 Y( M! V" I0 b/ q2 Z5 C
  h8 r: f- ]6 r, M
    謝謝大大熱心分享* \& M- o3 T  W1 d* h- f1 H* P, p
我目前的做法是這樣的,提出來給大家研究討論一下.....4 e7 i! y- v! \+ ]% F% k' T7 B% I
我將輸入的9筆資料 拆成3段來做 假設輸入是1~9 順序是 5 9 6 7 8 2 1 3 42 g7 w. D/ |2 x' J
則想像成
) o) Y4 V& m/ P3 E5 9 6
: L( ?$ d. {7 N) o8 B7 8 23 Z! O+ x  E7 y3 W! |
1 3 4. K: G% j& x( d. @0 j% c
不過要先完成一個輸入 3筆資料 可以將之按大小排列輸出的小程式,這邊簡稱R, t  ~2 o! @/ `4 D% C% A
將3段數值分別丟入R 得到
& I9 l" S3 L5 P! H' i) d$ W5 6 9
  k, @4 j2 a4 g& t  q  n+ a$ v( @2 7 88 s$ p- J( L2 Y( b
1 3 4" J( B1 Q0 Y1 x. }) _5 a7 |
這時候再將 垂直列的3筆丟入R可得到
! a0 j: Y. k  X1 2 5& v; p* y- h- g6 n; k, Q; s2 N
3 6 7
& o1 p0 S6 E5 p. I4 8 9  (這邊為了方便辨識 所以排橫的 值的橫的沒差@@)# x  {7 y; Z, r5 p+ Q$ k: M3 \
. y1 i& J( @% n1 P1 K
最後一步驟~將右上至左下的3筆資料丟入R 重新排列後再輸出~可得到/ v3 R9 [9 L% v% N1 k
1 2 4/ G. F+ g& N5 e4 R+ `/ b) J
3 5 7
3 P1 m8 r8 q6 z6 8 9
" L  a% Y# g; D) e: Y, \) w/ E這時候可以發現9 @9 E6 l9 Y' O1 G, Y5 X1 i
中間的數值確實是9筆資料按大小排列後的中值(5)
) L( I2 `/ o5 t* |! K* d雖然其於8筆資料未必有造大小排列,不過目前測 中值的部份還沒算到有問題的...
7#
發表於 2010-4-12 22:31:10 | 只看該作者
啪啪啪
6 X) f# b& S. t+ ~& L1 |其實你的想法已經跟我的想法是一樣的了, 我想已經你知道我一開始講的那個方法的最大問題了* o$ ]1 @: |- [" v$ F% P; }
最大問題在於, 第二次的結果只保証最大值及最小值是對的, 對於修正項, 需要更多的運算! s% U+ n, ^3 x+ j% n+ W
當亂度能包含所有的項時, 答案一定是對的* C) M/ l, z: o1 H1 W% v
所以關鍵就在於如何用最少的運算次數達到最大的亂度.
; _; J9 _5 |0 T1 A1 j8 e1 e左上到右下不用再算的理由是, 左上一定是最小值, 右下一定是最大值, 所以根本不用算
  B% W: z2 t3 X! w9 Q, R- g" z' J. n所以在最大的亂度中, 8-1=7次應是最多的運算了, 5 I4 E& G% t5 O. W! y3 ^; e( {6 W2 ]

; |' ^4 E( c2 W6 i2 ~  e有人有更佳解嗎?
9#
 樓主| 發表於 2010-4-15 22:34:46 | 只看該作者
回復 8# kevin : x. K/ }$ |  C% N+ o" K

% x. K7 p+ r: a# G. ?8 P4 B6 T5 H0 N3 l2 W% F' q& n
    大大的方法真不錯~ 我怎麼沒有想到呢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
8 r3 q* r6 Q+ q- s- [/ \5 a3 u22排序 看起來是不錯的做法, 1 clock 即可做完.
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-5-20 07:15 AM , Processed in 0.134518 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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