Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

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

  [複製鏈接]
跳轉到指定樓層
1#
發表於 2010-3-31 22:43:39 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
請問大大們~
5 y9 t0 c7 g' O4 o$ N9 o7 b我有9筆資料 同時輸入 A1~A9) i  s5 L8 S3 L9 O
要如何設計才能達到按照數值大小排序輸出X1~X97 O3 r; t2 H$ Z- a
有辦法達到real time輸出嗎?
/ L' L4 {# i; \) H% T' \還起大大們提點
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂3 踩 分享分享
推薦
發表於 2010-4-15 19:48:08 | 只看該作者
資料量少的話,用插入排序法則也不錯.
) x7 |3 y# v2 ?# I, c6 R0 O5 u# ]& _6 I6 X
假設有九個registers,每個register附帶1個comparator,
  w+ D* I; k/ o+ J每個clk有一筆data input,每個register會比較input data 與 自己register 的值. 假設第n個register 為 Reg_n  U, a( E3 v. z
if (Reg(n) > Input_value) $ H+ h! B2 y! t0 R7 Z" [# P
3 h! _# T3 f0 O4 V& b
       Reg(n) <= Reg(n);                   //保持原來的值8 j9 N4 Z  J# X
. O2 a" J( v  b7 {- Z. c" U
else if ((Reg(n)<= In_value)&&( Reg(n-1)<= In_value))
5 I7 a/ V3 y" N! S/ a( _- R/ O: }  D9 Y/ T) |; M
       Reg(n)  <= Reg(n-1);             //shift in 前一級的值) P' i" [. U$ k  i" t8 m0 _
; Q+ Z; h  S4 ~0 k' c% \
else if ((Reg(n)<=In_value)&&( Reg(n-1)> In_value))
/ x: h7 A/ k! o0 f     ! j- F9 M- Y' R: D9 A
      Reg(n)  <=In_value;             //load input value; |; |3 s* D  P
         
& F5 I5 D/ X( |0 p' V6 P6 L% h' m每個clk 這些 registers array  都是排序好. 一直到最後的input結束,直接輸出第 Reg(5)即是 median value,再 reset all registers.

本帖子中包含更多資源

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

x
回復 支持 2 反對 0

使用道具 舉報

2#
發表於 2010-4-5 16:30:41 | 只看該作者
你把A1~A9吃進來後~要先排序處理吧~- a% p9 i( a! j! ?; n7 I6 x! P
3 T; j* B5 J) L0 q1 d
至於你real time輸出~不太懂你要表達意思~* B; v% {0 h8 N
) i' X( P7 t* a! [( m$ F/ W
你可以把你整個架構描述完整點
4 u% u2 M- a1 o; N; b- K8 z
, S/ f2 z; n. m( l# K  X/ `這樣比較好給意見~!!!
3#
 樓主| 發表於 2010-4-5 21:41:38 | 只看該作者
回復 2# kokonut
4 Q, |$ e  _) h2 ~  O  @
' S5 T  y3 D' k' B9 E# Y, Z/ U# z
    是這樣的~我前面是影像讀進來的資料~我要做一個3*3遮罩的 中值濾波器
% e* [& @1 @' N% @   所以要將畫面中9個數值做排序後輸出中間的數值
, U' r2 }9 _: n; Y因為資料是不斷的進來(暫不考慮使用RAM處理),所以輸出中值的時間只允許1個CLK內完成
' C, f  J5 f3 A! P# X! e- K; {大概是這樣子...0.0
4#
發表於 2010-4-6 14:12:39 | 只看該作者
首先看排序方法3 L5 p, j9 O/ b
再來看比較器有幾層,還有比較器的寬度
5#
發表於 2010-4-11 15:41:07 | 只看該作者
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案
( b$ x2 g# J; d: i) V- P至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了.
1 c. u. R% y+ k5 Z$ U3 p) ~) ~$ q6 Z5 P
舉個4進4出的例子:
' v8 E* n$ r2 Y2 X7 dinput [word length] a[4];) d7 u' g$ x; I- E
reg [word length] b[4], c[4];. M& p8 d; i! |1 Y
第一次排序
/ q+ z& K  J* f$ t4 r' S. pb[0]=min(a[0], a[1]);: [7 |( K. e$ B( j9 p# k5 L" n
b[1]=max(a[0], a[1]);
  Z2 l" r1 W: u* P- Jb[2]=min(a[2], a[3]);6 v& h% S6 N3 w9 P4 k
b[3]=max(a[2], a[3]);
3 E" [- u' g) {第二次排序) Q3 f7 ~: H. G8 U: Y
c[0]=min(b[0], b[2]); //real minmum
/ n9 I6 l; S/ H) z, {& ^; J* ec[1]=max(b[0], b[2]);
, d: M' i" t, ^* }& x6 qc[2]=min(b[1], b[3]);8 K7 C" S9 W* o# Z7 i+ o
c[3]=max(b[1], b[3]);//real maximum- z/ S' |. w, v* s
第三次修正項
/ ?& L8 v# _) O- X/ _6 T, b9 g3 dd[0]=c[0]; //real minmum
( t% T/ F; s/ o* }; ^5 @5 F* od[1]=min(c[1], c[2]);5 K( m7 n& j% T/ V) K  f
d[2]=max(c[1], c[2]);' }! a4 S8 Z" \
d[3]=c[3];//real maximum+ e7 C9 ~7 p, u
//d[0]~d[3]就是依序小到大的答案
' i! k7 A/ J6 W9 |4 o: k
% C. I; C& i; {% q( ~這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要)- w! F& R) S/ G. \
: M0 u) w, O* t# e
實做的考量$ F7 ]3 S) ~5 s( i, @
1. 實做上min()跟max()應該是一起做的
1 u4 y1 \8 R, I" @2 g! E& g. v if(a>b)1 `! s" U5 u7 D2 s
     min = b;
6 P9 a: l4 T! B& W- r9 F     max = a;3 n( N/ l- ]' Y# J* A
  else
3 l/ S. T4 o4 M2 i    min = a;
3 v5 ?; Y8 J- Y0 I  i& ?# ?& C    max = b;
  @, [$ s' m$ u' Q2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性.
( x( ^+ l* O. Q5 T9 p8 y, ?1 g3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項.
$ Z2 n- q' A4 H3 J+ CP.S. 用我的方法寫conference paper記得要掛我名字哦...XD
6#
 樓主| 發表於 2010-4-12 21:05:13 | 只看該作者
本帖最後由 呆頭鴨 於 2010-4-12 09:06 PM 編輯   N8 S, N2 z0 j2 i& |4 V
7 _% M! c+ p9 d( e/ Y# s5 ]$ s0 T
回復 5# tommywgt 5 x/ i6 e0 W, B. A" W. A( x

0 F, e- R  Y( }9 @6 Y+ }/ X9 N  v" `, I) p9 Q, F8 o; i
    謝謝大大熱心分享
# D+ k# t  q+ x2 i; L我目前的做法是這樣的,提出來給大家研究討論一下.....
# L$ }) `6 C4 i- X% M1 |8 ~我將輸入的9筆資料 拆成3段來做 假設輸入是1~9 順序是 5 9 6 7 8 2 1 3 4/ b9 T: C  ]! A) J* Z
則想像成
0 ?+ r3 i( l# g% y0 I5 9 6
6 H& s$ G/ ?2 N- o2 X' T4 S: c7 8 2
' J' b' v* F- T! d/ g* X$ o1 3 4
5 J1 @# L9 o/ J不過要先完成一個輸入 3筆資料 可以將之按大小排列輸出的小程式,這邊簡稱R
7 V* f: ?. j& k* c( R# X9 I. U將3段數值分別丟入R 得到
6 J5 G4 t% F3 C" ?3 i) j5 6 99 [- y& c" r1 G5 ~. q4 Q$ I: ^
2 7 87 ], k5 S5 i  ]
1 3 4
) ~* U$ O1 F  x' n+ X9 Q. r這時候再將 垂直列的3筆丟入R可得到1 u0 }' {' i6 Z% Q; c/ o$ N4 H( a
1 2 5# r& F" ]! j& O2 m4 _) U* o  ?+ B% M
3 6 7
/ C# @- Q: F* @) h& @4 8 9  (這邊為了方便辨識 所以排橫的 值的橫的沒差@@)
+ r) @( w1 y. J+ Q4 I! T6 Q; g2 b/ X6 o0 ~& K! \
最後一步驟~將右上至左下的3筆資料丟入R 重新排列後再輸出~可得到
% a7 c( _* ]/ s2 }- R1 2 4# a7 a$ F/ Q2 I) U& G
3 5 7- y5 N9 x* Q6 f2 f' ]2 v$ m
6 8 9- ?9 V: ^, s3 q) N/ s. L
這時候可以發現* f2 y7 V2 j2 _9 x, S
中間的數值確實是9筆資料按大小排列後的中值(5)& N- R0 }. Q0 ^7 R
雖然其於8筆資料未必有造大小排列,不過目前測 中值的部份還沒算到有問題的...
7#
發表於 2010-4-12 22:31:10 | 只看該作者
啪啪啪! q1 ~! _- F( T7 e
其實你的想法已經跟我的想法是一樣的了, 我想已經你知道我一開始講的那個方法的最大問題了
. I! Z* j# {( _9 E- T最大問題在於, 第二次的結果只保証最大值及最小值是對的, 對於修正項, 需要更多的運算
3 a5 E. [/ T: D2 p5 ]# r; f+ _當亂度能包含所有的項時, 答案一定是對的! I  t- |/ R& c  A4 j+ D6 i3 U
所以關鍵就在於如何用最少的運算次數達到最大的亂度.$ w9 C0 `3 |0 y' o2 S
左上到右下不用再算的理由是, 左上一定是最小值, 右下一定是最大值, 所以根本不用算
; D) ~" T0 v2 z2 ?所以在最大的亂度中, 8-1=7次應是最多的運算了,
! e7 X; f) j, p" V% r6 D, w1 M
: \3 q& P: p+ T- M有人有更佳解嗎?
9#
 樓主| 發表於 2010-4-15 22:34:46 | 只看該作者
回復 8# kevin ! m$ Z- r1 L8 p7 ?2 a. Y! A+ Y9 e
1 H6 x" A/ ^* T6 y

1 C% A) j  f& N" q  ?- S" L    大大的方法真不錯~ 我怎麼沒有想到呢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
9 w' a) z# v" @' O# X22排序 看起來是不錯的做法, 1 clock 即可做完.
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-6-14 02:02 PM , Processed in 0.133517 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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