Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

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

  [複製鏈接]
跳轉到指定樓層
1#
發表於 2010-3-31 22:43:39 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
請問大大們~, M4 E9 q3 f: w% j
我有9筆資料 同時輸入 A1~A9$ c9 h" g6 m1 P  N5 e; k. N
要如何設計才能達到按照數值大小排序輸出X1~X96 i7 w$ ]6 u. |
有辦法達到real time輸出嗎?1 A0 \8 v+ V" n
還起大大們提點
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂3 踩 分享分享
推薦
發表於 2010-4-15 19:48:08 | 只看該作者
資料量少的話,用插入排序法則也不錯.
" {- r% |+ E# ~* R1 t, a7 l' z% \6 f0 G
假設有九個registers,每個register附帶1個comparator,
; [% K# a% \- _4 x: o/ R, [每個clk有一筆data input,每個register會比較input data 與 自己register 的值. 假設第n個register 為 Reg_n+ u& M- N( x7 i) U! C7 p
if (Reg(n) > Input_value) 9 V( \5 a2 E5 ~& X. I# D0 e% }

7 z& c3 J) c; h4 j1 ^# Z) J& G. J       Reg(n) <= Reg(n);                   //保持原來的值
1 i6 O& a; v$ o6 U7 ?
0 E- V! ?( t, R$ I4 }7 felse if ((Reg(n)<= In_value)&&( Reg(n-1)<= In_value))1 y, O+ a% L, R
# |& k# E/ y" c& D
       Reg(n)  <= Reg(n-1);             //shift in 前一級的值0 W8 m4 y/ [6 M1 {

8 {. h& W" O2 k* a1 ielse if ((Reg(n)<=In_value)&&( Reg(n-1)> In_value))5 S4 t. U- S2 J
     
. q9 v* p; u; Z2 z      Reg(n)  <=In_value;             //load input value
) i+ T$ t8 k7 y: ?         
6 Q/ m+ o6 l$ l7 ~' E- r+ |每個clk 這些 registers array  都是排序好. 一直到最後的input結束,直接輸出第 Reg(5)即是 median value,再 reset all registers.

本帖子中包含更多資源

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

x
回復 支持 2 反對 0

使用道具 舉報

2#
發表於 2010-4-5 16:30:41 | 只看該作者
你把A1~A9吃進來後~要先排序處理吧~
: U9 W) \5 Z' U; v/ B
% ^: H7 C' C& P. q% U0 p至於你real time輸出~不太懂你要表達意思~" b$ |6 K0 t; [/ f. f9 y; u& r  k/ j

/ G  }# G7 k+ a! J你可以把你整個架構描述完整點
4 L7 H" [' |0 a; k
3 d0 n/ W7 I* O# t! m. h$ J這樣比較好給意見~!!!
3#
 樓主| 發表於 2010-4-5 21:41:38 | 只看該作者
回復 2# kokonut   U7 b& o: c- _7 {/ V4 z% x
4 |$ o& ^3 s- \  F# o- s

3 p0 U$ D# J* G3 i    是這樣的~我前面是影像讀進來的資料~我要做一個3*3遮罩的 中值濾波器 ! y. ^8 r$ e, k  a: B& g. x6 h( ?/ J
   所以要將畫面中9個數值做排序後輸出中間的數值
* v9 d- }# Q: `, Y0 f# J2 B( v1 V因為資料是不斷的進來(暫不考慮使用RAM處理),所以輸出中值的時間只允許1個CLK內完成0 O4 h# M; Z: |# N
大概是這樣子...0.0
4#
發表於 2010-4-6 14:12:39 | 只看該作者
首先看排序方法) f; |" d$ V4 s4 e
再來看比較器有幾層,還有比較器的寬度
5#
發表於 2010-4-11 15:41:07 | 只看該作者
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案6 r2 t, H" L  V, i
至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了.
7 t# L; E7 h& ~& [) q4 F$ P
- A$ ^7 y+ q5 f, p& z! ~- _舉個4進4出的例子:
+ ]. h7 k" }- [! T; o* [) \2 Pinput [word length] a[4];+ i+ h- a" A+ p9 r# f+ s* {/ k
reg [word length] b[4], c[4];0 V' l$ B7 u) D
第一次排序
, y& c$ ~" u% u6 v& _( r/ [  Qb[0]=min(a[0], a[1]);
5 M. M" w2 Q0 Ob[1]=max(a[0], a[1]);
: z! A( d& E/ S; n$ C. d' Zb[2]=min(a[2], a[3]);
3 b! |, d7 V& o5 Y4 @! ^9 pb[3]=max(a[2], a[3]);
5 f/ V. h3 p+ S- @第二次排序
8 F6 y0 f- p) e+ e2 lc[0]=min(b[0], b[2]); //real minmum- c- b' l7 ?. i. W$ a
c[1]=max(b[0], b[2]);
+ w; G3 a9 w7 w! P4 ], Ac[2]=min(b[1], b[3]);
6 i7 E8 C! q& Q/ w3 H$ Nc[3]=max(b[1], b[3]);//real maximum
" p& ^  \1 D- K1 U第三次修正項
, Q9 K# g9 Q" B: ~1 z1 S% h, Bd[0]=c[0]; //real minmum
4 f& q/ ?* @% p) ], b' bd[1]=min(c[1], c[2]);
  i/ h: k% K" ?: sd[2]=max(c[1], c[2]);
