Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

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

  [複製鏈接]
跳轉到指定樓層
1#
發表於 2010-3-31 22:43:39 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
請問大大們~( B1 K3 Z. Q6 }6 w9 L7 E7 Q4 h
我有9筆資料 同時輸入 A1~A9' E- p/ v3 {1 S4 Y5 e2 Z. _$ H2 a, E
要如何設計才能達到按照數值大小排序輸出X1~X9$ z; E* T* S# p8 C  _
有辦法達到real time輸出嗎?
' {8 q$ e, I8 ~- y  K7 p還起大大們提點
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂3 踩 分享分享
推薦
發表於 2010-4-15 19:48:08 | 只看該作者
資料量少的話,用插入排序法則也不錯.
( B  R, @5 g* I
+ ^5 C' [) M. o" G2 ~. E7 D  b假設有九個registers,每個register附帶1個comparator,( o( r4 ?2 I  N* D/ H$ e' S& W
每個clk有一筆data input,每個register會比較input data 與 自己register 的值. 假設第n個register 為 Reg_n
; E! Q7 r/ g  k4 t8 dif (Reg(n) > Input_value) & E/ b3 R0 n2 L9 O! }
5 j$ l4 \4 ]+ {* N
       Reg(n) <= Reg(n);                   //保持原來的值. ?! W( y1 I- N( |' N7 q
9 z: {# O& s0 R+ _* r, q
else if ((Reg(n)<= In_value)&&( Reg(n-1)<= In_value))0 r: f4 h9 R* `( v

# b- l& K1 h* i, q$ P+ _. N  Y       Reg(n)  <= Reg(n-1);             //shift in 前一級的值& q4 B+ [' F; W% m3 h2 X6 j

: M& z# m% I+ [9 R( O6 l( E! xelse if ((Reg(n)<=In_value)&&( Reg(n-1)> In_value))9 J5 K( U& f' T0 a* I# C/ `/ _4 u+ C6 {
     / A! A- y* M4 \
      Reg(n)  <=In_value;             //load input value
7 x3 `% n) |1 p         
* s+ H- V8 ^# A# `3 ^" O! ?- x每個clk 這些 registers array  都是排序好. 一直到最後的input結束,直接輸出第 Reg(5)即是 median value,再 reset all registers.

本帖子中包含更多資源

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

x
回復 支持 2 反對 0

使用道具 舉報

2#
發表於 2010-4-5 16:30:41 | 只看該作者
你把A1~A9吃進來後~要先排序處理吧~
8 t3 Y' T; c+ w, J. s0 X  z
  X: h7 t* ^1 |5 [3 I至於你real time輸出~不太懂你要表達意思~2 p. f: `6 }" x5 Z9 }0 c

4 ]; l2 i& ]2 x2 T: n你可以把你整個架構描述完整點
/ h* C, O3 b$ O9 V5 N% T
) L1 U; f+ M& `* J) n, `這樣比較好給意見~!!!
3#
 樓主| 發表於 2010-4-5 21:41:38 | 只看該作者
回復 2# kokonut
# @  a- r% g- I
! k" p/ s( W2 u5 K, `# i2 L: w$ e! a
/ ^/ [% ]/ Y+ Q4 E* f    是這樣的~我前面是影像讀進來的資料~我要做一個3*3遮罩的 中值濾波器
; X$ a4 P+ M& O+ t. c   所以要將畫面中9個數值做排序後輸出中間的數值9 J- a( I" ~: B6 N
因為資料是不斷的進來(暫不考慮使用RAM處理),所以輸出中值的時間只允許1個CLK內完成8 |% c- k' x  N. q* d
大概是這樣子...0.0
4#
發表於 2010-4-6 14:12:39 | 只看該作者
首先看排序方法* [7 V' O1 \! f' T# b
再來看比較器有幾層,還有比較器的寬度
5#
發表於 2010-4-11 15:41:07 | 只看該作者
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案
$ Y4 W3 c& C; E% J* U1 A至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了.
; v/ ]% c# N8 o% B+ P
' V1 x8 F  f1 k' f, J舉個4進4出的例子:! m5 [" ]' Z; I" M
input [word length] a[4];
+ B! s) W0 L9 v% r4 i6 o8 B$ Ereg [word length] b[4], c[4];1 b6 N, g& R. [" F9 q1 X
第一次排序& ^& n! }" a! s0 w
b[0]=min(a[0], a[1]);
# C$ N! ~8 U0 Ub[1]=max(a[0], a[1]);; z0 a* H7 R/ c& s* n0 @
b[2]=min(a[2], a[3]);7 }/ _) ]/ Z3 V1 p: Q% q5 E
b[3]=max(a[2], a[3]);
5 P6 [9 ?" F- X: e0 y第二次排序: f, s  c4 H9 o! W# g0 O
c[0]=min(b[0], b[2]); //real minmum- X9 R2 v4 }0 P- ~" w
c[1]=max(b[0], b[2]);
* B* q: Z6 l* R/ k8 U, J1 Dc[2]=min(b[1], b[3]);
1 o8 z0 k9 a1 o: X3 l6 G, t7 Ic[3]=max(b[1], b[3]);//real maximum
/ Q. C/ a4 e) K1 Z0 n第三次修正項: e& J& Q# h* ?* b  C
d[0]=c[0]; //real minmum+ j0 n4 n9 t2 Z: H& L
d[1]=min(c[1], c[2]);
7 t/ j9 e- }4 Yd[2]=max(c[1], c[2]);' x* A' X. h% H1 C
d[3]=c[3];//real maximum
+ Z1 L1 v0 Y! U* ]//d[0]~d[3]就是依序小到大的答案
( \. \8 Y' o9 T# L* T* Y; A; u" N! j0 N, a
這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要)
+ e# C4 t/ S# U. V
0 i. V/ y1 N& m, r3 s實做的考量
) d0 E: f/ ~, I. U3 u+ ^1. 實做上min()跟max()應該是一起做的
, B  W. N  N' z if(a>b)* i' y9 C7 n  c& F" c& R
     min = b;
