Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

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

  [複製鏈接]
跳轉到指定樓層
1#
發表於 2010-3-31 22:43:39 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
請問大大們~: D) ^$ q; ?; R1 X, k
我有9筆資料 同時輸入 A1~A9
% q8 C1 r- f- `) u要如何設計才能達到按照數值大小排序輸出X1~X9  O) o9 ^% c+ }. N: y& V
有辦法達到real time輸出嗎?
4 }$ N+ R8 a: a" r+ T5 u! _還起大大們提點
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂3 踩 分享分享
推薦
發表於 2010-4-15 19:48:08 | 只看該作者
資料量少的話,用插入排序法則也不錯.8 O" G1 m( d# H5 S, y  t
3 x( b4 Q" ?4 V
假設有九個registers,每個register附帶1個comparator,
" ~  g: K4 o; H$ I每個clk有一筆data input,每個register會比較input data 與 自己register 的值. 假設第n個register 為 Reg_n' k+ U$ w( {1 w
if (Reg(n) > Input_value) ; J  ?4 h( K" E9 V0 f  e  G
+ D( x7 Q$ T4 b% p, X
       Reg(n) <= Reg(n);                   //保持原來的值
2 U0 Z& X# k! |. r+ b! ]/ n) x, a7 k* l3 A2 [' ~
else if ((Reg(n)<= In_value)&&( Reg(n-1)<= In_value)). j" g' t2 L* O- _6 n
$ n8 S, N& n. C
       Reg(n)  <= Reg(n-1);             //shift in 前一級的值
9 q7 t+ \& Y( g7 d. ?
- b2 `3 a3 g( l, r1 velse if ((Reg(n)<=In_value)&&( Reg(n-1)> In_value))
  y- d% ^" r) h  f7 R# S     - y" b* `6 J. K( G$ m3 U- Q' M
      Reg(n)  <=In_value;             //load input value7 [! v# M  |  r. G
         6 g% \" R4 W4 V% O3 h
每個clk 這些 registers array  都是排序好. 一直到最後的input結束,直接輸出第 Reg(5)即是 median value,再 reset all registers.

本帖子中包含更多資源

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

x
回復 支持 2 反對 0

使用道具 舉報

2#
發表於 2010-4-5 16:30:41 | 只看該作者
你把A1~A9吃進來後~要先排序處理吧~
# ^+ A. [9 s/ ~: E1 D( Z
# }! Z" K4 m- n) b4 R+ I/ {0 w" s" \至於你real time輸出~不太懂你要表達意思~- J' z8 x- X- o0 P  W$ X5 [

( ^9 p4 k" T/ i% C你可以把你整個架構描述完整點
& D  `; q) Z" B& I2 K8 F) w( {  O; l9 l; S
這樣比較好給意見~!!!
3#
 樓主| 發表於 2010-4-5 21:41:38 | 只看該作者
回復 2# kokonut 7 {; ^- T* U) T* G

