Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

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

  [複製鏈接]
跳轉到指定樓層
1#
發表於 2010-3-31 22:43:39 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
請問大大們~- m+ z0 u; L$ I3 j2 M" w* O
我有9筆資料 同時輸入 A1~A9
1 U  l! o1 f! U要如何設計才能達到按照數值大小排序輸出X1~X9
7 g: H' d6 C, Q1 M有辦法達到real time輸出嗎?. J4 p# I1 x# y! |2 H, q" k
還起大大們提點
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂3 踩 分享分享
推薦
發表於 2010-4-15 19:48:08 | 只看該作者
資料量少的話,用插入排序法則也不錯.
+ s( }: h/ \, l9 K7 ?% t' D% O8 k  n' p+ F' p8 J; A
假設有九個registers,每個register附帶1個comparator,
# E( p3 T/ W9 a! _* w' N每個clk有一筆data input,每個register會比較input data 與 自己register 的值. 假設第n個register 為 Reg_n% A: M6 g7 @/ v/ [
if (Reg(n) > Input_value) 9 }- J4 m5 a) t4 n
, v4 Q$ v1 `$ _/ C. `- |
       Reg(n) <= Reg(n);                   //保持原來的值
! W: ~5 Y' F3 k3 V7 G+ z
" g6 N  m1 H, c& q! Y: }else if ((Reg(n)<= In_value)&&( Reg(n-1)<= In_value))& s+ Q' b# a/ Z$ P$ u7 P4 {7 l3 E) ]
/ k6 B# G5 B. f4 t( H3 X
       Reg(n)  <= Reg(n-1);             //shift in 前一級的值  n& H$ l! y3 H  r5 ~

9 W. b% R' i* {; j4 }9 {6 Melse if ((Reg(n)<=In_value)&&( Reg(n-1)> In_value))
! ]3 b( l: T$ O- x     
7 L1 c. b0 q0 @9 l1 f0 g      Reg(n)  <=In_value;             //load input value
/ m/ L; S6 R) t, `4 G         
- `( n/ S8 P% ]0 n每個clk 這些 registers array  都是排序好. 一直到最後的input結束,直接輸出第 Reg(5)即是 median value,再 reset all registers.

本帖子中包含更多資源

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

x
回復 支持 2 反對 0

使用道具 舉報

2#
發表於 2010-4-5 16:30:41 | 只看該作者
你把A1~A9吃進來後~要先排序處理吧~) S: A8 R5 L7 V$ ?# Y
7 a/ @4 I0 y( W
至於你real time輸出~不太懂你要表達意思~& o5 O  h. g: z7 ]