# P5 q0 w4 {/ M8 q  b0 J- t, X     max = a;
* e: ?8 b0 r& Z- |  else- r7 f  g& S( b0 x$ y* J0 ?' v' r" k
    min = a;) U4 {% L( S5 `. q# j4 d) |3 U
    max = b;
+ X3 b$ M7 T4 B9 L2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性.
  s$ ^, @2 n" n3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項.
8 {+ L; Y% S! ?0 i; @. eP.S. 用我的方法寫conference paper記得要掛我名字哦...XD
6#
 樓主| 發表於 2010-4-12 21:05:13 | 只看該作者
本帖最後由 呆頭鴨 於 2010-4-12 09:06 PM 編輯 3 d! v- j5 ^2 e. x' \3 s
8 M2 c) X5 ~# ]
回復 5# tommywgt
5 m6 f" t/ [. r" B- F
& K4 P3 u/ r: c# ^
* B+ M( V; A8 [) @    謝謝大大熱心分享+ T/ b& a/ X3 e; }( F0 {, }
我目前的做法是這樣的,提出來給大家研究討論一下.....  N3 n' p5 ?" N; ^& w3 ~9 }6 W
我將輸入的9筆資料 拆成3段來做 假設輸入是1~9 順序是 5 9 6 7 8 2 1 3 4
% y+ i4 T/ }+ t- A) ]則想像成
  l1 a' N' l  Z; X: H% b! r& u. E5 9 6
" B' W% l  l) q( j/ K: y7 8 2
- q  W% m# n4 y; B9 l& S1 3 4
  p, E! e4 m! P, V8 F, D不過要先完成一個輸入 3筆資料 可以將之按大小排列輸出的小程式,這邊簡稱R  V* A! B; F. X# w
將3段數值分別丟入R 得到
! _' {' J8 T( a& ~+ Q5 6 9: G+ Z# q! a2 J$ T) i' W
2 7 87 ?+ Q/ P6 y) P$ a; z: A
1 3 4
: x+ e. S9 V1 @這時候再將 垂直列的3筆丟入R可得到
, \1 p8 P7 R7 d1 R- ~4 n1 2 5
  n& ~( d- j% j, o5 _' N3 6 7
' _* o2 K, e. T, Z4 8 9  (這邊為了方便辨識 所以排橫的 值的橫的沒差@@)
4 g2 ?$ X6 m" f0 _3 n9 B% s# n1 b, W+ v) p/ b* ~7 v! A
最後一步驟~將右上至左下的3筆資料丟入R 重新排列後再輸出~可得到
2 w2 K8 t# U" {$ y& @( ~) A- k1 2 4; I! d, V8 N+ c! Q
3 5 7
( ?) Z2 D* s, W4 |: Y6 8 9
( k8 `6 J# y( S7 V6 D" S6 F這時候可以發現' B& v- j; [2 w& _7 V6 Z
中間的數值確實是9筆資料按大小排列後的中值(5)
+ L- U$ p1 ~* ?' k0 }0 ?4 P+ p雖然其於8筆資料未必有造大小排列,不過目前測 中值的部份還沒算到有問題的...
7#
發表於 2010-4-12 22:31:10 | 只看該作者
啪啪啪0 l; h! a9 K% l( e  I: d- v6 g/ V
其實你的想法已經跟我的想法是一樣的了, 我想已經你知道我一開始講的那個方法的最大問題了
+ a1 v( h' j% i% }+ l( Q最大問題在於, 第二次的結果只保証最大值及最小值是對的, 對於修正項, 需要更多的運算: d3 ~. I% }" `* ^) M
當亂度能包含所有的項時, 答案一定是對的3 s8 `6 L& S, s
所以關鍵就在於如何用最少的運算次數達到最大的亂度.
1 C( b2 U, x' P+ `左上到右下不用再算的理由是, 左上一定是最小值, 右下一定是最大值, 所以根本不用算( Z/ K- _7 U0 e  O* `- e1 q- H
所以在最大的亂度中, 8-1=7次應是最多的運算了, : p# Y; l* F; B( ?. G" \- C1 t

$ D, D0 z( z: W" z( w) R" u有人有更佳解嗎?
9#
 樓主| 發表於 2010-4-15 22:34:46 | 只看該作者
回復 8# kevin % ?1 f/ J. M# ]( v

+ k1 o/ u1 u& k; ~3 I+ W; H/ P8 [: h& t- s  [7 o
    大大的方法真不錯~ 我怎麼沒有想到呢XD....
10#
發表於 2010-4-16 09:18:15 | 只看該作者
桶米版大 真是太棒嚕
11#
發表於 2010-4-19 20:39:23 | 只看該作者
沒聲大大, 其實大家都很棒啊.
12#
發表於 2010-6-17 15:13:37 | 只看該作者
我覺得 對於3x3的median filter6 a6 s) a+ L- |" T: j( j6 u
22排序 看起來是不錯的做法, 1 clock 即可做完.
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-4-26 04:55 PM , Processed in 0.122007 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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