Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

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

  [複製鏈接]
跳轉到指定樓層
1#
發表於 2010-3-31 22:43:39 | 只看該作者 回帖獎勵 |正序瀏覽 |閱讀模式
請問大大們~# N& x2 y8 X1 q$ `
我有9筆資料 同時輸入 A1~A94 M; d- a" M; C" C6 l& ~; h
要如何設計才能達到按照數值大小排序輸出X1~X9
% e8 K5 G! v% D# }- ^: R有辦法達到real time輸出嗎?
0 \3 q8 X2 G( G% x還起大大們提點
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂3 踩 分享分享
推薦
發表於 2010-4-15 19:48:08 | 只看該作者
資料量少的話,用插入排序法則也不錯./ o; N) C. l% M' s8 ^) `1 C- ]- B

, f7 ]2 E4 |; Q假設有九個registers,每個register附帶1個comparator,
( Y* h0 E% ~$ [3 t3 T) C每個clk有一筆data input,每個register會比較input data 與 自己register 的值. 假設第n個register 為 Reg_n% d, {2 W! p7 v2 O* R
if (Reg(n) > Input_value)   X* w' k8 R7 L: v  g2 u! n

, Z7 B6 y$ M- o) e; m% U       Reg(n) <= Reg(n);                   //保持原來的值
& n2 j! U  t# H0 H, z5 @* S+ t
- B+ E+ i7 s, N7 d" Relse if ((Reg(n)<= In_value)&&( Reg(n-1)<= In_value))1 F5 q8 n( @3 O5 }
4 r% g3 e5 \( T5 G& C! x6 B
       Reg(n)  <= Reg(n-1);             //shift in 前一級的值8 U: \4 ^# q6 ]9 S
5 w# G+ q$ h. ^
else if ((Reg(n)<=In_value)&&( Reg(n-1)> In_value))
+ K( O1 O0 X  w  A+ S     
! [) C9 {5 X( b- A$ Q# j( u      Reg(n)  <=In_value;             //load input value
& B4 i' [# ^- ?. k4 _. k1 c         5 c$ s1 M. ~- r( A. i
每個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 J, Y/ X( U3 l* I) g
22排序 看起來是不錯的做法, 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 . Z8 z1 q. q, i- h4 ~9 z4 L5 L4 U' {; `
& P2 O- \/ l' g) w+ {: I

; y( f6 ]4 j& t$ n    大大的方法真不錯~ 我怎麼沒有想到呢XD....
7#
發表於 2010-4-12 22:31:10 | 只看該作者
啪啪啪  {2 \  r* I; T5 k
其實你的想法已經跟我的想法是一樣的了, 我想已經你知道我一開始講的那個方法的最大問題了' C& p  T' f+ g& H  {
最大問題在於, 第二次的結果只保証最大值及最小值是對的, 對於修正項, 需要更多的運算
- f2 ?) E! ^3 |9 B2 g當亂度能包含所有的項時, 答案一定是對的
1 R; Z; m; k: O# l/ `所以關鍵就在於如何用最少的運算次數達到最大的亂度.
% O) v4 S/ L- X/ ?左上到右下不用再算的理由是, 左上一定是最小值, 右下一定是最大值, 所以根本不用算
& m+ I$ X$ U9 M所以在最大的亂度中, 8-1=7次應是最多的運算了,
* W7 J5 P/ {) n( f# j+ j
. t' I/ J1 r2 D( C" o有人有更佳解嗎?
6#
 樓主| 發表於 2010-4-12 21:05:13 | 只看該作者
本帖最後由 呆頭鴨 於 2010-4-12 09:06 PM 編輯 5 s4 G$ ^8 x. Z4 @# k" B

# \0 F6 T. _6 z' z. t回復 5# tommywgt . a! p4 ~. c& f8 o& y3 T, V

2 V" ?, p9 l2 y; j7 ?4 ~3 ^( Z0 Q& a5 C& b! H' d4 h
    謝謝大大熱心分享% ~" u+ D1 v! t/ d6 y3 N! q
我目前的做法是這樣的,提出來給大家研究討論一下.....: G" s& p7 b. R6 y& ~
我將輸入的9筆資料 拆成3段來做 假設輸入是1~9 順序是 5 9 6 7 8 2 1 3 4
# f1 G3 c& x5 ?8 w9 S- M/ [則想像成 ' U" L6 J2 {& o  A# k# d4 w
5 9 63 N4 a8 ~0 W' E' c, s1 q
7 8 2* q; L5 K* j1 v. u- {8 ~2 s1 J
1 3 4
8 Y  }1 ~: Y3 p# i; L不過要先完成一個輸入 3筆資料 可以將之按大小排列輸出的小程式,這邊簡稱R% {1 F) h7 Q1 \# J- l7 i: F" f% @
將3段數值分別丟入R 得到
  }' V2 c; L: Q- P; t& D4 @& {5 6 9, l0 ?6 c- u. F, x
2 7 8
' e3 y+ Y2 a8 L& W2 Q1 3 4
0 w9 C) I' V) u& I# |( N; }這時候再將 垂直列的3筆丟入R可得到. `$ r; a; b  q
1 2 5: j4 ]+ ^6 _7 j
3 6 7
. |* E1 R# y: I( h! x4 8 9  (這邊為了方便辨識 所以排橫的 值的橫的沒差@@)
$ |* l6 v' [% ?8 P
) {1 D8 Y) ?: {4 v最後一步驟~將右上至左下的3筆資料丟入R 重新排列後再輸出~可得到) F% p3 H6 z2 H( W2 U
1 2 4
1 |# {4 Z8 R/ ^/ G7 H# T( B3 5 7; g1 U- B' N) |: j; M
6 8 9
% G) k( A: `) H3 U這時候可以發現6 V& t0 U) A4 n; C
中間的數值確實是9筆資料按大小排列後的中值(5)2 \+ o% t* @/ j1 s/ a% ^
雖然其於8筆資料未必有造大小排列,不過目前測 中值的部份還沒算到有問題的...
5#
發表於 2010-4-11 15:41:07 | 只看該作者
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案7 y8 K0 D$ W1 x0 z
至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了.
5 ]7 z, z0 ]0 T7 s# ~" f( W7 R0 u# z" H! r8 W' j
舉個4進4出的例子:5 j6 P8 h# A4 p( E% s
input [word length] a[4];
4 Y* _$ e1 g5 A  yreg [word length] b[4], c[4];
0 I# u6 m( q# a8 M$ }1 d9 ~第一次排序$ ]# V: J! F7 K# T+ F- D
b[0]=min(a[0], a[1]);
- x! Q$ F; o8 a& N6 Y4 O6 ~6 xb[1]=max(a[0], a[1]);
3 s& N: O, v7 @( b" pb[2]=min(a[2], a[3]);: Y4 `$ b0 c* R$ N
b[3]=max(a[2], a[3]);
2 ~# h0 z. h4 y. K; L4 A第二次排序; J4 A% }! g9 H
c[0]=min(b[0], b[2]); //real minmum
* s& {4 F4 n* z7 N3 K, o) Hc[1]=max(b[0], b[2]);
' w* ^' f* Z0 v9 H2 mc[2]=min(b[1], b[3]);, S: K! x) Z6 Q' P
c[3]=max(b[1], b[3]);//real maximum
9 B2 u. F7 _3 L7 M& l& E: O第三次修正項- l( S' `/ Q/ n# N! U0 K
d[0]=c[0]; //real minmum
- j, f: }$ ~! S4 o: o. Bd[1]=min(c[1], c[2]);
1 E% V& a6 a+ z& ~( M8 ud[2]=max(c[1], c[2]);1 C3 [  D0 i9 W' H5 S7 f2 A% c- T; L
d[3]=c[3];//real maximum
$ O$ I% ^* d! L/ N//d[0]~d[3]就是依序小到大的答案% _: d; `/ R6 O

0 h" d" Z0 o% Z/ Y8 S; i% D這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要)
; [  E7 i% a  ]9 H5 T: D7 f. q/ P) z
實做的考量
+ d5 r3 }5 x  {- ?0 J1 e+ `1. 實做上min()跟max()應該是一起做的
- S' v& X: T4 b1 A0 ^# U if(a>b)2 O; u( `4 \1 k: z; u  f- k; _
     min = b;
) `( o$ W! C5 u: g. E) L9 u5 _     max = a;+ D6 g# |7 M" U3 S. {) ]3 P
  else5 `2 c7 q5 ~+ }
    min = a;+ M" x- Q6 }2 _6 ^$ E5 T
    max = b;
