ASIC SoC2015.12.07 13:46

길고긴 산고 끝에 나온 ARRIA 10 FPGA/SoC 보드입니다.

전신 사진은 나중에 촬영하고 일단 FPGA SoC 부분만 올립니다.




정말 우여곡절 끝에 만든 것이라 잘 되길 바랍니다.

그런데 Package에 한국이라고 되어 있는 것을 보니 모 회사에서 만든 것 같습니다.


Posted by GUNDAM_IM
ASIC SoC2014.09.20 19:16

ALTERA에서 FPGA for Dummies를 무료로 오픈했습니다.

등록만 하면 다운 받아서 볼 수 있습니다.


50페이지 정도 되니까 심심할 때 금방 읽어 볼 수 있습니다.





Posted by GUNDAM_IM
ASIC SoC2012.09.03 09:59

이번에 개발된 칩은 PCI express 기반으로 HD-SDI 4/8/16 Ch Add on card solution입니다.






동일한 구조에서 4/8/16 Ch을 구현할 수 있으며 상황에 맞추어서 사용할 수 있는 솔루션입니다.


Features

 

u5 Channel HD Video Input

    - BT.1120(16bit), Max 74.25 MHz clock

    - Supported Video Formats

1080p @ 30/25/24 frame/sec

1080i  @ 30/25/24 frame/sec

720p   @ 60/50/30 frame/sec

    - Automatic video format/loss detector


u5 Channel I2S Audio Input


u1 Channel HD Video Output

    - BT.1120(16bit), Max 74.25 MHz clock

    - Alpha blending with OSG


u1 Channel I2S Audio Output

    - up to 48 KHz Sampling Rate


uChroma subsample supported for video capture

    - 4:2:2(UYVY) => 4:2:0(NV12)


uPCI Express 4 lane interface

    - 5 HD Video/Audio Capture

    - 32 bit ARGB OSG DMA


uFor additional user circuit

    - I2C host interface

    - 32 channel GPIO

    - SPI Master


 


---------------


개발된 칩 소개인데 항상 칩을 소개하기 위해서 보드를 소개하고 있습니다.

덕분에 보드 개발 전문 회사라는 인식이 많이 퍼져 있네요.


 



Posted by GUNDAM_IM
ASIC SoC2012.03.20 10:25
http://myfpgablog.blogspot.com/

Jim Wu라는 분(?) 이 운용하는 FPGA 관련 블로그입니다.
주로 자이링스 관련 내용을 다루는데 1년에 12개 정도 그러니까 한달에 한번 정도 글을 올립니다.

Xilinx에서도 소개하는 참고할 만한 블로그입니다.
트윗으로 올리면 금방 없어지고 저도 나중에 찾기 힘들어서 브로그로 올립니다.

GUNDAM
 
Posted by GUNDAM_IM
TAG Blog, Jim, Wu, xilinx
ASIC SoC2012.02.06 19:20

Ruby-vpi를 테스트 하는 과정을 정리하였다.
여기서 사용하는 예제는 아래 링크에서 참조 하였다.

http://snk.tuxfamily.org/lib/ruby-vpi/#usage.tutorial.declare-design

디자인은 counter.v 이다.

일단 Top module부터 만든다.

module counter #(parameter Size = 5) (
  input                   clock,
  input                   reset,
  output reg [Size-1 : 0] count
);
endmodule


일단 폴더를 만들고

mkdir xUnit

디자인을 옮겨 둔다.
cp counter.v ./xUnit

그리고 해당 폴더로 가서 xUnit용 파일을 만든다.


GUNDAM-NT:xUnit kevinim$ ruby-vpi generate counter.v --xUnit

  module  counter
  create  counter_runner.rake
  create  counter_design.rb
  create  counter_proto.rb
  create  counter_spec.rb
  create  counter_loader.rb
  create  Rakefile 


위와 같이 커맨드를 넣으면 그에 맞게 파일이 만들어진다.
각각 앞에서 설명하였던 *.rake *_design.rb _proto.rb *_spec.rb *_loader.rb Rakefile 등이다.

(2) Spec 생성

카운터라는 것의 특성상 기본적인 내용은 아래와 같이 정의할 수 있겠다.
- 초기 값은 0이어야 한다.
- 상승 클럭에서 카운트 값이 1씩 증가한다.
- 최대 값에 도달하면 overflow가 발생하지만 하여튼 0부터 시작한다.