( B( e. R: e7 [2 H" m+ V+ i$ L你可以把你整個架構描述完整點7 c6 g/ w! E* z6 l

+ D7 v3 X* f9 H: f這樣比較好給意見~!!!
3#
 樓主| 發表於 2010-4-5 21:41:38 | 只看該作者
回復 2# kokonut
. J  B& C7 u( b
1 t( w- k  c6 _2 h+ a. t; T3 Y; v6 e. q7 x4 c. G
    是這樣的~我前面是影像讀進來的資料~我要做一個3*3遮罩的 中值濾波器
# O3 \: ~8 ]9 ~" t; b   所以要將畫面中9個數值做排序後輸出中間的數值
+ w( |3 S& m1 B* c因為資料是不斷的進來(暫不考慮使用RAM處理),所以輸出中值的時間只允許1個CLK內完成
& `( B0 u# T- _: X大概是這樣子...0.0
4#
發表於 2010-4-6 14:12:39 | 只看該作者
首先看排序方法5 n4 K( h  A: x+ R& _8 [- \! u
再來看比較器有幾層,還有比較器的寬度
5#
發表於 2010-4-11 15:41:07 | 只看該作者
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案
8 n0 k" r- o: @( I+ x+ C8 Y至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了.
+ e8 r. F" S# ~
3 r0 N( ^; D8 q- x, i9 F+ N: X3 T舉個4進4出的例子:% ^% y  E; ^& \, F
input [word length] a[4];
9 l+ E- o3 r0 ureg [word length] b[4], c[4];0 O3 `" P( j8 X8 M
第一次排序& X  m8 R7 _& Y& c0 f4 U
b[0]=min(a[0], a[1]);" o/ c" H4 Q: c! t1 D7 g
b[1]=max(a[0], a[1]);
# \  i" V1 j" f2 Lb[2]=min(a[2], a[3]);
  k$ h; b! F/ b3 w. a1 F+ d  Db[3]=max(a[2], a[3]);
7 c0 y0 k3 J! o6 y# d第二次排序
$ Q! A9 z  m% _2 zc[0]=min(b[0], b[2]); //real minmum" L  ?: d5 H/ r8 e- e
c[1]=max(b[0], b[2]);& I9 |0 b! \* f7 g
c[2]=min(b[1], b[3]);5 v) T. G% g: U5 ?4 J
c[3]=max(b[1], b[3]);//real maximum
+ G  i0 s5 r0 j6 E' u8 f2 n第三次修正項# T# q8 Q  H* R5 K" L9 @/ F( ?
d[0]=c[0]; //real minmum
. f( W& A4 \& `$ s1 fd[1]=min(c[1], c[2]);
& c' j; e+ F3 o8 Xd[2]=max(c[1], c[2]);! T" `9 j) K3 a# o, I% n9 a, ]
d[3]=c[3];//real maximum: W* }% t  w' ^; P6 b
//d[0]~d[3]就是依序小到大的答案
" W- S& l6 v4 v1 `4 E7 S, a0 E/ v, [1 R
這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要)0 _2 E! B' K" X8 ?/ x: u

9 [1 V! P' L* ?) p3 L實做的考量
5 j3 l" n) F. `6 k) L1. 實做上min()跟max()應該是一起做的
! t4 w. P. R" _* I1 S if(a>b)) B: r( j. M- w6 X; P
     min = b;; G' X& V) }, Z7 j8 g0 k& a
     max = a;- d9 e" b+ A2 b# w( G8 b/ F8 N
  else
) o# z" v2 ]1 Q4 |    min = a;& _3 L" H# }. J* m& d" c) `
    max = b;
' k/ F4 W' z$ y/ }# I2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性.
7 s$ \5 @* i3 q5 m2 I0 a3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項.
5 t( ?! \3 G' Y: d  ^P.S. 用我的方法寫conference paper記得要掛我名字哦...XD
6#
 樓主| 發表於 2010-4-12 21:05:13 | 只看該作者
本帖最後由 呆頭鴨 於 2010-4-12 09:06 PM 編輯
; ]# Q) b+ h5 ]. y9 x* a: y
3 t( q! Y0 x( p2 s# ^) q. y回復 5# tommywgt
2 |8 ^3 G+ Z* J8 U: L- U: a9 a! T. C7 N( ]3 J2 u- s. }5 D

( J& ^- i" c8 V/ T' R& g    謝謝大大熱心分享, ]3 e4 f$ ^. y: Q. q: s
我目前的做法是這樣的,提出來給大家研究討論一下.....
" Z. j9 Q6 q* ?" z" H我將輸入的9筆資料 拆成3段來做 假設輸入是1~9 順序是 5 9 6 7 8 2 1 3 4( y- u9 |8 n5 E- d" `
則想像成 9 O1 ^# X/ W( i& x' u
5 9 6
$ S3 Q+ {" I$ F4 B( l& c7 8 26 P; U% X( T. {2 R. A! l, {
1 3 4% k' n7 ^& ^' ]$ d- S& B# q$ X
不過要先完成一個輸入 3筆資料 可以將之按大小排列輸出的小程式,這邊簡稱R9 D  @6 y4 c1 U
將3段數值分別丟入R 得到 ( _$ ^. P0 e& A: M
5 6 9
5 k- U' D3 i4 b; u2 v$ `2 7 8' w1 X1 ?, ~- N" m- p" `. j. I
1 3 4
) {* q$ j+ u' l; E這時候再將 垂直列的3筆丟入R可得到+ S. n6 ?: z$ w" ^  d: H1 H
1 2 5
5 y* G( T3 T! n/ H* a3 6 7
, Q5 Z: Z# E; ]# \: B2 e4 8 9  (這邊為了方便辨識 所以排橫的 值的橫的沒差@@)
& N; V$ J& o3 E5 `$ B4 V7 s- W' L2 E% _# F2 e6 y3 b4 e/ L& B: A% @
最後一步驟~將右上至左下的3筆資料丟入R 重新排列後再輸出~可得到$ @# x; n) ?3 Y! r$ p* S, k
1 2 4. }3 l; C- J9 u7 M
3 5 7
4 [3 S4 A, S6 v- D6 8 95 `3 {6 @. \0 Z! J6 v, s! d
這時候可以發現* U% R0 y/ F7 `3 {$ O2 d5 e
中間的數值確實是9筆資料按大小排列後的中值(5); Z& |& N6 S/ U9 ~) ], @! H
雖然其於8筆資料未必有造大小排列,不過目前測 中值的部份還沒算到有問題的...
7#
發表於 2010-4-12 22:31:10 | 只看該作者
啪啪啪: U& T/ a3 T6 I: K' _7 T! c$ @5 C
其實你的想法已經跟我的想法是一樣的了, 我想已經你知道我一開始講的那個方法的最大問題了
9 D% W( f. u0 i* |2 d4 i, N- @最大問題在於, 第二次的結果只保証最大值及最小值是對的, 對於修正項, 需要更多的運算
2 ^# l8 Q. T# w& `  z當亂度能包含所有的項時, 答案一定是對的; }  {3 d; K7 U5 o* b9 ]
所以關鍵就在於如何用最少的運算次數達到最大的亂度.! f+ X5 V5 Y9 i; Z  l3 \" X. r3 j, W
左上到右下不用再算的理由是, 左上一定是最小值, 右下一定是最大值, 所以根本不用算& x. n$ a/ ~& G8 X6 O+ j4 M) c  J( e% e, w
所以在最大的亂度中, 8-1=7次應是最多的運算了,
5 g% l9 x4 l$ I) j" `7 ~1 t7 m0 c/ ^7 D1 j% O4 o4 X
有人有更佳解嗎?
9#
 樓主| 發表於 2010-4-15 22:34:46 | 只看該作者
回復 8# kevin
  H& m7 \- G! q( v7 h& N. E. x3 B8 [; S

3 ^9 a: B5 H( P, _    大大的方法真不錯~ 我怎麼沒有想到呢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
1 J# W  B+ T9 b! m$ K, n* X% ^22排序 看起來是不錯的做法, 1 clock 即可做完.
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-5-15 01:01 AM , Processed in 0.131517 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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