8 Y" Z2 c$ R; d2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性.6 _4 u0 N/ t% P* ^& z. g
3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項.$ l' o3 W$ L3 n5 F: M
P.S. 用我的方法寫conference paper記得要掛我名字哦...XD
4#
發表於 2010-4-6 14:12:39 | 只看該作者
首先看排序方法
) R: w! s, j$ W- t. X" k& q( o再來看比較器有幾層,還有比較器的寬度
3#
 樓主| 發表於 2010-4-5 21:41:38 | 只看該作者
回復 2# kokonut % O0 l& W" a9 Y; N/ C
7 ^( M! L0 r2 g5 D+ ~' s4 b

" \6 l, G+ p& b8 D: H7 t& U" d    是這樣的~我前面是影像讀進來的資料~我要做一個3*3遮罩的 中值濾波器 ; N4 ?7 i) _  v" g/ E& X
   所以要將畫面中9個數值做排序後輸出中間的數值, D2 ?) i- x- y- @: v
因為資料是不斷的進來(暫不考慮使用RAM處理),所以輸出中值的時間只允許1個CLK內完成2 l2 v& \1 ^. U
大概是這樣子...0.0
2#
發表於 2010-4-5 16:30:41 | 只看該作者
你把A1~A9吃進來後~要先排序處理吧~6 D5 j; c) _! h
- `$ u% ^0 v" ]# ?! u! q& n
至於你real time輸出~不太懂你要表達意思~
- m* e3 v. F% A
2 ]  F$ h! S8 G你可以把你整個架構描述完整點
" u0 A, V) n4 g# Q6 @" C# {$ B8 L4 k1 ^+ G
這樣比較好給意見~!!!
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-5-3 06:27 PM , Processed in 0.119006 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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