이것을 스펙으로 정의하면 아래와 같다.

require 'test/unit'

# lowest upper bound of counter's value
LIMIT = 2 ** DUT.Size.intVal

# maximum allowed value for a counter
MAX = LIMIT - 1


class A_counter_when_reset < Test::Unit::TestCase
  def setup
    DUT.reset! # reset the counter
  end

  def test_should_be_zero
    assert_equal( 0, DUT.count.intVal )
  end

  def test_should_increment_upon_each_subsequent_posedge
    LIMIT.times do |i|
      assert_equal( i, DUT.count.intVal )
      DUT.cycle! # increment the counter
    end
  end
end

class A_counter_with_the_maximum_value < Test::Unit::TestCase
  def setup
    DUT.reset! # reset the counter

    # increment the counter to maximum value
    MAX.times { DUT.cycle! }
    assert_equal( MAX, DUT.count.intVal )
  end

  def test_should_overflow_upon_increment
    DUT.cycle! # increment the counter
    assert_equal( 0, DUT.count.intVal )
  end
end

 크게 2개의 클래스를 만들었는데
하나가  A_counter_after_being_reset 이고
나머지 하나가 A_conter_with_the_maximum_value 이다.

각각 다음과 같은 동작을 수행한다.
 
 
A_counter_after_being_reset 
-  setup :: Reset을 건다. 
- test_should_be_zero :: 0인지 확인한다. 
- test_should_increment_upon_each_subsequent_posedge :: 계속 증가하면서 하나씩 커지는 것을 확인한다. 

A_counter_with_the_maximum_value
- setup :: 리셋을 건다.
- test_should_overflow_upon_increment :: overflow가 되면 0이 된다.

이다.

(3) Prototype을 만든다.

counter_proto.rb 파일에서 만든다.

if RubyVPI::USE_PROTOTYPE
  always do
    wait until DUT.clock.posedge?

    if DUT.reset.t ?
      DUT.count.intVal = 0 
    else
      DUT.count.intVal  += 1
   end
  end
end
      
 
카운터의 값의 프로토 타입을 의미한다.


(4) Prototype을 검증하기

검증은 다음과 같이 한다.

GUNDAM-NT:xUnit kevinim$ rake ivl PROTOTYPE=1 
(in /Users/kevinim/Documents/Verilog_toos/ruby-vpi-test/xUnit)
rake aborted!
no such file to load -- ruby-vpi/runner_proxy

옵션으로 ivl은 icarus verilog simulator를 의미한다.

위와 같은 오류가 발생한다.
 
ruby-vpi/runner_proxy 

를 찾을 수 없다는 오류이다.

이 파일은 라이브러리에 있으므로 환경 변수를 설정한다.

export RUBYLIB=/Users/kevinim/Documents/Verilog_toos/Ruby-VPI/ruby-vpi-21.1.0/lib/ 

이후에 다시 실행한다.

