Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

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

  [複製鏈接]
跳轉到指定樓層
1#
發表於 2010-3-31 22:43:39 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
請問大大們~
3 Z" C2 m2 U1 Q, Y2 J4 g$ t9 {我有9筆資料 同時輸入 A1~A9
% V  x( U9 o1 W要如何設計才能達到按照數值大小排序輸出X1~X9% U, P6 p5 X% l$ R& y: O
有辦法達到real time輸出嗎?
# \+ t/ a3 i& p; ]還起大大們提點
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂3 踩 分享分享
推薦
發表於 2010-4-15 19:48:08 | 只看該作者
資料量少的話,用插入排序法則也不錯.
8 @4 I" \# {" H6 p) B2 r% q
/ a7 ~: w9 b$ [# n) p+ y假設有九個registers,每個register附帶1個comparator,
, _0 r; v: {6 z: L$ V. n每個clk有一筆data input,每個register會比較input data 與 自己register 的值. 假設第n個register 為 Reg_n. `5 |/ ?" m: ?' Q/ H( S
if (Reg(n) > Input_value)
5 J' A) {5 g. [6 S0 o0 K
3 Y# M/ n; E& L) Y! T; `9 c       Reg(n) <= Reg(n);                   //保持原來的值! ]  A- v/ q* k  r; N9 i

9 A, Z% }5 S  c. ~. Selse if ((Reg(n)<= In_value)&&( Reg(n-1)<= In_value)), E, X9 ^! @( m* }% K7 R
# {! V8 `( U% \/ g
       Reg(n)  <= Reg(n-1);             //shift in 前一級的值
/ Q% p# I  N0 [: Z
/ k4 k! V" E1 C1 s2 welse if ((Reg(n)<=In_value)&&( Reg(n-1)> In_value))
/ g# y& m5 k( U     - \' o9 p2 o  v) y, L4 Y, |& q
      Reg(n)  <=In_value;             //load input value' G% [- n- k$ k
         
$ B7 P* O$ _! n+ r* {9 h每個clk 這些 registers array  都是排序好. 一直到最後的input結束,直接輸出第 Reg(5)即是 median value,再 reset all registers.

本帖子中包含更多資源

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

x
回復 支持 2 反對 0

使用道具 舉報

2#
發表於 2010-4-5 16:30:41 | 只看該作者
你把A1~A9吃進來後~要先排序處理吧~
( _9 e" x  x! U+ q3 E
- ?( P2 A; o5 ~至於你real time輸出~不太懂你要表達意思~) W5 V1 u1 o5 X5 ]

) A. ?4 g# [" {3 S. Y( N8 P你可以把你整個架構描述完整點% h3 T4 |5 r% ~

" P9 {8 y* A9 n. p( P  Y這樣比較好給意見~!!!
3#
 樓主| 發表於 2010-4-5 21:41:38 | 只看該作者
回復 2# kokonut 9 o8 a% e9 V1 h/ o8 {" e

8 b7 P3 R: d0 {) t8 _# o0 O* W' ]; Z+ g
    是這樣的~我前面是影像讀進來的資料~我要做一個3*3遮罩的 中值濾波器 1 Y0 ~7 S4 Q3 S4 I0 `6 z
   所以要將畫面中9個數值做排序後輸出中間的數值
- K1 z2 A: u7 e$ ^% A* r因為資料是不斷的進來(暫不考慮使用RAM處理),所以輸出中值的時間只允許1個CLK內完成
6 D* ~9 G& ~6 I大概是這樣子...0.0
4#
發表於 2010-4-6 14:12:39 | 只看該作者
首先看排序方法: d0 b) ?9 Y: r8 i: a
再來看比較器有幾層,還有比較器的寬度
5#
發表於 2010-4-11 15:41:07 | 只看該作者
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案
! d$ N- r* |* y4 s& L$ L至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了.
: D, Q4 _6 ^# W$ A/ O
& h' T  Y# x, P3 `  K9 P. l舉個4進4出的例子:$ G( Y3 j7 K! R+ d4 P
input [word length] a[4];1 W- X6 ~) a6 S2 m7 c
reg [word length] b[4], c[4];2 Q1 a/ L* s0 B  g3 c
第一次排序
- i7 Q' O! }# N) fb[0]=min(a[0], a[1]);
5 g3 S" y3 M% m' @  U# ~+ tb[1]=max(a[0], a[1]);* W, ?+ s9 B5 ^6 J& Z+ w. ^
b[2]=min(a[2], a[3]);0 I  Q" y5 h* b% J8 c; E/ Q/ V) B
b[3]=max(a[2], a[3]);1 U" {. _. t5 v! K- d1 u
第二次排序' `6 |8 I2 S4 \9 z0 S
c[0]=min(b[0], b[2]); //real minmum) m, u. B% Y  }: y
c[1]=max(b[0], b[2]);" H# P/ K. e, \3 ?# L5 s0 F
c[2]=min(b[1], b[3]);0 t5 u# J! l% _2 W
c[3]=max(b[1], b[3]);//real maximum& t" w6 p" G2 m( H
第三次修正項
7 _$ E* S. B) F8 id[0]=c[0]; //real minmum2 C6 t9 e  o# t% X* D& {
d[1]=min(c[1], c[2]);
8 Q; P( {* X7 d- sd[2]=max(c[1], c[2]);, p0 {4 y8 `" G2 L' a
d[3]=c[3];//real maximum& |8 _  d1 h* d( t, ^, I9 y
//d[0]~d[3]就是依序小到大的答案
' O# p: ]0 z# G" m$ h, [0 l3 |3 \6 u/ R
這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要), G' p2 x! Z; S! n

" N+ e% ]' q/ d; a9 X% S7 B實做的考量& I! _3 m) W+ E0 m/ B  Q  S2 e
1. 實做上min()跟max()應該是一起做的! n+ B- U6 H, l% u
if(a>b)
1 n$ r7 i0 Y: m9 X' l     min = b;
; s( I  x) [7 U1 G+ @" q  q     max = a;
" m7 `& w, Y' u6 O  else
/ f/ G, @5 o0 C8 q) [3 n    min = a;
1 A$ X  _% J/ @) E; n% R& N    max = b;- [: a* A+ l9 w& o! R0 Q
2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性.
7 p; ~+ B8 p5 x" D3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項./ Y3 ^0 k- @: V) S
P.S. 用我的方法寫conference paper記得要掛我名字哦...XD
6#
 樓主| 發表於 2010-4-12 21:05:13 | 只看該作者
本帖最後由 呆頭鴨 於 2010-4-12 09:06 PM 編輯
8 W# E$ m) f' x" N/ V- L5 D- J9 B7 E- t& M4 C
回復 5# tommywgt
4 V8 Z5 R5 M" V' m2 c7 ?8 ~" C% J& q' C* ?7 v
0 \" P9 S) H! K
    謝謝大大熱心分享  [" h5 p  {+ @6 r
我目前的做法是這樣的,提出來給大家研究討論一下.....0 w3 N9 p$ k5 z  e& ~
我將輸入的9筆資料 拆成3段來做 假設輸入是1~9 順序是 5 9 6 7 8 2 1 3 48 g0 G( y3 g- h+ v: p
則想像成 - ~/ ~  ^4 J% @* \% ~1 J4 X
5 9 6
$ v& f- Q4 C4 k, V7 8 29 Y. R5 h9 Z# @# V
1 3 4
' n, N* ~" H7 y( l( ^不過要先完成一個輸入 3筆資料 可以將之按大小排列輸出的小程式,這邊簡稱R
* d2 P5 r" o( o) z# R5 }將3段數值分別丟入R 得到 + O4 j) w$ i: ~+ f$ U
5 6 9
5 C; Y2 y8 H8 y$ r3 \2 7 8# {$ B3 F- G2 {
1 3 41 M1 D; |# J  _2 _3 x& G
這時候再將 垂直列的3筆丟入R可得到- c4 T5 p( L1 k) q( e( K
1 2 5
2 r- {+ v! `/ L; `2 t8 ~' l# Y3 6 7
1 [4 H0 Y2 L' U; {  n" [2 n/ @4 8 9  (這邊為了方便辨識 所以排橫的 值的橫的沒差@@)4 P6 O2 @2 K0 x

6 t2 _+ g- n% ^# X, V3 _- g$ \/ ]最後一步驟~將右上至左下的3筆資料丟入R 重新排列後再輸出~可得到. @% Z& P7 L; j; ^: c- A
1 2 4* r. S" |/ y; z" E! w3 d4 U
3 5 7- o7 p" ^2 v! ?$ y+ m( [8 e
6 8 9
( p) q8 j4 H& w- A5 Q這時候可以發現3 `( R, J7 O: t
中間的數值確實是9筆資料按大小排列後的中值(5)7 ~1 {# k  w3 ^
雖然其於8筆資料未必有造大小排列,不過目前測 中值的部份還沒算到有問題的...
7#
發表於 2010-4-12 22:31:10 | 只看該作者
啪啪啪7 H9 u3 s. B. v. p1 ~# B
其實你的想法已經跟我的想法是一樣的了, 我想已經你知道我一開始講的那個方法的最大問題了5 t9 K) z$ U( I
最大問題在於, 第二次的結果只保証最大值及最小值是對的, 對於修正項, 需要更多的運算+ b; k  W. Y: h9 N2 W. V! m
當亂度能包含所有的項時, 答案一定是對的- u! z8 b! h/ i9 T
所以關鍵就在於如何用最少的運算次數達到最大的亂度.% q# |, _3 d1 C
左上到右下不用再算的理由是, 左上一定是最小值, 右下一定是最大值, 所以根本不用算0 q/ q) ~1 B! l) X+ n
所以在最大的亂度中, 8-1=7次應是最多的運算了, 1 U5 L6 h& P$ h8 f; i

! a/ K  b/ T! S& X/ e+ |* b有人有更佳解嗎?
9#
 樓主| 發表於 2010-4-15 22:34:46 | 只看該作者
回復 8# kevin
9 j3 \8 M0 t3 x: l: q0 S% x5 Q$ [" d& K/ }3 n8 W
* |+ l  x  h% A" a, N
    大大的方法真不錯~ 我怎麼沒有想到呢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
$ h- h2 @5 E- p  [5 K2 D7 _22排序 看起來是不錯的做法, 1 clock 即可做完.
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-6-5 05:36 PM , Processed in 0.179523 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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