Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

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

  [複製鏈接]
跳轉到指定樓層
1#
發表於 2010-3-31 22:43:39 | 只看該作者 回帖獎勵 |正序瀏覽 |閱讀模式
請問大大們~+ ]' S9 M; C( ?, b; a8 z! j* _& x
我有9筆資料 同時輸入 A1~A95 c3 Y4 T% j' P( ?. [
要如何設計才能達到按照數值大小排序輸出X1~X9
+ A$ `0 J* R3 ?% i有辦法達到real time輸出嗎?, H2 J1 Q; Z& g
還起大大們提點
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂3 踩 分享分享
推薦
發表於 2010-4-15 19:48:08 | 只看該作者
資料量少的話,用插入排序法則也不錯.
3 ^: P6 t" O6 A5 h
2 X2 q9 g, w/ Y. \假設有九個registers,每個register附帶1個comparator,) t2 c: E. x+ t
每個clk有一筆data input,每個register會比較input data 與 自己register 的值. 假設第n個register 為 Reg_n: h3 H8 B5 L: L' b
if (Reg(n) > Input_value)
- b; P) M" l, W6 D- J% g# K9 l- |* J* I7 R! [: i
       Reg(n) <= Reg(n);                   //保持原來的值* f4 i. D6 ?: ]6 f8 A0 f

% F: H5 J& r, M  c4 S5 oelse if ((Reg(n)<= In_value)&&( Reg(n-1)<= In_value))& `  m: n; l3 G- Q( U& l8 c( _0 x* e7 `
6 ?; q0 q  }8 U" C2 r1 H
       Reg(n)  <= Reg(n-1);             //shift in 前一級的值
# w) @+ |# e1 L: v" D2 O
: x' r- X5 H" }( @8 y$ Felse if ((Reg(n)<=In_value)&&( Reg(n-1)> In_value))  G4 U, W/ z2 \% v' S2 G( t
     3 s" d4 R; \2 J+ X( o. Q& Y! w* C: J
      Reg(n)  <=In_value;             //load input value" R: J7 y/ R' i
         
8 [5 h) J% o9 v$ w7 z每個clk 這些 registers array  都是排序好. 一直到最後的input結束,直接輸出第 Reg(5)即是 median value,再 reset all registers.

本帖子中包含更多資源

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

x
回復 支持 2 反對 0

使用道具 舉報

12#
發表於 2010-6-17 15:13:37 | 只看該作者
我覺得 對於3x3的median filter
5 q$ P1 @( m8 V% y1 S! c2 I5 F22排序 看起來是不錯的做法, 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 N% e6 X# R- v* ^

# S1 \) H3 Q3 L) j3 o. I& q' _' V  B
    大大的方法真不錯~ 我怎麼沒有想到呢XD....
7#
發表於 2010-4-12 22:31:10 | 只看該作者
啪啪啪
! A, b" x) S2 }5 ?3 ^' _4 k其實你的想法已經跟我的想法是一樣的了, 我想已經你知道我一開始講的那個方法的最大問題了
7 B& j5 k' ~5 s" a最大問題在於, 第二次的結果只保証最大值及最小值是對的, 對於修正項, 需要更多的運算
9 q* a. D- m/ S" h8 E當亂度能包含所有的項時, 答案一定是對的9 L; C+ P. |  {0 D# V8 a8 a3 K
所以關鍵就在於如何用最少的運算次數達到最大的亂度.
. L& B3 z$ _2 f0 [; D5 z! R. [左上到右下不用再算的理由是, 左上一定是最小值, 右下一定是最大值, 所以根本不用算/ i+ G, F3 G  t+ w- U6 k4 Z
所以在最大的亂度中, 8-1=7次應是最多的運算了, / d+ k2 c8 b# B6 `, [* Z

9 w9 N: E6 ?0 \8 v有人有更佳解嗎?
6#
 樓主| 發表於 2010-4-12 21:05:13 | 只看該作者
本帖最後由 呆頭鴨 於 2010-4-12 09:06 PM 編輯
2 v5 m5 r" u3 y; D
8 R% k  \) N# }! n- ^" N2 C5 K5 i回復 5# tommywgt
5 {5 a4 m7 v/ T" Q: c, `9 x! T1 O; q" A2 E
+ S4 A( q0 k) p& v
    謝謝大大熱心分享
4 Y: `/ A4 E+ T6 W  y* }我目前的做法是這樣的,提出來給大家研究討論一下.....9 e" w9 s" l: G
我將輸入的9筆資料 拆成3段來做 假設輸入是1~9 順序是 5 9 6 7 8 2 1 3 47 F+ F# v) j6 O' }$ o, S5 Q
則想像成
4 z& ~! u: k' A7 f5 9 6
, p. v9 h; E! y7 8 2
4 s5 ?/ q1 s1 B- z) ~4 Q. h" I/ G9 l1 3 4
% C) v& r  v* ^5 [# K3 V3 ]! H2 n不過要先完成一個輸入 3筆資料 可以將之按大小排列輸出的小程式,這邊簡稱R6 F1 l% o- u$ Q' v4 x3 d3 ~' j
將3段數值分別丟入R 得到 2 Y/ E3 W, t* d2 H; a$ g' \* o2 ]! z
5 6 9
- n! T7 @' \. b9 Q5 l+ T7 t5 }& L2 7 8
% a9 {* Y; y7 ]: }1 3 4
/ R* H+ C; i4 c  U* y: L5 U這時候再將 垂直列的3筆丟入R可得到" }3 r8 L/ m% ~' o  u$ k) N
1 2 5' z8 x4 z4 @& V+ \: c. F
3 6 7( d3 \! F5 @. @9 W- o
4 8 9  (這邊為了方便辨識 所以排橫的 值的橫的沒差@@)
8 [1 ]) z: s$ z1 Q' j; R. L8 A- w9 C, Q9 G& x. v5 q* V
最後一步驟~將右上至左下的3筆資料丟入R 重新排列後再輸出~可得到2 C7 m( r% L3 [# f
1 2 45 W' A5 s5 z+ P7 g
3 5 7, W  |' b* R: k" V
6 8 9
, v9 S5 E' g* S( R8 O這時候可以發現
  w  b9 _1 a5 s6 i5 R中間的數值確實是9筆資料按大小排列後的中值(5)
9 k# N1 I6 W5 a% T: e( `雖然其於8筆資料未必有造大小排列,不過目前測 中值的部份還沒算到有問題的...
5#
發表於 2010-4-11 15:41:07 | 只看該作者
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案
9 w) s9 \8 ]: ?% ~至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了.
- m: b4 V5 {) d' v) ~: l# D/ x  A, x' X! T  a* u3 }: b
舉個4進4出的例子:; Y( c, K8 i+ M% [  k
input [word length] a[4];
( |4 \6 V8 p, f# v2 Z5 I4 Freg [word length] b[4], c[4];/ Y9 }# l. z1 }6 U
第一次排序" o; e- O5 D. {$ l# E' ], F- `
b[0]=min(a[0], a[1]);
  `% Q" A0 i% Z3 Q. x3 _0 a: \# zb[1]=max(a[0], a[1]);/ t/ Q; S2 S0 u3 t
b[2]=min(a[2], a[3]);* o. S4 y- V2 n6 ?
b[3]=max(a[2], a[3]);
5 D, i; d* e; L1 r4 m. C/ L$ [第二次排序
0 ?& G$ K8 n- p) lc[0]=min(b[0], b[2]); //real minmum  J6 s1 i; A' ?3 ^  O
c[1]=max(b[0], b[2]);7 y" t& F6 ~* S( F& n
c[2]=min(b[1], b[3]);4 t, @0 ?% a- `% ]3 v6 y
c[3]=max(b[1], b[3]);//real maximum; F- a4 Z3 m" C" j8 w
第三次修正項9 R* Y/ I, S; B8 W- ?4 P+ y
d[0]=c[0]; //real minmum3 O2 E8 ]* a! x" |7 {' D
d[1]=min(c[1], c[2]);
' w# y5 `6 R5 }0 v7 i( sd[2]=max(c[1], c[2]);% \1 y$ D4 L- G) h( C' T
d[3]=c[3];//real maximum
$ t2 R9 _4 z( @: h; u//d[0]~d[3]就是依序小到大的答案
' j3 U( J+ V, s, k3 V- r5 G( ~8 ~, o& V- t, Q; o
這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要)( O2 D0 }0 p& h

. R. a! r% j8 d2 u% G1 S4 F' o實做的考量
9 W) B3 U" `. m' S9 N: U; B9 x. |1. 實做上min()跟max()應該是一起做的
& o1 Z" c! K7 q! G+ z& K if(a>b)7 k( J3 D6 `. T* f, G
     min = b;! \+ W( G- l7 x0 `6 n, _6 S
     max = a;. a+ i: Q+ T! b3 k$ j9 @7 `0 V
  else/ r3 c$ V) g/ I
    min = a;" p4 E$ z$ a! b3 [
    max = b;
' y" S$ K" N  h4 ~' F' Y2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性.( A; X% [2 J6 J% y* o/ C6 W
3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項.8 E* [4 Z/ ^; k! G. t
P.S. 用我的方法寫conference paper記得要掛我名字哦...XD
4#
發表於 2010-4-6 14:12:39 | 只看該作者
首先看排序方法) a% X; K/ [( N; }$ Z4 w) b( g& ?
再來看比較器有幾層,還有比較器的寬度
3#
 樓主| 發表於 2010-4-5 21:41:38 | 只看該作者
回復 2# kokonut
& D7 [" a/ B% k8 o8 G% J
7 t8 x) Z9 z. K8 z, @! m# U3 Z( U" x2 ^# J' d
    是這樣的~我前面是影像讀進來的資料~我要做一個3*3遮罩的 中值濾波器 : t0 B/ p; e: ~' L  l: \) [
   所以要將畫面中9個數值做排序後輸出中間的數值2 S& P5 Q9 ?# t( B% ^+ ]5 G$ J
因為資料是不斷的進來(暫不考慮使用RAM處理),所以輸出中值的時間只允許1個CLK內完成
. x# f% K8 ?# t6 H/ i大概是這樣子...0.0
2#
發表於 2010-4-5 16:30:41 | 只看該作者
你把A1~A9吃進來後~要先排序處理吧~) {/ f$ Q$ i) @7 z% h& m+ z

3 s/ ]# j( r" q* V9 h至於你real time輸出~不太懂你要表達意思~
1 Z( e% U5 k- d) g* Z- K+ B
) [( D- n( H; y' ]你可以把你整個架構描述完整點
8 y! K( {2 Q( i; Q& e
$ ^  J) ^! R3 u: y! L1 q這樣比較好給意見~!!!
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-5-7 08:17 AM , Processed in 0.118007 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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