GUNDAM-NT:xUnit kevinim$ rake ivl PROTOTYPE=1 
(in /Users/kevinim/Documents/Verilog_toos/ruby-vpi-test/xUnit)
rake -f counter_runner.rake ivl PROTOTYPE=1
(in /Users/kevinim/Documents/Verilog_toos/ruby-vpi-test/xUnit)
cp /Users/kevinim/Documents/Verilog_toos/Ruby-VPI/ruby-vpi-21.1.0/obj/ivl.so ruby-vpi.vpi
["iverilog", "-mruby-vpi", "counter.v", {:verbose=>:default, :noop=>false}]
iverilog -mruby-vpi counter.v
["vvp -M. a.out", {:verbose=>:default, :noop=>false}]
vvp -M. a.out
ruby-vpi: prototype is enabled
SyntaxError: compile error
counter_proto.rb:6: syntax error, unexpected '\n'
counter_proto.rb:12: syntax error, unexpected kEND, expecting $end
        from counter_proto.rb:12:in `load_test'
        from /Users/kevinim/Documents/Verilog_toos/Ruby-VPI/ruby-vpi-21.1.0/lib/ruby-vpi.rb:68:in `each'
        from /Users/kevinim/Documents/Verilog_toos/Ruby-VPI/ruby-vpi-21.1.0/lib/ruby-vpi.rb:68:in `load_test'
        from ./counter_loader.rb:1
        from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require'
        from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/rubygems/custom_require.rb:31:in `require'
        from /Users/kevinim/Documents/Verilog_toos/Ruby-VPI/ruby-vpi-21.1.0/lib/ruby-vpi/boot/loader.rb:146
        from /Users/kevinim/Documents/Verilog_toos/Ruby-VPI/ruby-vpi-21.1.0/lib/ruby-vpi/core/scheduler.rb:121:in `call'
        from /Users/kevinim/Documents/Verilog_toos/Ruby-VPI/ruby-vpi-21.1.0/lib/ruby-vpi/core/scheduler.rb:121:in `initialize'
        from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/generator.rb:83:in `call'
        from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/generator.rb:83:in `initialize'
        from /Users/kevinim/Documents/Verilog_toos/Ruby-VPI/ruby-vpi-21.1.0/lib/ruby-vpi/core/scheduler.rb:119:in `new'
        from /Users/kevinim/Documents/Verilog_toos/Ruby-VPI/ruby-vpi-21.1.0/lib/ruby-vpi/core/scheduler.rb:119:in `initialize'
        from /Users/kevinim/Documents/Verilog_toos/Ruby-VPI/ruby-vpi-21.1.0/lib/ruby-vpi/core/scheduler.rb:53:in `new'
        from /Users/kevinim/Documents/Verilog_toos/Ruby-VPI/ruby-vpi-21.1.0/lib/ruby-vpi/core/scheduler.rb:53:in `run'
        from /Users/kevinim/Documents/Verilog_toos/Ruby-VPI/ruby-vpi-21.1.0/lib/ruby-vpi/boot/loader.rb:144


몇개의 오류가 보인다.
이것을 먼저 수정하고 진행한다.

GUNDAM-NT:xUnit kevinim$ vi counter_proto.rb 
GUNDAM-NT:xUnit kevinim$ rake ivl PROTOTYPE=1 
(in /Users/kevinim/Documents/Verilog_toos/ruby-vpi-test/xUnit)
rake -f counter_runner.rake ivl PROTOTYPE=1
(in /Users/kevinim/Documents/Verilog_toos/ruby-vpi-test/xUnit)
cp /Users/kevinim/Documents/Verilog_toos/Ruby-VPI/ruby-vpi-21.1.0/obj/ivl.so ruby-vpi.vpi
["iverilog", "-mruby-vpi", "counter.v", {:verbose=>:default, :noop=>false}]
iverilog -mruby-vpi counter.v
["vvp -M. a.out", {:verbose=>:default, :noop=>false}]
vvp -M. a.out
ruby-vpi: prototype is enabled
Loaded suite ruby-vpi
Started
EEE
Finished in 0.00128 seconds.

  1) Error:
test_should_be_zero(#<Module:0x10252d340>::A_counter_when_reset):
ArgumentError: "VpiHigh" is not a valid VPI property
    /Users/kevinim/Documents/Verilog_toos/Ruby-VPI/ruby-vpi-21.1.0/lib/ruby-vpi/core/handle.rb:364:in `initialize'
    /Users/kevinim/Documents/Verilog_toos/Ruby-VPI/ruby-vpi-21.1.0/lib/ruby-vpi/core/handle.rb:288:in `new'
    /Users/kevinim/Documents/Verilog_toos/Ruby-VPI/ruby-vpi-21.1.0/lib/ruby-vpi/core/handle.rb:288
....
  2) Error:
test_should_increment_upon_each_subsequent_posedge(#<Module:0x10252d340>::A_counter_when_reset):
ArgumentError: "VpiHigh" is not a valid VPI property
    /Users/kevinim/Documents/Verilog_toos/Ruby-VPI/ruby-vpi-21.1.0/lib/ruby-vpi/core/handle.rb:364:in `initialize'
    /Users/kevinim/Documents/Verilog_toos/Ruby-VPI/ruby-vpi-21.1.0/lib/ruby-vpi/core/handle.rb:288:in `new'
 ....

  3) Error:
