Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

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

  [複製鏈接]
跳轉到指定樓層
1#
發表於 2010-3-31 22:43:39 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
請問大大們~% r: U# {6 |6 ?* C; g$ s
我有9筆資料 同時輸入 A1~A93 J; O4 l; s. q/ r  q
要如何設計才能達到按照數值大小排序輸出X1~X9
5 u: P2 i6 u% W4 R: Y" k有辦法達到real time輸出嗎?
7 E: e& W, p2 {* J3 |2 d2 P還起大大們提點
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂3 踩 分享分享
推薦
發表於 2010-4-15 19:48:08 | 只看該作者
資料量少的話,用插入排序法則也不錯.( x0 n! Y3 m4 Q, u

0 m. f/ b2 n2 N+ U: q8 n% S/ P假設有九個registers,每個register附帶1個comparator,% u+ i( n! _5 p3 |  x; `: y3 N
每個clk有一筆data input,每個register會比較input data 與 自己register 的值. 假設第n個register 為 Reg_n/ m9 q8 l7 A& F" ~: @3 M1 o% v
if (Reg(n) > Input_value)
8 j9 `% c/ r0 e+ B
) I! z8 [" {: {5 R3 Z       Reg(n) <= Reg(n);                   //保持原來的值
/ \4 F* ]6 j6 d0 G8 A: @# I- o7 R7 L& o% p- ^
else if ((Reg(n)<= In_value)&&( Reg(n-1)<= In_value))' z& L4 Z2 y3 u9 U& x' X

( `/ x" [' g7 B" S/ ]) W       Reg(n)  <= Reg(n-1);             //shift in 前一級的值$ t2 i* t4 r% v$ z) w! ^, v- E9 E
% B- G: K* R  w; @# |1 p( n  R1 i
else if ((Reg(n)<=In_value)&&( Reg(n-1)> In_value))
8 s) E' A8 g* A5 a9 d, w. I     1 E5 Y  {* T9 [8 U- _7 k! j
      Reg(n)  <=In_value;             //load input value
& d% @3 q& e- z( c% q0 R4 J4 K4 R% |         
# O, t0 @( {  @+ U* _& u; u7 t% A# g每個clk 這些 registers array  都是排序好. 一直到最後的input結束,直接輸出第 Reg(5)即是 median value,再 reset all registers.

本帖子中包含更多資源

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

x
回復 支持 2 反對 0

使用道具 舉報

2#
發表於 2010-4-5 16:30:41 | 只看該作者
你把A1~A9吃進來後~要先排序處理吧~
9 s# }7 i, o7 D! a# r
; f9 W4 [5 U, m& m' ^& S至於你real time輸出~不太懂你要表達意思~3 {, L6 h& k5 Q

; Z0 W! N: x7 F& n/ E- b0 v你可以把你整個架構描述完整點7 V7 T- {8 s8 j

$ F1 m% v' p  f7 t! d8 s這樣比較好給意見~!!!
3#
 樓主| 發表於 2010-4-5 21:41:38 | 只看該作者
回復 2# kokonut * G4 z- [3 r) N/ t% n1 D0 ^' f

. Q6 i5 u3 z  w* V8 z' M3 S4 L  z+ G  y  ?. g. q6 [- j% e
    是這樣的~我前面是影像讀進來的資料~我要做一個3*3遮罩的 中值濾波器
) p" z0 E5 G) x8 `   所以要將畫面中9個數值做排序後輸出中間的數值
6 M+ o& g% _- Z. Z因為資料是不斷的進來(暫不考慮使用RAM處理),所以輸出中值的時間只允許1個CLK內完成) ?4 N8 S. y. b0 t( }
大概是這樣子...0.0
4#
發表於 2010-4-6 14:12:39 | 只看該作者
首先看排序方法
4 F% c) [+ v' w0 `) Z再來看比較器有幾層,還有比較器的寬度
5#
發表於 2010-4-11 15:41:07 | 只看該作者
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案
- e  T6 ~% O' z9 w' ~5 m3 e% N至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了.3 L9 V$ Y  R1 d" |7 G/ [( h
' B- Z$ D8 v5 }! j% o+ c8 o6 o
舉個4進4出的例子:1 J5 h+ Q. ^- B
input [word length] a[4];- U1 e6 Y1 V* C+ \
reg [word length] b[4], c[4];1 n$ d$ q; H5 O& o$ X8 `
第一次排序
/ n' \: I+ R( n8 _' S& [b[0]=min(a[0], a[1]);
8 I. J; J4 n" D& z& R7 y: Q5 e( |b[1]=max(a[0], a[1]);
, {, D+ P/ e! d3 M/ eb[2]=min(a[2], a[3]);1 j: y7 z8 b# X
b[3]=max(a[2], a[3]);
1 a4 D3 L/ ?' k* e第二次排序
: h& D( i8 q: f8 e* y2 m5 U# Wc[0]=min(b[0], b[2]); //real minmum5 t# \: Y0 s+ Z3 s; v
c[1]=max(b[0], b[2]);2 D! s+ M  k4 C
c[2]=min(b[1], b[3]);
% V& k, A) s- e' }' gc[3]=max(b[1], b[3]);//real maximum
. [, I3 H8 t" u" s! \, t6 A第三次修正項
5 t1 L5 e4 S9 P" U$ H3 Sd[0]=c[0]; //real minmum$ |4 T5 y0 C2 j2 ?" q5 W) ~
d[1]=min(c[1], c[2]);
; m& M, t$ i$ A* Q+ i+ Hd[2]=max(c[1], c[2]);
+ {) J# ]' H% ^( R/ w& y) Z! i' S/ td[3]=c[3];//real maximum. S7 z8 ?: J$ |3 U  ]9 J9 c& u+ Q
//d[0]~d[3]就是依序小到大的答案
6 W: u+ g  W+ z
7 U/ K# o" b7 j這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要)
/ G' L' }5 t" V7 `
3 S+ |$ N7 g8 T3 J實做的考量6 h# v" o# [8 c, }0 I; X
1. 實做上min()跟max()應該是一起做的
" H- n/ E6 F! N' p1 } if(a>b)) y% u6 Q5 [" h4 I7 T4 o  t
     min = b;9 P1 G3 p6 J7 C4 ?$ f3 o9 y
     max = a;3 \2 E% h* }. b# @
  else4 P6 S* _/ B, D4 X; d/ H
    min = a;
+ Z4 b2 S* @9 Z/ b" Y    max = b;
5 E( {$ W. R) F* G( k2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性.
8 ^, O8 g0 I6 Y! }+ {1 ]3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項.
. U" ^" I; G6 a" W) j1 u0 T1 eP.S. 用我的方法寫conference paper記得要掛我名字哦...XD
6#
 樓主| 發表於 2010-4-12 21:05:13 | 只看該作者
本帖最後由 呆頭鴨 於 2010-4-12 09:06 PM 編輯 * ]/ O7 N* i- K( J0 ^
6 S) N4 d  T# R0 D
回復 5# tommywgt
1 |1 k( p( F& v9 z9 Q" h) N6 b
6 p7 N1 G: w4 p3 v* U0 X1 C- v- T0 U2 y/ V5 V& U
    謝謝大大熱心分享
8 s7 I6 m! B' p我目前的做法是這樣的,提出來給大家研究討論一下...../ `' \) n' r( O5 E4 E
我將輸入的9筆資料 拆成3段來做 假設輸入是1~9 順序是 5 9 6 7 8 2 1 3 4* y, y5 r7 i$ R& P5 k" b
則想像成
3 z" e3 t- w& T. [5 9 6/ }& {5 S0 }" B+ _) i1 O  Q
7 8 2* {% m9 G4 m- W7 [: X* M# H
1 3 4
0 E$ O& {  |2 p& v不過要先完成一個輸入 3筆資料 可以將之按大小排列輸出的小程式,這邊簡稱R2 j2 c, N, V! M# C6 D* \/ F
將3段數值分別丟入R 得到
3 [# i& X$ Q# X$ V' q9 |& T) y5 6 9% O" ?! T/ I' c6 O* P% ?
2 7 8
# b" M9 s/ e9 Y+ h# E* ~1 3 4
4 N2 h$ m" {- U! V; |: ?* R這時候再將 垂直列的3筆丟入R可得到
  K5 B. I+ K0 j' {: Y( O1 2 5' _" }$ u/ ^4 t# s8 d# L( X; f
3 6 7
5 E% a, ?8 f- d: ~8 E) d% L- W4 8 9  (這邊為了方便辨識 所以排橫的 值的橫的沒差@@)- B8 _& k% e6 @1 B  ~% U  b
4 N  _& d# Z; T9 K2 z. @  _- I
最後一步驟~將右上至左下的3筆資料丟入R 重新排列後再輸出~可得到* b$ d' L, y, }
1 2 4- C% X/ P; X6 k. f# W1 j
3 5 7
0 Q) n" `' e( Y& |5 Z$ i% m6 8 9
  y# O7 T- r' `8 k- u  R5 k這時候可以發現
: d% f+ F% M  R  k1 z中間的數值確實是9筆資料按大小排列後的中值(5)
9 S/ W, N! D. v5 O) z( Q: q: `2 `雖然其於8筆資料未必有造大小排列,不過目前測 中值的部份還沒算到有問題的...
7#
發表於 2010-4-12 22:31:10 | 只看該作者
啪啪啪
" @; V) p( }: z其實你的想法已經跟我的想法是一樣的了, 我想已經你知道我一開始講的那個方法的最大問題了
1 E1 N# S: X7 s' D( `  J$ |7 ~, ]0 E最大問題在於, 第二次的結果只保証最大值及最小值是對的, 對於修正項, 需要更多的運算
0 i( O$ v3 Z7 u7 Z: |% R  a當亂度能包含所有的項時, 答案一定是對的. T: {6 `# P4 c1 v
所以關鍵就在於如何用最少的運算次數達到最大的亂度.
% I6 j( y) l4 X% ]. p& s左上到右下不用再算的理由是, 左上一定是最小值, 右下一定是最大值, 所以根本不用算
/ @. z4 D- M5 n所以在最大的亂度中, 8-1=7次應是最多的運算了,
0 G. m( K3 r8 @: _
* g, k4 Y. g2 R: r- e3 K2 }/ V5 }有人有更佳解嗎?
9#
 樓主| 發表於 2010-4-15 22:34:46 | 只看該作者
回復 8# kevin * g8 h* P  @- ^; H; W  P1 O
2 f. D9 k& _# M5 ?+ q& r
' W! T  b* \, ?/ N$ F0 [% [
    大大的方法真不錯~ 我怎麼沒有想到呢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
* ^3 u8 u$ w4 a- @- F5 Y2 r! B( u22排序 看起來是不錯的做法, 1 clock 即可做完.
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-5-23 01:55 AM , Processed in 0.121015 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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