+ L, |( V6 T, E- ~* y: A' G4 [9 G1 X: E
    是這樣的~我前面是影像讀進來的資料~我要做一個3*3遮罩的 中值濾波器
- ^: n1 z( P6 m% z. B9 b/ u   所以要將畫面中9個數值做排序後輸出中間的數值0 \$ C8 `4 c2 Y* Y0 g
因為資料是不斷的進來(暫不考慮使用RAM處理),所以輸出中值的時間只允許1個CLK內完成
- H: I  r6 W9 f) s) @4 n大概是這樣子...0.0
4#
發表於 2010-4-6 14:12:39 | 只看該作者
首先看排序方法
- o) T7 i' c, Z0 k; m/ L3 }再來看比較器有幾層,還有比較器的寬度
5#
發表於 2010-4-11 15:41:07 | 只看該作者
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案1 s: {" \6 v5 E- c  L6 V3 u/ L
至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了.- Y" ?6 B5 V% v9 p

1 T6 H- J# H' b( [/ J舉個4進4出的例子:% l0 ^* @4 {8 v+ @  J
input [word length] a[4];$ Q9 a! h2 P6 R$ h* M+ _
reg [word length] b[4], c[4];6 P) Y5 n) g8 O% l* p8 M
第一次排序
2 N3 h3 \  j: }: f3 Tb[0]=min(a[0], a[1]);
/ {- V% H+ ^! Z' g) X$ v5 z+ c2 tb[1]=max(a[0], a[1]);) Z3 ?6 Q4 r5 Y
b[2]=min(a[2], a[3]);
' d/ W0 V8 X, X0 p* p1 q: i6 d" _b[3]=max(a[2], a[3]);
/ X5 }; Q  ?. h6 A5 V第二次排序/ O% b2 z- m0 ]$ {1 I! U! T
c[0]=min(b[0], b[2]); //real minmum2 m, h- Z3 f$ J9 v$ f1 a
c[1]=max(b[0], b[2]);
. H+ Z2 H' e  xc[2]=min(b[1], b[3]);- h' F: B& _! c
c[3]=max(b[1], b[3]);//real maximum
1 u8 p2 e! c& z5 r' J; r& s: T第三次修正項4 m& Z0 l' t/ z( W$ e% o
d[0]=c[0]; //real minmum
) B- J7 G; t7 y6 p4 u) |d[1]=min(c[1], c[2]);
+ K9 g4 P# P* t  C8 Ad[2]=max(c[1], c[2]);
1 H1 f6 g/ `4 d* Ed[3]=c[3];//real maximum
' Z6 K" O( j7 p  E$ s% W  I//d[0]~d[3]就是依序小到大的答案
7 @& z3 ~4 S. r( s' |5 m+ Z6 |3 v0 I
這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要)
! n. Y/ w1 m" W" U2 \/ s& e$ Z% r; J, {# |: {
實做的考量
' t7 i, u; K! Y" K& F3 |1. 實做上min()跟max()應該是一起做的$ o! _3 ~( v/ f9 h6 W. n  w
if(a>b)
8 N: s. K* V6 P2 ~4 R: x     min = b;! B! \4 B/ A+ S- ]
     max = a;
1 n$ y. u9 \8 t( n  [5 Y  else
5 |2 S/ j; W3 O$ o) S" R5 q5 p4 D# x    min = a;
4 r! s: o8 d6 v# M% X    max = b;& u- {: S3 X0 f  _- h# H0 W
2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性.
: N5 e  R4 h0 ]# H3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項.  y# ^4 ?7 S: x& F0 A/ W5 m# [
P.S. 用我的方法寫conference paper記得要掛我名字哦...XD
6#
 樓主| 發表於 2010-4-12 21:05:13 | 只看該作者
本帖最後由 呆頭鴨 於 2010-4-12 09:06 PM 編輯 " y: a% ^: `7 U* [8 V

* b6 y+ E- k( e; A8 j2 V1 l回復 5# tommywgt
& \& s& o' d( c: D: e! S* |- W3 K4 `* h0 D( C( I. b. v, a/ e
2 T; z- k9 J/ U: J) O
    謝謝大大熱心分享( @3 C) S' l; u# p
我目前的做法是這樣的,提出來給大家研究討論一下...../ ]$ v( ?" j8 s
我將輸入的9筆資料 拆成3段來做 假設輸入是1~9 順序是 5 9 6 7 8 2 1 3 4
! x0 ?7 N4 s4 }3 G; H+ p* P; \/ _4 l則想像成 & ~1 k( A: w( \& _
5 9 6# |: k, C7 I: |# w
7 8 2
6 a1 g- \4 s8 u- Y) c; a1 3 4/ y! A1 j( P$ D7 j0 g9 k& Q+ G# s
不過要先完成一個輸入 3筆資料 可以將之按大小排列輸出的小程式,這邊簡稱R  v" v6 H' D/ l4 {
將3段數值分別丟入R 得到 9 c. s  f$ \( M5 H% }9 }
5 6 9# t$ a% [) g/ J, ^% _
2 7 8* U. U7 b' }: r9 O0 w4 M% _
1 3 47 u0 _1 O" m5 G$ J3 l% x% _# }
這時候再將 垂直列的3筆丟入R可得到
* g* m. p' O6 Z% ^1 2 55 [" B2 Q1 ]8 |1 H' j0 J+ y% U
3 6 7
- s8 }5 [3 u1 t6 D2 R4 8 9  (這邊為了方便辨識 所以排橫的 值的橫的沒差@@)
. U8 V- j. ~, j$ d; y7 V: G4 F" I
! q  L" [3 k5 P# K8 Y3 Y9 t1 ^+ T4 s最後一步驟~將右上至左下的3筆資料丟入R 重新排列後再輸出~可得到
; z/ [& z; o. C# M$ {. p% {1 2 4
; h# t7 `9 b( R6 Z  S3 5 7
" W2 Z9 P1 h1 j3 R. T& b/ w7 j: l6 8 9
) U% ?' r" {6 B- D3 L" V* z% a" @這時候可以發現, M. N: A+ m' r" q8 ~
中間的數值確實是9筆資料按大小排列後的中值(5); b1 h! q2 B9 F
雖然其於8筆資料未必有造大小排列,不過目前測 中值的部份還沒算到有問題的...
7#
發表於 2010-4-12 22:31:10 | 只看該作者
啪啪啪
- C& x* }/ c1 Z4 h其實你的想法已經跟我的想法是一樣的了, 我想已經你知道我一開始講的那個方法的最大問題了% Q- Q! i0 M8 ]. F
最大問題在於, 第二次的結果只保証最大值及最小值是對的, 對於修正項, 需要更多的運算
- U; P( `9 B# a. @% ]4 `# T當亂度能包含所有的項時, 答案一定是對的9 e4 I' L0 D( Q
所以關鍵就在於如何用最少的運算次數達到最大的亂度.. A. X- g0 T$ p  j' ?% }% [
左上到右下不用再算的理由是, 左上一定是最小值, 右下一定是最大值, 所以根本不用算
1 V* y0 M* [. o% ^8 B* o- B所以在最大的亂度中, 8-1=7次應是最多的運算了, 1 P' s% P. t) v3 B* B2 Y0 `
4 R: d/ f. q2 ]4 M9 M$ ^
有人有更佳解嗎?
9#
 樓主| 發表於 2010-4-15 22:34:46 | 只看該作者
回復 8# kevin ) J8 W+ |1 U" g2 Y

9 D4 n; k* |9 C8 T" A4 z& ~% h( n3 j
    大大的方法真不錯~ 我怎麼沒有想到呢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  T  W/ }- |9 l/ w2 P
22排序 看起來是不錯的做法, 1 clock 即可做完.
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-6-9 01:23 PM , Processed in 0.148019 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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