, U: q$ K. H, c& \' [. k! m$ Bd[3]=c[3];//real maximum) A6 s* k6 Z% s% `" o  t7 L
//d[0]~d[3]就是依序小到大的答案
: }9 M$ E5 ^. M% S2 ^' `. c2 I6 \/ A& A/ g, O2 Z; F
這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要)
% g5 f  c2 u/ N( ]
+ e4 @7 `& b# {: V實做的考量
. ]9 |* n4 l+ c1. 實做上min()跟max()應該是一起做的: F3 ~* U$ @; e9 E4 R, B
if(a>b)- W1 \; \$ B0 _: t2 n, N
     min = b;' A' f7 E! g& G% i- s
     max = a;  J, ^& w" H4 k2 F3 ]1 I# X
  else+ F7 D; }" ^( j9 {! s
    min = a;
: M+ s, O8 q; n: x5 w  U8 R9 T! d    max = b;
& E7 D2 V+ K" ?' {4 I2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性.; v/ ^' e* w2 r* _! P, g) T8 h: h; ?
3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項.
+ d1 N. V5 R: ~% t5 VP.S. 用我的方法寫conference paper記得要掛我名字哦...XD
6#
 樓主| 發表於 2010-4-12 21:05:13 | 只看該作者
本帖最後由 呆頭鴨 於 2010-4-12 09:06 PM 編輯 7 S/ M; ?/ @6 X
$ j& Y! ~3 M7 X: H. b( }+ J+ S0 c: y
回復 5# tommywgt + A$ R& n/ h: X7 Z2 m( p8 `; r- a

4 q, A  p& S, V# n
5 K# O1 b/ v8 ^    謝謝大大熱心分享
$ P7 o' Z) |5 [& @, h  W" D* T我目前的做法是這樣的,提出來給大家研究討論一下.....
- q% s& R  o+ b& D* a* d我將輸入的9筆資料 拆成3段來做 假設輸入是1~9 順序是 5 9 6 7 8 2 1 3 4
; s' P) @. t, `3 |3 A3 ~則想像成
3 k/ I* Y6 }% Z+ N" y3 x5 9 6
, n8 i1 T$ Q9 O6 y7 }& l) [+ o( A7 8 2, a4 U# M% X( S& H& w+ y7 g
1 3 4
+ z) h$ D/ Z* K不過要先完成一個輸入 3筆資料 可以將之按大小排列輸出的小程式,這邊簡稱R
& R3 o0 E! y0 E. L將3段數值分別丟入R 得到   Z4 _) Z, C3 O0 S) Q& L( m) j
5 6 9
: o  k0 ~' \) M9 v/ m4 V, B7 q2 7 8' q; N, p& D: T$ M
1 3 4
' R  G! P/ N# `這時候再將 垂直列的3筆丟入R可得到
6 {% _$ n% c( r5 P  a% \+ v7 W1 2 5
& L( @3 ^/ G( x7 m8 K/ g3 6 7- M+ z- y! k3 Y: ?8 ^: E& I
4 8 9  (這邊為了方便辨識 所以排橫的 值的橫的沒差@@)
9 i- p8 l4 Z: J. G* N+ Q/ Y: l5 V; G! J
最後一步驟~將右上至左下的3筆資料丟入R 重新排列後再輸出~可得到& u/ B$ s4 t) ?" m
1 2 4- S3 b3 l. b" f; C
3 5 7
; T2 K2 w; }* _6 8 9
, @0 g" c  @$ ?" `: T$ s+ L這時候可以發現4 x9 z1 \; `- i  A
中間的數值確實是9筆資料按大小排列後的中值(5)# G' d/ S; N: n; E& |- y7 ?
雖然其於8筆資料未必有造大小排列,不過目前測 中值的部份還沒算到有問題的...
7#
發表於 2010-4-12 22:31:10 | 只看該作者
啪啪啪4 m- R3 T% x5 G  g  |: }
其實你的想法已經跟我的想法是一樣的了, 我想已經你知道我一開始講的那個方法的最大問題了
  [% V! [; {, u: r7 f9 d4 e9 E3 ^最大問題在於, 第二次的結果只保証最大值及最小值是對的, 對於修正項, 需要更多的運算
9 Z' J; f+ m% k% c當亂度能包含所有的項時, 答案一定是對的: S5 s) t0 B  @0 N+ ~2 h) G! ?( b
所以關鍵就在於如何用最少的運算次數達到最大的亂度./ S6 t6 U; c# F; a2 f
左上到右下不用再算的理由是, 左上一定是最小值, 右下一定是最大值, 所以根本不用算
3 t  E0 j+ h; K! ~; D% K所以在最大的亂度中, 8-1=7次應是最多的運算了, ' g) \; Y* {5 T: @( m
& a( C2 ]. ?; ]' x
有人有更佳解嗎?
9#
 樓主| 發表於 2010-4-15 22:34:46 | 只看該作者
回復 8# kevin + ^* Z4 H: E" Y% F2 c

2 m% q( C- M/ u5 Q8 f$ I7 ~0 \3 N2 a  p3 S% }
    大大的方法真不錯~ 我怎麼沒有想到呢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
  B7 Z1 e' u" B3 v: |9 l22排序 看起來是不錯的做法, 1 clock 即可做完.
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-11-16 12:01 PM , Processed in 0.180010 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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