test_should_overflow_upon_increment(#<Module:0x10252d340>::A_counter_with_the_maximum_value):
ArgumentError: "VpiHigh" is not a valid VPI property
    /Users/kevinim/Documents/Verilog_toos/Ruby-VPI/ruby-vpi-21.1.0/lib/ruby-vpi/core/handle.rb:364:in `initialize'
    /Users/kevinim/Documents/Verilog_toos/Ruby-VPI/ruby-vpi-21.1.0/lib/ruby-vpi/core/handle.rb:288:in `new'
    /Users/kevinim/Documents/Verilog_toos/Ruby-VPI/ruby-vpi-21.1.0/lib/ruby-vpi/core/handle.rb:288
...

3 tests, 0 assertions, 0 failures, 3 errors
     
위의 에러는 뜻밖인데,
Ruby-VPI에서 버그가 있는것이다.
Test Code용으로 만들어낸 디자인에서 code가 틀리게 되어 있다.

counter_design.rb 를 아래와 같이 수정한다.


# Simulates the design under test for one clock cycle.
def DUT.cycle!
  clock.t!
  advance_time

  clock.f!
  advance_time
end

# Brings the design under test into a blank state.
def DUT.reset!
  reset.t!
  cycle!
  reset.f!
end
 
그리고 시뮬레이션을 수행하면 다음과 같은 오류가 발생한다.

GUNDAM-NT:xUnit kevinim$ rake ivl PROTOTYPE=1
(in /Users/kevinim/Documents/Verilog_toos/ruby-vpi-test/xUnit)
rake -f counter_runner.rake ivl PROTOTYPE=1
(in /Users/kevinim/Documents/Verilog_toos/ruby-vpi-test/xUnit)
cp /Users/kevinim/Documents/Verilog_toos/Ruby-VPI/ruby-vpi-21.1.0/obj/ivl.so ruby-vpi.vpi
["iverilog", "-mruby-vpi", "counter.v", {:verbose=>:default, :noop=>false}]
iverilog -mruby-vpi counter.v
["vvp -M. a.out", {:verbose=>:default, :noop=>false}]
vvp -M. a.out
ruby-vpi: prototype is enabled
 MAX   is 31
 SIZE  is 5
 Limit is 32
Loaded suite ruby-vpi
Started
.FF
Finished in 0.059358 seconds.

  1) Failure:
