Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

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

  [複製鏈接]
跳轉到指定樓層
1#
發表於 2010-3-31 22:43:39 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
請問大大們~
" W% F2 |1 l- A* ^7 C我有9筆資料 同時輸入 A1~A98 P  X# s6 p5 k/ S" w
要如何設計才能達到按照數值大小排序輸出X1~X9
7 s% t: r* \$ O; W有辦法達到real time輸出嗎?
, i# M. O. \2 E1 j還起大大們提點
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂3 踩 分享分享
推薦
發表於 2010-4-15 19:48:08 | 只看該作者
資料量少的話,用插入排序法則也不錯.( h! {& X6 K- e# E- D, H2 e

0 p4 p/ v( v( a9 M假設有九個registers,每個register附帶1個comparator,
* t; w8 r( K; H" b" j; n! [+ C+ n每個clk有一筆data input,每個register會比較input data 與 自己register 的值. 假設第n個register 為 Reg_n
4 I- z& m8 c' wif (Reg(n) > Input_value) ) H( q" Y$ ^* Z% x' T

: @# p5 K: Z5 }       Reg(n) <= Reg(n);                   //保持原來的值
; e8 n1 X( @. w) @4 P' |, e2 t8 [) {5 j& \1 z, `* Z: {
else if ((Reg(n)<= In_value)&&( Reg(n-1)<= In_value)). A. }" A! g! Q5 y8 t: {

/ V) j( n( K' C       Reg(n)  <= Reg(n-1);             //shift in 前一級的值9 t1 ]8 n, K* A% s$ d

( i" c4 C* \, {3 @  celse if ((Reg(n)<=In_value)&&( Reg(n-1)> In_value))
2 \! V0 b; R7 Q* {     ; _2 V' b8 d& S$ K) W
      Reg(n)  <=In_value;             //load input value
+ A" z# U9 M; ]3 c1 C         
" c2 s- c8 ^0 c: R+ o每個clk 這些 registers array  都是排序好. 一直到最後的input結束,直接輸出第 Reg(5)即是 median value,再 reset all registers.

本帖子中包含更多資源

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

x
回復 支持 2 反對 0

使用道具 舉報

2#
發表於 2010-4-5 16:30:41 | 只看該作者
你把A1~A9吃進來後~要先排序處理吧~4 k& E9 S  H. z& T; [

0 H( ]8 J5 T0 k$ r0 W" F% @$ w+ ^0 {6 P至於你real time輸出~不太懂你要表達意思~
' Y3 v3 Z: Y1 h. B/ J2 S! ^6 ~
: N7 \; ~6 K% o# D" u1 n4 Y你可以把你整個架構描述完整點
/ d2 I+ V# q. W% h' e. L. M; f( v. X" k3 e# r
這樣比較好給意見~!!!
3#
 樓主| 發表於 2010-4-5 21:41:38 | 只看該作者
回復 2# kokonut 0 n) A5 x# p4 }6 ?! c+ J

1 b# f+ Q& k. d3 j* h1 F
# H4 r0 f' J3 W2 p/ z2 ]' _( g; {    是這樣的~我前面是影像讀進來的資料~我要做一個3*3遮罩的 中值濾波器 4 `6 v5 c8 Z, o" j+ s6 u+ r$ u0 `2 S
   所以要將畫面中9個數值做排序後輸出中間的數值- f" {& p+ S) q% x1 j2 T6 b  d
因為資料是不斷的進來(暫不考慮使用RAM處理),所以輸出中值的時間只允許1個CLK內完成
. f; T0 }. J* W2 U. `; V6 k大概是這樣子...0.0
4#
發表於 2010-4-6 14:12:39 | 只看該作者
首先看排序方法8 s" e& j& Z2 u% y" Z) R7 i) R* M
再來看比較器有幾層,還有比較器的寬度
5#
發表於 2010-4-11 15:41:07 | 只看該作者
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案
* N2 i3 Y: p. b( J至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了.
6 u2 k" _) k% m% B0 G. l6 ?
, p5 f3 P! J3 `. d4 p; @, M4 v舉個4進4出的例子:
1 n4 b2 {1 U* i5 u4 a: `input [word length] a[4];5 Y2 N( K1 e% J7 z7 P
reg [word length] b[4], c[4];( v* F8 ^0 [  r; t- F
第一次排序
! T, y; T' S$ H8 jb[0]=min(a[0], a[1]);8 p2 C& }6 l% v
b[1]=max(a[0], a[1]);
, U, J1 k8 V8 [) X$ u" L& Xb[2]=min(a[2], a[3]);
1 o: D- n4 p8 {  y4 ?' Sb[3]=max(a[2], a[3]);7 h0 P! k- U5 v9 e2 j# e
第二次排序  Y5 g7 v5 T; B$ u6 ]& D# b
c[0]=min(b[0], b[2]); //real minmum" G/ h8 \9 l3 x, o
c[1]=max(b[0], b[2]);- M$ e% O, T: l: \4 \1 b
c[2]=min(b[1], b[3]);
. f, H- k# c* o4 [- fc[3]=max(b[1], b[3]);//real maximum: }- M  i% s1 |
第三次修正項4 {) `1 ?2 _% \2 C/ I
d[0]=c[0]; //real minmum
7 S. E9 ~, d0 f9 P8 `d[1]=min(c[1], c[2]);8 l1 u' w  y) E/ Q% o
d[2]=max(c[1], c[2]);# l+ ^/ X0 L7 x" D
d[3]=c[3];//real maximum5 G; |9 f- x5 o/ Y+ [: \0 l& ~5 p' }
//d[0]~d[3]就是依序小到大的答案% ?1 J8 |! g8 ]0 G! B5 T; m/ ^2 q

8 W2 m* d% h0 J1 ]這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要)
  H- q( b3 j8 ?- T; e2 T4 Q" J+ I; H9 v- q
實做的考量
& Y: `* e# @6 ?- L& Z1. 實做上min()跟max()應該是一起做的
; L4 f# R9 |2 h6 u if(a>b): }0 `+ b4 P" o
     min = b;9 j: Q$ t0 R# M+ \7 f! U
     max = a;% B5 {; @2 K+ J2 D" i5 i# U
  else
) q/ o. c3 Y# c" }1 F6 u    min = a;: r, {( R0 k. s# `- ?  M  ]! N
    max = b;
- Z- @3 i. l& B/ J8 v" A3 u9 @2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性.
0 S% f- U; Y! {3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項.
  u; q- R$ a: m' Q3 q' CP.S. 用我的方法寫conference paper記得要掛我名字哦...XD
6#
 樓主| 發表於 2010-4-12 21:05:13 | 只看該作者
本帖最後由 呆頭鴨 於 2010-4-12 09:06 PM 編輯 , l/ o5 h/ U( C6 g. h1 I# B
' g5 L) X, ?3 f0 x- B
回復 5# tommywgt
% P# f$ L9 [$ B$ h: I2 W% g9 R( h! w+ _* `7 K, L! @1 D4 @
4 J" o0 p. p3 k! K
    謝謝大大熱心分享8 q- w: p5 b4 a! p
我目前的做法是這樣的,提出來給大家研究討論一下.....
/ g7 Y8 B- ]7 m  L3 j! s我將輸入的9筆資料 拆成3段來做 假設輸入是1~9 順序是 5 9 6 7 8 2 1 3 4
! f) \  `! n9 H: M則想像成
+ z3 p. |0 K7 A' p- M2 E5 9 6
7 Y, A- n0 {' O$ C+ f7 8 2  K0 o  f7 o: \! U. F' c8 T7 B! Z
1 3 4+ @- e; l! Y. ]) X
不過要先完成一個輸入 3筆資料 可以將之按大小排列輸出的小程式,這邊簡稱R" }6 I5 J1 b( n  X" i
將3段數值分別丟入R 得到 ! g+ {1 C2 E* N; _( T2 n
5 6 9
- _2 P; ?  ]" n' Y  a( n2 7 8/ B( u/ V- d% H% Z' N
1 3 4
; c6 T; z+ }0 u# H9 i  u/ t這時候再將 垂直列的3筆丟入R可得到7 W3 q  g2 \  w/ [: h
1 2 5$ P5 [5 O: `$ L& c- U3 b
3 6 7
( _# W7 K+ A+ w9 S5 O' z$ A- k" U4 8 9  (這邊為了方便辨識 所以排橫的 值的橫的沒差@@)! N& \1 w. S) m; l
  m4 i9 }2 H+ n' e3 \1 G( ^; e
最後一步驟~將右上至左下的3筆資料丟入R 重新排列後再輸出~可得到# u0 L8 R8 u1 @1 s/ t- c$ O: p# I
1 2 4/ q. h9 b& [, F. w& W9 `; j+ `- y5 {
3 5 7
& Y( c! A9 c2 f0 M/ l6 8 9
2 U3 P2 ]- C- C3 ~, c" B' l這時候可以發現6 y+ N' U$ A8 l; m  `$ A; l& y
中間的數值確實是9筆資料按大小排列後的中值(5)
( M8 x! t: t8 b3 j雖然其於8筆資料未必有造大小排列,不過目前測 中值的部份還沒算到有問題的...
7#
發表於 2010-4-12 22:31:10 | 只看該作者
啪啪啪! n3 y. a, o; M- r0 S! v
其實你的想法已經跟我的想法是一樣的了, 我想已經你知道我一開始講的那個方法的最大問題了
  l: U: e$ V& S# {: N  W0 ~最大問題在於, 第二次的結果只保証最大值及最小值是對的, 對於修正項, 需要更多的運算: L9 g$ s% p) E# l
當亂度能包含所有的項時, 答案一定是對的' Q$ X# S9 X: S( A! s1 `3 F7 a
所以關鍵就在於如何用最少的運算次數達到最大的亂度.( I7 n7 F7 B. C$ R  h7 j0 E
左上到右下不用再算的理由是, 左上一定是最小值, 右下一定是最大值, 所以根本不用算" |) F/ `( W+ i' M( Y
所以在最大的亂度中, 8-1=7次應是最多的運算了, $ {$ l$ M% B  A( j2 a& m( q9 y

2 n9 a' e3 C8 Q$ f: \有人有更佳解嗎?
9#
 樓主| 發表於 2010-4-15 22:34:46 | 只看該作者
回復 8# kevin $ z( w4 F  w0 u: Q
% B' P1 l- B5 j( z+ u; g5 U& t
( p, h/ g. G) A) m( q) X
    大大的方法真不錯~ 我怎麼沒有想到呢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
) g( B8 d! n# l22排序 看起來是不錯的做法, 1 clock 即可做完.
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-5-15 10:16 AM , Processed in 0.142518 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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