Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

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

  [複製鏈接]
跳轉到指定樓層
1#
發表於 2010-3-31 22:43:39 | 只看該作者 回帖獎勵 |正序瀏覽 |閱讀模式
請問大大們~6 x+ Z& e4 N8 N# e# ?! {. F
我有9筆資料 同時輸入 A1~A9% n4 }  o2 @9 z& W
要如何設計才能達到按照數值大小排序輸出X1~X9
4 b/ X4 Q4 J) T- ^" X有辦法達到real time輸出嗎?
. ?0 Y' V) ]( J% H% p+ F還起大大們提點
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂3 踩 分享分享
推薦
發表於 2010-4-15 19:48:08 | 只看該作者
資料量少的話,用插入排序法則也不錯.
7 |' e9 e3 {4 B
" F" T. R" O2 ]  ~假設有九個registers,每個register附帶1個comparator,4 X1 ]/ P4 h& k9 z; x+ L: J) v- X
每個clk有一筆data input,每個register會比較input data 與 自己register 的值. 假設第n個register 為 Reg_n
# r9 r- y2 S( T/ [6 [+ p$ Uif (Reg(n) > Input_value)
. A; X. w3 p$ J* g* B) y3 R$ q
# N3 B7 h/ |# b' \       Reg(n) <= Reg(n);                   //保持原來的值
6 F5 U) f: V" j
( r8 e  Q& y8 T7 d+ j: Selse if ((Reg(n)<= In_value)&&( Reg(n-1)<= In_value))2 V1 b0 H. c6 m. f& C3 I

* |3 E( B( H/ E. R: ~1 T2 ?       Reg(n)  <= Reg(n-1);             //shift in 前一級的值7 B. s4 D& W: g1 l7 t+ R

0 g( D7 @' O7 L5 |2 qelse if ((Reg(n)<=In_value)&&( Reg(n-1)> In_value))
4 u& L" G2 `% X7 T' m     
; y) A+ H4 d0 i, C/ O5 G      Reg(n)  <=In_value;             //load input value
9 h( T2 e; s3 H$ b         
+ A- W2 ?8 i5 L; {& Q7 y0 o1 o每個clk 這些 registers array  都是排序好. 一直到最後的input結束,直接輸出第 Reg(5)即是 median value,再 reset all registers.

本帖子中包含更多資源

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

x
回復 支持 2 反對 0

使用道具 舉報

12#
發表於 2010-6-17 15:13:37 | 只看該作者
我覺得 對於3x3的median filter
7 q+ m7 c7 N$ H6 f4 _22排序 看起來是不錯的做法, 1 clock 即可做完.
11#
發表於 2010-4-19 20:39:23 | 只看該作者
沒聲大大, 其實大家都很棒啊.
10#
發表於 2010-4-16 09:18:15 | 只看該作者
桶米版大 真是太棒嚕
9#
 樓主| 發表於 2010-4-15 22:34:46 | 只看該作者
回復 8# kevin 0 s9 r3 R  G: s0 F3 G$ c: F

# D& c+ w; F/ E* q8 a2 Z; j" {4 B3 D
$ T- `8 B: o( X) O2 v# c, T    大大的方法真不錯~ 我怎麼沒有想到呢XD....
7#
發表於 2010-4-12 22:31:10 | 只看該作者
啪啪啪
) t( m' L: }7 q0 O8 L' I其實你的想法已經跟我的想法是一樣的了, 我想已經你知道我一開始講的那個方法的最大問題了
% E/ \  _. U' ?" E5 r3 b( F& O最大問題在於, 第二次的結果只保証最大值及最小值是對的, 對於修正項, 需要更多的運算+ c5 r6 _) }3 a& q+ b7 _
當亂度能包含所有的項時, 答案一定是對的
, E' q6 {4 D8 \所以關鍵就在於如何用最少的運算次數達到最大的亂度.
8 A+ n; P9 ~2 b% h, k左上到右下不用再算的理由是, 左上一定是最小值, 右下一定是最大值, 所以根本不用算$ X; P# j- `5 n
所以在最大的亂度中, 8-1=7次應是最多的運算了, ! p9 Z$ p6 c$ D, ?9 t

4 y$ H8 q0 x+ y9 d* \' Y: v有人有更佳解嗎?
6#
 樓主| 發表於 2010-4-12 21:05:13 | 只看該作者
本帖最後由 呆頭鴨 於 2010-4-12 09:06 PM 編輯 ' ~* ]1 o+ _1 S, B+ _9 S

* j; {- L. _! i* }' U+ b回復 5# tommywgt
7 m7 C+ ~- p  x( z
" F/ g$ h0 U6 F  F4 a4 I9 s7 h1 e, Q! k/ b, h" E2 U- J+ I& L
    謝謝大大熱心分享
9 i% p9 V2 ~$ ~( W; X3 s我目前的做法是這樣的,提出來給大家研究討論一下.....6 L) K9 |! @- d# n4 [% A6 R
我將輸入的9筆資料 拆成3段來做 假設輸入是1~9 順序是 5 9 6 7 8 2 1 3 4- F2 s" L# T! C5 S& m
則想像成 6 ~. R3 n. M1 O& v" O
5 9 6( K0 S% P1 f/ S0 Y4 q% W
7 8 2
' F& n# b9 `1 G+ U/ t- B+ ~1 3 4- t' ^; R% F; p, I! Q* D% s
不過要先完成一個輸入 3筆資料 可以將之按大小排列輸出的小程式,這邊簡稱R/ a. @6 s2 ]/ h1 I
將3段數值分別丟入R 得到 + T7 h: a% p. n' c$ p- J  n7 \
5 6 91 y9 k& C9 T$ Q7 w( C- W
2 7 8& I. Q7 z5 |0 K) b. p1 U* o& O
1 3 4
( h+ w0 a7 e8 E這時候再將 垂直列的3筆丟入R可得到% _* a) C$ V* v8 w; v9 i# z! m5 ~6 Y  ]
1 2 5  W2 m7 b2 U. A# y) i/ F
3 6 7& y( c8 ~: R6 q$ b, i
4 8 9  (這邊為了方便辨識 所以排橫的 值的橫的沒差@@)
: f; q% v- Z; [2 q9 {) Q6 r- e! E5 o( {# c" k* c# k: \
最後一步驟~將右上至左下的3筆資料丟入R 重新排列後再輸出~可得到
) w& m; V, v8 R  Q1 2 4
+ S6 {5 q* s* z- |1 ~% e3 5 7/ v' a" y! _! _5 }
6 8 9% _/ s' J# u; ]  r. p5 r
這時候可以發現
% h6 N: R7 K1 F1 N$ G$ W3 V3 y' d) i中間的數值確實是9筆資料按大小排列後的中值(5): q7 W% D. H  I
雖然其於8筆資料未必有造大小排列,不過目前測 中值的部份還沒算到有問題的...
5#
發表於 2010-4-11 15:41:07 | 只看該作者
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案
4 O" Q' K3 R" i- `( j至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了.
5 K/ F, g7 S6 U6 ?: ?3 t' s, }9 x# S& H
舉個4進4出的例子:# i2 |+ y) B* U- i$ W6 Q3 V
input [word length] a[4];
' k, ?0 y1 L0 j* _" r- Dreg [word length] b[4], c[4];
" }, L8 n- [2 z) c+ V, B9 D第一次排序
- G7 Q& X  ?/ a  ib[0]=min(a[0], a[1]);8 I+ b" c/ \$ X9 `# }% s7 G
b[1]=max(a[0], a[1]);
9 H  Q1 L  n- ~% Z# y- R8 rb[2]=min(a[2], a[3]);
. p: g* d: L6 D, |1 I% Ob[3]=max(a[2], a[3]);7 u* t. U+ o5 W
第二次排序
2 b7 w/ C6 a# Y3 x* [) ^4 w8 E1 bc[0]=min(b[0], b[2]); //real minmum
9 A) i& f8 P0 B: w9 R6 Z# rc[1]=max(b[0], b[2]);$ m" s) l0 r( z
c[2]=min(b[1], b[3]);
, T1 o# d" Z+ A4 h$ {) V' N& Dc[3]=max(b[1], b[3]);//real maximum
* S3 W$ s6 M& T4 A第三次修正項
% A5 D$ ~- H/ i1 G  Xd[0]=c[0]; //real minmum
. }/ Q- o& Z: J6 ~/ dd[1]=min(c[1], c[2]);
* b" n. u) N" L9 @/ P, {d[2]=max(c[1], c[2]);4 Y6 @) @& [3 v, E1 O" E1 I
d[3]=c[3];//real maximum# i* s8 X& T+ {- G3 J6 c
//d[0]~d[3]就是依序小到大的答案* s. o# F9 H# y
8 b" V, {: t! r9 D  f; b( ]! b% Z
這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要)9 u  {8 ^  W* n
/ O- c; h: g: @- S8 h0 Z3 Z) J9 B
實做的考量
0 P. f0 d; ]7 ]7 ~& E6 E( h! T% S1. 實做上min()跟max()應該是一起做的3 L( [  ^# v# v1 g' T; K# x* D# t
if(a>b)
5 o: x( f, U+ Q; a- Z     min = b;
9 V# I) z0 f7 Q/ r     max = a;
; M1 X) L- k7 u; r( ~% N  else
. n1 U4 W1 c- j, S0 O    min = a;
0 N9 d. A: X/ g" i! N    max = b;
* U* `4 Y6 _, ^/ `! k2 G" `) D2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性.7 f' r% C$ p. }/ V5 H) _8 c
3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項.
8 K$ |# o: Z2 K, o6 q& o3 l2 c& LP.S. 用我的方法寫conference paper記得要掛我名字哦...XD
4#
發表於 2010-4-6 14:12:39 | 只看該作者
首先看排序方法$ U. H% \. p* X2 L+ R. ]/ n: M
再來看比較器有幾層,還有比較器的寬度
3#
 樓主| 發表於 2010-4-5 21:41:38 | 只看該作者
回復 2# kokonut
& q. J2 _% D; R: o" p+ j- t' r- H6 g1 g, x3 ~) b; f
' w& f* d/ L, L! |' ~" _
    是這樣的~我前面是影像讀進來的資料~我要做一個3*3遮罩的 中值濾波器
) K0 u/ v% k- z   所以要將畫面中9個數值做排序後輸出中間的數值
/ U) o) @- [# \2 ^* J. F% H因為資料是不斷的進來(暫不考慮使用RAM處理),所以輸出中值的時間只允許1個CLK內完成, A9 j: H1 E7 k4 y
大概是這樣子...0.0
2#
發表於 2010-4-5 16:30:41 | 只看該作者
你把A1~A9吃進來後~要先排序處理吧~
6 W0 w* {1 L6 N8 p# ?9 q; t. M. z% X6 S. Y" E6 I6 X) r
至於你real time輸出~不太懂你要表達意思~: B3 t5 w1 D& h* v3 R2 }- Y' V9 t

$ k' Z+ S* \1 G6 J0 U你可以把你整個架構描述完整點$ v( U' c+ |7 I1 o+ s3 W

% i% x4 f/ ?2 R2 ~7 a這樣比較好給意見~!!!
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-6-8 05:31 PM , Processed in 0.206526 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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