test_should_increment_upon_each_subsequent_posedge(#<Module:0x10232d3d8>::A_counter_when_reset)
    [counter_spec.rb:27:in `test_should_increment_upon_each_subsequent_posedge'
     counter_spec.rb:26:in `times'
     counter_spec.rb:26:in `test_should_increment_upon_each_subsequent_posedge']:
<1> expected but was
<0>.

  2) Failure:
test_should_overflow_upon_increment(#<Module:0x10232d3d8>::A_counter_with_the_maximum_value) [counter_spec.rb:39]:
<31> expected but was
<0>.

3 tests, 4 assertions, 2 failures, 0 errors
 
이번의 오류는 RUBY와 icaurs가 연결이 되지 않는다는 의미이다.

그래서 이번에는 CVER로 바꾸어서 컴파일을 해본다.
GPLCver에 대한 설치는 이 페이지를 참조하고 여기서는 그냥 진행한다

GUNDAM-NT:xUnit kevinim$ rake cver PROTOTYPE=1
(in /Users/kevinim/Documents/Verilog_toos/Ruby-VPI/ruby-vpi-21.1.0/examples/counter/xUnit)
rake -f counter_runner.rake cver PROTOTYPE=1
(in /Users/kevinim/Documents/Verilog_toos/Ruby-VPI/ruby-vpi-21.1.0/examples/counter/xUnit)
["cver", "+loadvpi=/Users/kevinim/Documents/Verilog_toos/Ruby-VPI/ruby-vpi-21.1.0/obj/cver.so:vlog_startup_routines_bootstrap", "+incdir+..", "../counter.v", {:verbose=>:default, :noop=>false}]
cver +loadvpi=/Users/kevinim/Documents/Verilog_toos/Ruby-VPI/ruby-vpi-21.1.0/obj/cver.so:vlog_startup_routines_bootstrap +incdir+.. ../counter.v
GPLCVER_2.12a of 05/16/07 (Mac OSX).
Copyright (c) 1991-2007 Pragmatic C Software Corp.
  All Rights reserved.  Licensed under the GNU General Public License (GPL).
  See the 'COPYING' file for details.  NO WARRANTY provided.
Today is Wed Nov  2 19:37:38 2011.
Compiling source file "../counter.v"
Highest level modules:
counter

ruby-vpi: prototype is enabled
Loaded suite ruby-vpi
Started
...
Finished in 0.103285 seconds.

3 tests, 35 assertions, 0 failures, 0 errors
0 simulation events and 0 declarative immediate assigns processed.
1 behavioral statements executed (1 procedural suspends).
  Times (in sec.):  Translate 0.0, load/optimize 0.1, simulation 0.3.
  There were 3 error(s), 136 warning(s), and 4 inform(s).
End of GPLCVER_2.12a at Wed Nov  2 19:37:38 2011 (elapsed 0.3 seconds).

결과는 이상없이 잘 진행된다.
아마도 icarus와 ruby-vpi가 잘 안맞는 문제인듯..
Osx에서만 안맞는것인지 linux에서도 그런지는 확인을 하지 못하였다.
 
 
이 방법은 불안정 해서  더이상 진행하지 않습니다.
나중에 Linux + ModelSim이나 VCS로 테스트 해보고 되면 진행 예정입니다.


 
Posted by GUNDAM_IM
ASIC SoC2012.02.06 19:19
(1) 개요

이 글은 아래 페이지를 참조하였다.

http://snk.tuxfamily.org/lib/ruby-vpi/

기본적으로  Ruby-VPI는 PLI 를 이용해서 Ruby까지 연결된 Interface를 제공한다.
따라서 Ruby를 이용해서  Testbench를 만들어 낼 수 있다는 점이 장점이다.
 
Ruby의 장점을 그대로 계승하기 때문에 Test bench나 검증 작성에 많은 도움이 된다.
검증 작성에서는 RUBY의 Test unit을 그대로 사용할 수 있기 때문에 TDD를 적용해 볼 수 있다.

Ruby-VPI의 최신 버전은 2008년 버전이며 21.1.0 버전이다.
다운로드는 아래 페이지에서 할 수 있다.

http://rubyforge.org/frs/?group_id=1339



(2) 설치

설치는 아래와 같이 한다.
설치에 대한 참조는 아래 링크를 참조 http://snk.tuxfamily.org/lib/ruby-vpi/#setup.inst

rake build
ruby bin/ruby-vpi -v


설치가 잘 되어 있으면 아래와 같은 메시지를 볼 수 있다.

ruby-vpi 21.1.0 (2008-08-02) http://ruby-vpi.rubyforge.org /Users/kevinim/Documents/Verilog_toos/Ruby-VPI/ruby-vpi-21.1.0


인스톨이 안되면 아래와 같이 직접 gem을 통해서 인스톨한다.

gem install ruby-vpi
WARNING:  Installing to ~/.gem since /Library/Ruby/Gems/1.8 and
          /usr/bin aren't both writable.
WARNING:  You don't have /Users/kevinim/.gem/ruby/1.8/bin in your PATH,
          gem executables will not run.
ERROR:  Error installing ruby-vpi:
        rspec requires rspec-expectations (~> 2.7.0, runtime)
 
rspec-ecpectations을 설치해야 하는데 아래와 같이 명령어를 넣어서 설치한다.
 
gem install rspec-expectations

설치되고 검사는 위와 같은 방식으로 실행한다.

ruby-vpi  -v

2008년 이후에 Update가 안되었으니까 굳이 Update할 필요가 없지만,

혹시 몰라서 업데이트 커맨드는 아래와 같다.

gem update ruby-vpi


  (3) RUBY-VPI가 지원하는 시뮬레이터

SimulatorNotes
GPL Cver(recommended) Version 2.11a or newer is acceptable.
Synopsys VCS Any version that supports the -load option is acceptable.
Mentor Modelsim Any version that supports the -pli option is acceptable. SeeSection 6.3. Mentor Modelsim if you are using Modelsim version 6.2g.
Cadence NC-Sim Any version that supports the +loadvpi option is acceptable for Ruby-VPI versions 20.0.0 or older. See Section 6.2. Cadence NC-Sim for details.
Icarus Verilog Version 0.8 is mostly acceptable because you will not be able to access child handles through method calls. See Section 6.1.1. Give full paths to Verilog objects for details.
 
 일단 OSX에서는 ICARUS를 활용해서 한다.
 

(4)  RUBY-VPI의 기본적인 개념

 

ruby-vpi는 두개의 component로 연결되어 있다.
- ruby-vpi와 verilog vpi 이다.

Ruby를 이용해서 테스트 벤치를 가동시키고 test case를 구동시킬 수 있다. 이는  Ruby interpereter는 스크립트를 구동하는데 이는 Ruby-VPI를 통해서 Verilog VPI를 거쳐서 Simulator 를 구동하게 된다.
- 귀찮은 C를 이용한 PLI 가 없으므로 테스트 케이스 개발이 쉬워진다는 장점을 얻을 수 있다.

위의 그림을 단순하게 보면 아래와 같다.



Ruby-VPI를 사용하게 되면 몇개의 파일이 생성되거나 만들어지게 된다.

각각의 파일은 아래와 같다.

- runner.rake
      verilog simulator를 구동한다.
   
- design.rb
      DUT의 method를 정의한다.
     테스팅을 데이터 구조 등도 포함될 수 있다.

- proto.rb
     DUT 모델의 Ruby version

- spec.rb
    테스트를 위한 함수 / 클래스 등을 포함시킨다.

- loader.rb
   test를 로딩하는 user defined test code 이다.



     
 
Posted by GUNDAM_IM
ASIC SoC2012.01.31 13:21
이번에 중국 유력 매체(?) 에 광고한 회사 제품 광고입니다.

한문이 많이 나와있지만 잘 보면 의외로 읽을 수 있는것 같네요 
이래서 옛날 분들이 급히 제 2 외국어 시험을 봐야 할 때에는 중국어로 선택하신것 같습니다.

일단 열심히 보면 뜻을 알수는 분위기라서..





 
Posted by GUNDAM_IM
ASIC SoC2011.06.22 10:00


News Release

SiliconGear Designs Spartan-6 FPGAs into Latest Generation High-Definition Video Security Surveillance & Video Display Platform
Newly-introduced HD-SDI DVR set-top box & display panel solution shipping in volume to leading surveillance equipment manufacturers in Asia Pacific

SAN JOSE, Calif., June 21, 2011 /PRNewswire via COMTEX/ --

Xilinx, Inc. (NASDAQ: XLNX) today announced that SiliconGear has designed Xilinx's Spartan®-6 field programmable gate array (FPGA) into its latest generation high-definition (HD) video security and video display platform.

SiliconGear is a leading supplier of FPGA and system-on-a-chip (SoC) platforms for manufacturers of low-cost, high-performance HD-serial digital interface (SDI) digital video recorder (DVR) and set-top box surveillance equipment. The company recently introduced its new Spartan-6-based multi-channel HD video multiplexer, HD digital video recorder (DVR) solution at Secutech 2011, the 15th international conference for electronic and information security.

SiliconGear selected Spartan-6 FPGAs over competing FPGA and application-specific alternatives because its built-in transceivers, high-speed memory controllers and HD-SDI capability met end market requirements for superior DVR video and image processing performance. Over the past year, the company has also designed Xilinx FPGAs into three generations of DVR and set-top box solutions.

"Xilinx Spartan-6 FPGAs were ideally suited to our customers' application requirements, making it possible for us to get to market quickly with a low-cost, high performance HD-SDI DVR solution ahead of our competition," said SiliconGear Chief Technology Officer Jong-Yoon Im. "With our new HD-SDI platform, manufacturers can easily implement high-speed transmission of HD video over cable, while significantly reducing their bill of materials by integrating system functionality previously performed by discrete logic for video MUX (multiplex), controllers and other glue logic.

"Going forward, we see tremendous potential for Xilinx 28nm 7 series FPGAs for our next-generation DVR and set-top box platforms. We're also looking at developing a complementary HD-SDI camera image signal processing solution."

Since their introduction in February 2009, Xilinx's award-winning 6 series FPGAs have been widely adopted by customers worldwide in a broad range of applications and key end markets including: aerospace and defense, automotive, consumer, industrial, medical, scientific and wired/wireless communications. To date, Xilinx has sold more than 10,000 Targeted Design Platforms. More than 30 6 series Targeted Design Platforms and 70 FMC daughter cards are available in production today from Xilinx and members of its global ecosystem (Distribution Channel and Alliance Program).

About Xilinx 6 series FPGAs

Spartan-6 FPGAs are designed for cost-sensitive applications requiring high-speed connectivity and low-power operation with embedded serial transceivers, advanced power management, and proven 45-nanometer architecture. These devices provide a rich mix of integrated system features, including memory controllers, digital signal processing, and Endpoint block for PCIe®, as well as RoHS-compliant lead-free package options for developing 'greener' electronics products. To learn more about the advantages of Spartan-6 over competing solutions, see Spartan-6 White Paper and download ISE Design Suite 13.

The Virtex-6 FPGA family is the high-performance silicon foundation for Xilinx Targeted Design Platforms, built with the right mix of programmability, integrated blocks for digital signal processing, memory, and connectivity support - including high-speed transceiver capabilities - to satisfy the insatiable demand for higher bandwidth and higher performance.

For more information on Xilinx 6 series FPGAs, visit: http://www.xilinx.com/products/devices.

About SiliconGear

SiliconGear is a leading provider of SoC, ASIC, FPGA and embedded design solutions for video processing, I/O (input-output) controller and embedded systems. For more information, visit: http://www.silicongear.co.kr/.

Posted by GUNDAM_IM
ASIC SoC2011.05.20 09:50
최근에 보고 있는 책 중에서 FIR Filter의 설계를 최적화하는 과정에 대해서 기술한 부분이 있어서 별도로 정리한다.
FIR Filter라고 하면 뭐 어차피  MAC연산으로 대치할 수 있는데 여기서는  Xilinx Device라는 전제로 DSP48 Block을 사용하는 것을 목표로 한다. 따라서 설계 자체의 최적화라기 보다는 설계 코드 수정을 통해 Mapping의 최적화를 수행하는 것이다.

아래와 같은 FIR Filter를 설계해서 FPGA에 넣어서 비교해 본다.

이후에 DSP48용 코드로 변경하여서 FPGA에 넣어서 그 속도를 비교하는 것으로 진행한다.

FIR Filter는 8  TAB DF-I FIR Filter이고 그 모양은 아래와 같다.



 이 FIR Filter의 코드는 아래와 같다.  (전체 다 타이핑 하기 귀찮아서 간략화 시켰다.)


module fir_filter( 
   input clk;
   input signed [15;0] data_in ;
   output reg signed [15:0] data_out ;
);
 
parameter signed [15:0] b0 = 16'h2030 ;
parameter signed [15:0] b1 = 16'h10f1 ;
 ...
parameter signed [15:0] b7 = 16'hC13f;
 ....

always ( @posedge clk )
begin
    xn[0] <= data_in ;
    xn[1] <= xn[0]   ;
    xn[2] <= xn[1]   ;
    xn[3] <= xn[2]   ;
    xn[4] <= xn[3]   ;
    xn[5] <= xn[4]   ;
    xn[6] <= xn[5]   ;
    xn[7] <= xn[6]   ;
   data_out <= yn[30:15] ;
end

assign y[n] = xn[0] * b0 + xn[1] * b1 + xn[2] * b2 + xn[3] * b3 + xn[4] * b4 + xn[5] * b5 + xn[6] * b6 +  xn[7] * b7 ;

endmodule



그럼 이제 DSP48에 맞추어서 코딩을 수정하고 합성하여 본다.

DSP48의 performance를 높이기 위해서는 의외로 단순한 방법으로 효과를 얻을 수 있다.

코드를 아래와 같이 수정한다.

...
always@(posedge clk)
begin
    xn[0] <= data_in ;
   for( i = 0 ; i < 14 ; i = i+1 )
      xn[i+1] = xn[i] ;

   data_out <= yn[30:15] ;
end

always@(posedge clk)
begin
   prod[0] <= xn[0] * b0 ;
   prod[1] <= xn[2] * b1 ;
   prod[2] <= xn[4] * b2 ;
   prod[3] <= xn[6] * b3 ;
  ..
   prod[6] <= xn[12] * b6 ;
   prod[7] <= xn[14] * b7 ;
end
 
always@(posedge clk )
begin
    mac[0] <= prod[0] ;
    for( i = 0 ; i < 7 ; i=  i + 1 )
      mac[i+1] = mac[i] = prod[i+1] ;
end 

assign yn = mac[7];

end module

이것에 대한 합성 결과는 아래와 같다.


블럭의 내용상의 차이는 각 곱셈기 앞에서 2 Cycle F/F을 가지고 있고, 이후에 ADD 전에 다시 한 사이클의 F/F이 존재한다는 점이다.
최종적으로 이를 F/F으로 잘라내에서 정리하여 출력하게 된다.

각 계산 탭의 모양은 아래와 같이 된다.


따라서 핵심은 MUL과 ADD등의 각 Stage마다 F/F을 배치해서 사용하는 것이고 이 F/F은 DSP48에 있는것을 그대로 활용하는 것이다.


요컨데 위의 DSP48블럭내에 보이는 F/F (이경우 사각형으로 표시되어 있다.)을 최대한 활용하여서 회로를 Pipeline화 하여서 속도를 올리자는 것이 이 설계의 핵심이 된다. 그리고 그 모양도 DSP48의 내부 구조를 고려하여서 F/F을 배치하였다.

책에서는 DSP48을 고려하지 않을 경우 약 43 MHz정도 나오고, 고려한 경우 대략 528MHz까지 속도가 나온다. 
F/F을 넣고 안넣고에 따라서 속도가 약 12.2배 가량 난다.


 
Posted by GUNDAM_IM
ASIC SoC2011.04.04 15:52
2의 보수 체계에서 N-bit 표현을 할 경우에 -2^(N-1)에 해당 하는 Counter part가 없다는 점이 coner case에 해당한다.
예를들어서 5비트로 표현할 경우 -16이 최소 값인데, 최대값은 15이다. 이런 상황에 처하는 것을 Coner case라고 부른다. 즉 -16으로 표현하고 +16으로 ABS를 취할 경우 5비트로 표현이 안되는 경우가 발생하는 것이다.

예를들어서  (-1) x (-1)을 Q1.2 format으로 연산할 경우 아래와 같다.

 


(주) 책에서는 After dropping redundant sign bit의 값이 1 0 0 0 0 0 으로 되어 있다.  
        단순한 계산인데 외 틀리는가 해서 고민을 했다.
       책이 오타이다. 덕분에 2의 보수 체계를 다시 공부해야 했다는 TT_TT
       
하여튼 (-1) x(-1) = 1이 되어야 하는데 Q1.5 format에서는 다시 (-1)이 되는 문제가 발생한다. 이러한 경우를 대비해서 
Conner case를 체크하는 구문을 넣어야 한다. 아래 함수를 보자

Word32 L_mult(Word16 var1,Word16 var2)

{


   Word32 L_var_out;

   L_var_out = (Word32)var1 * (Word32)var2;
 

   if (L_var_out != (Word32)0x40000000L) // 0x8000 x 0x8000 = 0x40000000

  {

        L_var_out *= 2; //remove the redundant bit

  }

  else

  {

       Overflow = 1;

       L_var_out = 0x7fffffff; //if overflow then clamp to max +ve value

   }
 

  return(L_var_out);

}



위의 코드에서 연산의 결과가 Integer MAX값에 도달하면 O/F를 세팅하고 수정하게 한다.
같은 방법으로 4비트 연산을 한 경우의 차이점은 아래와 같다.


4비트 곱셈을 정수로 할 경우에 하위 4비트를 취하고 이때 Overflow여부를 체크할 수 있다.
Q1.3 format으로 한다면 결과에 대해서 Shift 4를 한 뒤에 남은 것을 사용할 수 있다.
4비트 Fixed Point의 한계로 -0.765625를 표현 못하지만, 하여튼 유사 값으로 따라갈 수 있다.

이런것을 이용해서 만든것이 Fixel point Multiplication이다.

 


위의 연산은 Singed / Unsigned , Integer , Q-Format에 대해서 모두 할 수 있는 곱셈기이다. 상황에 맞게 사용할 수 있도록 Operand와 Fractional을 사용할 수 있도록 만들었다.
 

Posted by GUNDAM_IM