Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

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

  [複製鏈接]
跳轉到指定樓層
1#
發表於 2010-3-31 22:43:39 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
請問大大們~
+ l- K2 j9 J! I: x4 e- Z我有9筆資料 同時輸入 A1~A9
: e; ^1 a, [' T, j  F& j$ k要如何設計才能達到按照數值大小排序輸出X1~X9
* G8 w- {6 }  Q. ]- h* G有辦法達到real time輸出嗎?/ C& H3 S( K6 L- D; M5 A7 P& V
還起大大們提點
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂3 踩 分享分享
推薦
發表於 2010-4-15 19:48:08 | 只看該作者
資料量少的話,用插入排序法則也不錯., ?* E. t$ `5 L; F8 _' D
2 Y3 E6 H: y- o; h, G! e' E
假設有九個registers,每個register附帶1個comparator,
2 j! z% ~' l. w1 A, r3 R每個clk有一筆data input,每個register會比較input data 與 自己register 的值. 假設第n個register 為 Reg_n
0 @( @3 {4 o; f: @/ S7 g7 J5 j- T3 cif (Reg(n) > Input_value)
0 W1 e/ T& u+ Y2 |! l$ E4 c; t5 i$ N1 o* D) O) O5 Z( B. f
       Reg(n) <= Reg(n);                   //保持原來的值; h! L! S. \/ u! I: l
, |' J6 O5 U1 G1 X2 m( f
else if ((Reg(n)<= In_value)&&( Reg(n-1)<= In_value))+ O- a; I, r% D0 q% b
. b2 a5 O! g( X
       Reg(n)  <= Reg(n-1);             //shift in 前一級的值1 A1 J' `& L  Q$ D

: o% n. e$ H, Belse if ((Reg(n)<=In_value)&&( Reg(n-1)> In_value))
5 V" I$ L* R( M- r. R. m3 {% G     
4 |9 u1 z! U+ Q; [! y2 [      Reg(n)  <=In_value;             //load input value
& ^4 @$ {, e# O- x$ ~         # T& Q5 D& P9 U* Y# o- z
每個clk 這些 registers array  都是排序好. 一直到最後的input結束,直接輸出第 Reg(5)即是 median value,再 reset all registers.

本帖子中包含更多資源

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

x
回復 支持 2 反對 0

使用道具 舉報

2#
發表於 2010-4-5 16:30:41 | 只看該作者
你把A1~A9吃進來後~要先排序處理吧~0 L( {' w6 `, C* g8 I5 v5 k
. ?1 ~! G7 |# Q( [) ^
至於你real time輸出~不太懂你要表達意思~& y( j9 C$ W: w' W
: ~4 ^$ V; k& j( ]
你可以把你整個架構描述完整點$ ?4 @/ F: r) w. _/ C* I
5 t6 T) B& F) E6 y, F
這樣比較好給意見~!!!
3#
 樓主| 發表於 2010-4-5 21:41:38 | 只看該作者
回復 2# kokonut , A3 F4 ~! N3 x- h! o0 Z" U  Q

& d  M3 ^: L, k& @
' Q! K8 c5 ?: U, p# T5 B    是這樣的~我前面是影像讀進來的資料~我要做一個3*3遮罩的 中值濾波器
- y0 i' i, S# V   所以要將畫面中9個數值做排序後輸出中間的數值
4 {$ D! X8 G, j因為資料是不斷的進來(暫不考慮使用RAM處理),所以輸出中值的時間只允許1個CLK內完成4 ]# p. a; y, C4 h* s2 E
大概是這樣子...0.0
4#
發表於 2010-4-6 14:12:39 | 只看該作者
首先看排序方法- _! @$ {7 ?: N8 X7 m4 e$ k! g
再來看比較器有幾層,還有比較器的寬度
5#
發表於 2010-4-11 15:41:07 | 只看該作者
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案
$ }/ o7 p. v( o: C至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了." X- l6 A4 w. N
, ?: d2 o$ {# u5 N
舉個4進4出的例子:. q7 q$ ?) q, G- N: Z0 ^
input [word length] a[4];. g7 c  o4 z) V& o
reg [word length] b[4], c[4];7 t  s: E6 u  C, Q. {' Z  r
第一次排序
$ U4 [8 E8 O5 K. T( |, T: ob[0]=min(a[0], a[1]);
& ?( @  h6 z, e2 w% w5 Rb[1]=max(a[0], a[1]);5 {& }% H- f- w$ o) O* U
b[2]=min(a[2], a[3]);
7 x, d4 i2 K& Db[3]=max(a[2], a[3]);
) J6 q, o* [3 H# Z+ s  `3 q第二次排序
# ~4 Z. ^' `7 m- Z  jc[0]=min(b[0], b[2]); //real minmum( C+ W5 h, k+ f
c[1]=max(b[0], b[2]);
. y% E) G- ?3 V+ I0 t3 hc[2]=min(b[1], b[3]);
0 E/ a) m9 M# x' T" \# A: x6 Cc[3]=max(b[1], b[3]);//real maximum
5 m6 U6 A2 M) n6 }; {( b7 S5 C第三次修正項6 W2 S- y; U7 L; L# V* J! u7 }8 Z
d[0]=c[0]; //real minmum
# D0 ]  N; l2 ^. w$ V& Z" Zd[1]=min(c[1], c[2]);
. Q' N  o* g6 i8 c8 g" ?* [, `2 jd[2]=max(c[1], c[2]);9 S1 Y( _+ m" ]) G8 I8 @
d[3]=c[3];//real maximum; @2 O8 x0 o5 Y( n4 P; V7 L* L; M
//d[0]~d[3]就是依序小到大的答案
( u! i3 I# T* S! `2 r3 ^; l. c% n% }6 O; ?* i' P% i
這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要)4 b; L+ P1 ?; e) X9 S' B5 Q
9 L! U! O8 Z/ I( Y0 e. p9 _
實做的考量
( ]$ C1 z5 A# N( v& K8 l1. 實做上min()跟max()應該是一起做的
. y" ?" p% m# M if(a>b), x: f7 D5 j2 E' _6 @
     min = b;
: k7 M3 D  o9 z9 ?' n     max = a;7 b/ {0 y. A; @4 r9 [. c
  else
1 v( `5 s% f, x5 x    min = a;7 U9 Y- u! y7 y
    max = b;& i3 @% k. ]' G) L+ ]
2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性.% D2 r& c+ z; D
3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項.
0 v& }3 h: l0 J# V( q; A) @( L$ GP.S. 用我的方法寫conference paper記得要掛我名字哦...XD
6#
 樓主| 發表於 2010-4-12 21:05:13 | 只看該作者
本帖最後由 呆頭鴨 於 2010-4-12 09:06 PM 編輯 6 ]1 S9 h$ U& A% l6 n0 D

' [5 |6 r, b: R6 }' u# w回復 5# tommywgt 6 `, ^8 B  I6 H4 |. C$ k- n

* Q5 ~" S9 N0 \/ J( B0 i: g6 t$ |5 s  S
    謝謝大大熱心分享; {4 R# |: \2 O
我目前的做法是這樣的,提出來給大家研究討論一下.....
0 @  _' j$ l+ y% m5 @我將輸入的9筆資料 拆成3段來做 假設輸入是1~9 順序是 5 9 6 7 8 2 1 3 48 P8 L8 g2 P; G0 U3 R4 K9 I
則想像成 # ?- S- y/ u4 ^
5 9 6: A/ _0 o$ z9 B1 Z3 u- o) h
7 8 2) x7 l2 z$ M& M! K" m
1 3 4
1 g4 P& l0 v1 d& ]/ U不過要先完成一個輸入 3筆資料 可以將之按大小排列輸出的小程式,這邊簡稱R+ }3 C# j$ J$ k4 c
將3段數值分別丟入R 得到
% T5 R6 U. |  t/ Z; R: s5 6 9: v  H2 |9 h6 x% v/ a. s: c
2 7 86 y( Z; I6 q; ]2 \* G! c$ H
1 3 4
' l, Z9 U' ^5 t" p# G+ t2 |這時候再將 垂直列的3筆丟入R可得到- Y4 J% E# r0 J4 i
1 2 5
, p1 H; H: _4 ^. \3 6 7
8 P, f) A' D4 d. A% J4 8 9  (這邊為了方便辨識 所以排橫的 值的橫的沒差@@)
; F2 m/ ^8 @7 e  Q+ n
0 M- Y1 T! [+ Z7 x7 l最後一步驟~將右上至左下的3筆資料丟入R 重新排列後再輸出~可得到
% T9 {& R; a  C0 u: ^7 b1 2 4% N# |$ F7 V1 y* ~  X; v& h
3 5 7
8 d& |# P+ A- s) z& ~6 8 9
) `) I: [5 r: X( ]8 X4 ~這時候可以發現# @( U3 v' @. J2 F* E2 [" Y  i1 q
中間的數值確實是9筆資料按大小排列後的中值(5)( {9 g% }6 V1 [: I$ D7 V9 q
雖然其於8筆資料未必有造大小排列,不過目前測 中值的部份還沒算到有問題的...
7#
發表於 2010-4-12 22:31:10 | 只看該作者
啪啪啪
$ ~2 @# J$ E: K( B+ v其實你的想法已經跟我的想法是一樣的了, 我想已經你知道我一開始講的那個方法的最大問題了" j7 u- t5 N4 C4 @5 L
最大問題在於, 第二次的結果只保証最大值及最小值是對的, 對於修正項, 需要更多的運算9 }, d6 M/ N9 N
當亂度能包含所有的項時, 答案一定是對的6 z- [2 [0 X7 E. Y) `! z5 [2 m% S' O7 \
所以關鍵就在於如何用最少的運算次數達到最大的亂度.
8 s6 ?0 @+ |. r2 r! ^左上到右下不用再算的理由是, 左上一定是最小值, 右下一定是最大值, 所以根本不用算. T+ T. D& o& f. P  `' D* `
所以在最大的亂度中, 8-1=7次應是最多的運算了, " a# B* |: H  a1 k) J2 Q! o

* |2 \' P: J1 q8 e) x有人有更佳解嗎?
9#
 樓主| 發表於 2010-4-15 22:34:46 | 只看該作者
回復 8# kevin 3 g$ D1 c4 W2 a/ s8 L. G, R; Z
8 w. A7 i9 c1 D) c9 U0 I- n
# _9 y( E) o- _* \3 A% f, _/ 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 filter
0 k! t- {& b2 B: M2 H; V8 |22排序 看起來是不錯的做法, 1 clock 即可做完.
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-6-2 09:58 PM , Processed in 0.138018 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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