Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

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

  [複製鏈接]
跳轉到指定樓層
1#
發表於 2010-3-31 22:43:39 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
請問大大們~3 X8 d4 J6 b: g) h
我有9筆資料 同時輸入 A1~A9# \/ M* g  _1 Z$ b9 e8 h8 S/ [3 |
要如何設計才能達到按照數值大小排序輸出X1~X9% c8 j3 n1 z( \1 e$ m
有辦法達到real time輸出嗎?
6 \8 Y3 {! }3 v0 }7 K( U9 M還起大大們提點
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂3 踩 分享分享
推薦
發表於 2010-4-15 19:48:08 | 只看該作者
資料量少的話,用插入排序法則也不錯.6 F7 \" E5 |% B' i' m+ E$ ?- S( F
5 x2 r# T" C$ G0 L+ ^9 B
假設有九個registers,每個register附帶1個comparator,
) N# L  c# O8 q' _; a2 ]每個clk有一筆data input,每個register會比較input data 與 自己register 的值. 假設第n個register 為 Reg_n) J4 W( A2 p+ D; h; ^' r
if (Reg(n) > Input_value)
/ \2 i9 [3 F) A  b* W: L, j6 f3 ?
4 z6 Y% _6 M+ f4 J7 W% s- K5 [       Reg(n) <= Reg(n);                   //保持原來的值
7 B4 w/ ]/ f' T# @
0 R- |% K+ j1 G& v# w8 Felse if ((Reg(n)<= In_value)&&( Reg(n-1)<= In_value))
! @1 R9 n$ ~( ~" {1 F
# F0 p# F/ W: T       Reg(n)  <= Reg(n-1);             //shift in 前一級的值, R' I3 y( _% w! t3 V

6 Z& z$ `& s: Y. g& q+ I# n' |, Selse if ((Reg(n)<=In_value)&&( Reg(n-1)> In_value))
& I9 Y( o3 {$ d* Y     
& P) `4 e, w5 N" {2 x      Reg(n)  <=In_value;             //load input value! E& W# F' `! ~: W
         1 [6 y% {( I, t$ E5 M0 S
每個clk 這些 registers array  都是排序好. 一直到最後的input結束,直接輸出第 Reg(5)即是 median value,再 reset all registers.

本帖子中包含更多資源

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

x
回復 支持 2 反對 0

使用道具 舉報

2#
發表於 2010-4-5 16:30:41 | 只看該作者
你把A1~A9吃進來後~要先排序處理吧~
6 d9 v5 U* f& f4 m2 n% B
& I5 s2 |9 y" O8 t! j至於你real time輸出~不太懂你要表達意思~& L8 d0 H* F! I

, E% C6 }  ?/ _# U你可以把你整個架構描述完整點- S8 k# K) d- a/ _/ z8 i5 @
4 \5 o. {+ E" D% k  s
這樣比較好給意見~!!!
3#
 樓主| 發表於 2010-4-5 21:41:38 | 只看該作者
回復 2# kokonut
" Z# O  h! ~6 f5 r$ V; K4 C
) R9 u1 p  _5 P; B/ A2 o' H  p# ^6 u5 k, C5 d- ]; @; n  ]7 f
    是這樣的~我前面是影像讀進來的資料~我要做一個3*3遮罩的 中值濾波器
! x; J% I6 b. v( @' i   所以要將畫面中9個數值做排序後輸出中間的數值6 L, a% r0 j7 h$ L
因為資料是不斷的進來(暫不考慮使用RAM處理),所以輸出中值的時間只允許1個CLK內完成# P/ t* f$ u7 n) f! C  i, G8 K6 l
大概是這樣子...0.0
4#
發表於 2010-4-6 14:12:39 | 只看該作者
首先看排序方法# G* c1 T: \- n6 x  e- s2 x
再來看比較器有幾層,還有比較器的寬度
5#
發表於 2010-4-11 15:41:07 | 只看該作者
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案* r: i: Z7 p4 g4 O: V5 C
至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了.$ Z8 w1 V6 n7 e5 w1 Q

0 W$ t: S7 B" E  r8 w0 n  |舉個4進4出的例子:+ q% g; L; n3 {
input [word length] a[4];
+ v$ F- ^! _& E; f) _6 F- o, O" l- |reg [word length] b[4], c[4];
2 f4 W* a5 ^0 D' u# v) a第一次排序8 m6 X; U) V$ A( O" P  j9 t7 e
b[0]=min(a[0], a[1]);( y8 q# u; V4 S! [0 {: z- G% a
b[1]=max(a[0], a[1]);5 y8 p6 S5 K7 Q6 y+ h
b[2]=min(a[2], a[3]);; j3 R( d! A( u. Z% R8 I, \0 s0 A
b[3]=max(a[2], a[3]);9 x* ]' K6 @$ V1 y8 W1 @
第二次排序6 e7 K2 K% G' Z' Q7 [( F: v
c[0]=min(b[0], b[2]); //real minmum( s7 g6 t: N3 h0 c) K, G
c[1]=max(b[0], b[2]);7 `3 H! N0 C1 p; s
c[2]=min(b[1], b[3]);
9 C, |. V, U: r! ic[3]=max(b[1], b[3]);//real maximum
* S$ d& w/ |, i( u' u第三次修正項
& w0 B, J2 R' X5 i8 {" md[0]=c[0]; //real minmum
; |& ~: k) K" h* g" B5 cd[1]=min(c[1], c[2]);$ i% _9 F6 R6 H9 ]" h, P* n1 z
d[2]=max(c[1], c[2]);. V( b, g* _3 J5 P& v
d[3]=c[3];//real maximum4 `7 k3 ]( k4 X+ k8 z6 }
//d[0]~d[3]就是依序小到大的答案3 X; Y8 k- g% j) U& b& g& ]
% u, J. N# G8 ]  W7 z
這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要)
9 E3 S( L# |  Z/ ^* d% ]4 Q8 N$ x, }& f, g4 Y- L; G1 l! ]
實做的考量
2 K5 ?2 ^+ K( h( j. Z$ z- {6 Z1. 實做上min()跟max()應該是一起做的3 ?- z" s7 V; T1 N. y8 o! b8 b' l
if(a>b)  m, ~8 w" U5 {1 c% \) y2 c
     min = b;$ {4 u2 Q$ w( ]$ |: u
     max = a;; U! k) j) T3 [, l3 s
  else2 R/ E1 b+ y) H3 }% o) H
    min = a;
% t2 y* [6 m7 o+ F+ Y7 J    max = b;4 L' P4 ]4 @) q
2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性.2 u: {! \# @) u4 z
3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項.9 I/ }3 b9 D, `7 E! B1 N
P.S. 用我的方法寫conference paper記得要掛我名字哦...XD
6#
 樓主| 發表於 2010-4-12 21:05:13 | 只看該作者
本帖最後由 呆頭鴨 於 2010-4-12 09:06 PM 編輯
' I% Q$ r7 _7 W7 v
; o5 K% |1 Z: _6 j回復 5# tommywgt
( s$ M( }( y1 a+ q, r( L  `; E! |. z( n+ C% }
( j# k! V1 P* c- ?5 H7 }) h& |* R
    謝謝大大熱心分享
5 j6 l6 c# y; r5 N9 v我目前的做法是這樣的,提出來給大家研究討論一下.....$ `8 F! z  R/ c
我將輸入的9筆資料 拆成3段來做 假設輸入是1~9 順序是 5 9 6 7 8 2 1 3 4
. {: ]5 {) v7 d) t( G; K* \0 e則想像成
" w: n3 U3 u: Z' t9 H; C5 9 6
6 y( ~6 t4 ^" Y8 E- u7 8 2# i2 d( O  ^4 S, }' k- z
1 3 4
) ~' l0 s3 M- L7 x不過要先完成一個輸入 3筆資料 可以將之按大小排列輸出的小程式,這邊簡稱R
" \3 [% O/ I0 }" g% l, y+ O7 h5 f將3段數值分別丟入R 得到
- s3 J; ^8 v& }5 6 9% H6 I7 B7 x6 m1 [  h( B. H
2 7 8
" v. `6 X( [! H' P2 Q8 \1 3 4/ G4 j- @7 N( ~( g' |4 E/ v
這時候再將 垂直列的3筆丟入R可得到
& u( M; S' N- y3 e; t4 k7 c1 2 5
$ B0 Y4 o" ?8 C8 H  F  _3 6 7! {" Y4 @# g" k( J$ Q3 _/ ?
4 8 9  (這邊為了方便辨識 所以排橫的 值的橫的沒差@@)4 k! n/ O9 L. o8 @. C1 i0 A# D
( _$ x" l5 e6 q6 S) F
最後一步驟~將右上至左下的3筆資料丟入R 重新排列後再輸出~可得到9 Q; \6 R2 h! ~% B  _" w
1 2 4
9 y4 n3 z# w- E$ L' c- p3 5 7
5 E4 y. H/ W' _9 u6 8 9
# _4 q  c3 b" U這時候可以發現
% J: O3 ]3 a, x) r中間的數值確實是9筆資料按大小排列後的中值(5)
+ j! V% Z0 M* N9 o雖然其於8筆資料未必有造大小排列,不過目前測 中值的部份還沒算到有問題的...
7#
發表於 2010-4-12 22:31:10 | 只看該作者
啪啪啪
: V) X7 E3 K8 n# |' S0 z其實你的想法已經跟我的想法是一樣的了, 我想已經你知道我一開始講的那個方法的最大問題了3 g. j% K: J" `8 z* v
最大問題在於, 第二次的結果只保証最大值及最小值是對的, 對於修正項, 需要更多的運算$ |* {2 L$ ~8 t0 ~- P0 ~5 f
當亂度能包含所有的項時, 答案一定是對的- _1 |9 n' N; C" [4 Z) P2 {
所以關鍵就在於如何用最少的運算次數達到最大的亂度.9 V) v* _8 h7 N$ V3 G0 G
左上到右下不用再算的理由是, 左上一定是最小值, 右下一定是最大值, 所以根本不用算5 C( _  r( ^% }% w" a( m4 u
所以在最大的亂度中, 8-1=7次應是最多的運算了,
4 f2 v2 O  M3 D% R2 j7 g: o6 y
' \' w0 [5 A1 |6 a, r! ?0 }有人有更佳解嗎?
9#
 樓主| 發表於 2010-4-15 22:34:46 | 只看該作者
回復 8# kevin 5 i2 s9 `% ~1 B& @

$ S/ |0 x4 L! p4 a- e! o" X0 a
( |8 g/ T6 I4 [" i( h3 F$ L  D. ]% 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
, ?; a& D  a; q, W22排序 看起來是不錯的做法, 1 clock 即可做完.
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-4-29 10:58 AM , Processed in 0.120006 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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