2010년 1월 29일 금요일

hand wiring TSSOP Memory

  • Prepare the material

  • Soldering Headers


  • Attach the tape




  • Wiring by 400 degree - Heat Pencil






2010년 1월 26일 화요일

USB Camera (CMOS Sensor + FPGA + SRAM FIFO + USB FIFO)


  • Xilinx ISE 11
  • Spartan 3 (XC3S400-TQ144(-5))
  • Verilog HDL

// User Constraint
NET "Pixel<0>" LOC = P99;
NET "Pixel<1>" LOC = P100;
NET "Pixel<2>" LOC = P102;
NET "Pixel<3>" LOC = P103;
NET "Pixel<4>" LOC = P104;
NET "Pixel<5>" LOC = P105;
NET "Pixel<6>" LOC = P107;
NET "Pixel<7>" LOC = P108;
NET "Href" LOC = P112;
NET "Vsync" LOC = P113;
NET "Trigger" LOC = P116;
NET "Reset" LOC = P118;
NET "Pclk" LOC = P124;
NET "nSLWR" LOC = P50;
NET "nFlagb" LOC = P51;
NET "FD<0>" LOC = P60;
NET "FD<1>" LOC = P63;
NET "FD<2>" LOC = P68;
NET "FD<3>" LOC = P69;
NET "FD<4>" LOC = P70;
NET "FD<5>" LOC = P73;
NET "FD<6>" LOC = P74;
NET "FD<7>" LOC = P76;
NET "FD<8>" LOC = P77;
NET "FD<9>" LOC = P78;
NET "FD<10>" LOC = P79;
NET "FD<11>" LOC = P80;
NET "FD<12>" LOC = P82;
NET "FD<13>" LOC = P83;
NET "FD<14>" LOC = P84;
NET "FD<15>" LOC = P85;
NET "nWE" LOC = P46;
NET "nOE" LOC = P44;
NET "Address<0>" LOC = P132;
NET "Address<1>" LOC = P135;
NET "Address<2>" LOC = P137;
NET "Address<3>" LOC = P140;
NET "Address<4>" LOC = P141;
NET "Address<5>" LOC = P1;
NET "Address<6>" LOC = P2;
NET "Address<7>" LOC = P4;
NET "Address<8>" LOC = P5;
NET "Address<9>" LOC = P6;
NET "Address<10>" LOC = P7;
NET "Address<11>" LOC = P8;
NET "Address<12>" LOC = P10;
NET "Address<13>" LOC = P11;
NET "Address<14>" LOC = P12;
NET "Address<15>" LOC = P13;
NET "Address<16>" LOC = P14;
NET "Address<17>" LOC = P15;
NET "Data<0>" LOC = P17;
NET "Data<1>" LOC = P18;
NET "Data<2>" LOC = P20;
NET "Data<3>" LOC = P21;
NET "Data<4>" LOC = P23;
NET "Data<5>" LOC = P24;
NET "Data<6>" LOC = P25;
NET "Data<7>" LOC = P26;
NET "Data<8>" LOC = P27;
NET "Data<9>" LOC = P28;
NET "Data<10>" LOC = P30;
NET "Data<11>" LOC = P31;
NET "Data<12>" LOC = P32;
NET "Data<13>" LOC = P33;
NET "Data<14>" LOC = P35;
NET "Data<15>" LOC = P36;

// Verilog Code
`timescale 1ns / 1ps

module isp_with_sram_and_usb(Reset, Trigger,

Vsync, Href, Pclk, Pixel,

nWE, nOE, Address, Data,

/*Ifclk,*/ nFlagB, /*nPKTEND,*/ nSLWR, FD);

parameter ADDR_SIZE = 18;

parameter STATE_SIZE = 4;

parameter IDLE = 4'b0001, WV = 4'b0010, WH = 4'b0100, H = 4'b1000;


input Reset;

input Trigger;

input Vsync;

input Href;

input Pclk;

input [7:0] Pixel;


output reg nWE;

output reg nOE;

output [ADDR_SIZE-1:0] Address;

inout [15:0] Data;


// output Ifclk;

input nFlagB;

// output reg nPKTEND;

output reg nSLWR;

output reg [15:0] FD;


wire Vsync, Href, Pclk;


// FSM for camera

reg [STATE_SIZE-1:0] state;

wire [STATE_SIZE-1:0] next_state;


assign next_state = camera_fsm(state, Trigger, Vsync, Href);


function [STATE_SIZE-1:0] camera_fsm;

input [STATE_SIZE-1:0] state;

input Trigger;

input Vsync;

input Href;

case (state)

IDLE:

if (Trigger == 1'b1) camera_fsm = WV;

else camera_fsm = IDLE;

WV:

if (Vsync == 1'b1) camera_fsm = WH;

else camera_fsm = WV;

WH:

if (Href == 1'b1) camera_fsm = H;

else camera_fsm = WH;

H:

if (Vsync == 1'b1) begin

camera_fsm = IDLE;

end else begin

if (Href == 1'b1) camera_fsm = H;

else camera_fsm = WH;

end

default:

camera_fsm = IDLE;

endcase

endfunction



always @(posedge Pclk) begin

if (Reset == 1'b1) state <= IDLE;

else state <= next_state;

end



// pixel toggling under H state

reg pixel_toggle; // indicate the completion of word loading from pixel

always @(posedge Pclk) begin

if (Reset == 1'b1) begin

pixel_toggle <= 1'b0;

end else begin

if (~|(state^H)) begin

pixel_toggle <= pixel_toggle^1'b1;

end else begin

pixel_toggle <= 1'b0;

end

end

end



// even pixel container triggered by pixel toggle

reg [7:0] byte_pixel;

always @(posedge Pclk) begin

if (Reset == 1'b1) begin

byte_pixel <= 8'h0;

end else begin

if (pixel_toggle == 1'b0) byte_pixel <= Pixel;

end

end



reg [15:0] word_pixel;

always @(posedge Pclk) begin

if (Reset == 1'b1) begin

word_pixel <= 16'h0;

end else begin

if (pixel_toggle == 1'b1) word_pixel <= {Pixel, byte_pixel};

end

end



// FIFO

// nWE; write word_pixel to memory

//reg nWE;

always @(posedge Pclk) begin

if (Reset == 1'b1) begin

nWE <= 1'b1;

end else begin

if (pixel_toggle == 1'b1) nWE <= 1'b0;

else nWE <= 1'b1;

end

end



reg [ADDR_SIZE:0] write_addr; // note MSB is not really address

always @(posedge Pclk) begin

if (Reset == 1'b1) begin

write_addr <= 'h0;

end else begin

if (nWE == 1'b0) write_addr <= write_addr+1;

end

end



reg [ADDR_SIZE:0] read_addr; // note MSB is not really address

always @(posedge Pclk) begin

if (Reset == 1'b1) begin

read_addr <= 'h0;

end else begin

if (nOE == 1'b0) read_addr <= read_addr+1;

end

end



`ifdef USING_FULL_FLAG

reg empty_flag;

reg full_flag;

always @(write_addr or read_addr) begin

if (~|(write_addr[ADDR_SIZE-1:0]^read_addr[ADDR_SIZE-1:0])) begin

if (~|(write_addr[ADDR_SIZE]^read_addr[ADDR_SIZE])) begin

empty_flag <= 1'b1;

full_flag <= 1'b0;

end else begin

empty_flag <= 1'b0;

full_flag <= 1'b1;

end

end else begin

empty_flag <= 1'b0;

full_flag <= 1'b0;

end

end

`else

reg empty_flag;

always @(write_addr or read_addr) begin

if (~|(write_addr[ADDR_SIZE:0]^read_addr[ADDR_SIZE:0])) empty_flag <= 1'b1;

else empty_flag <= 1'b0;

end

`endif




//reg nOE;

always @(posedge Pclk) begin

if (Reset == 1'b1) begin

nOE <= 1'b1;

end else begin

if (nOE == 1'b1 && pixel_toggle == 1'b0 && empty_flag == 1'b0 && nFlagB == 1'b1) begin

nOE <= 1'b0;

end else begin

nOE <= 1'b1;

end

end

end



always @(posedge Pclk) begin

if (Reset == 1'b1) begin

nSLWR <= 1'b1;

FD <= 16'hz;

end else begin

if (nOE == 1'b0) begin

nSLWR <= 1'b0;

FD <= Data;

end else begin

nSLWR <= 1'b1;

end

end

end



assign Address = (pixel_toggle == 1'b1 ? write_addr[ADDR_SIZE-1:0] :
read_addr[ADDR_SIZE-1:0]);

assign Data = (pixel_toggle == 1'b1 ? word_pixel : 16'hz);

// assign Ifclk = Pclk;

endmodule

=========================================================================
* Final Report *
=========================================================================

Clock Information:
------------------
-----------------------------------+------------------------+-------+
Clock Signal | Clock buffer(FF name) | Load |
-----------------------------------+------------------------+-------+
Pclk | BUFGP | 85 |
-----------------------------------+------------------------+-------+

Asynchronous Control Signals Information:
----------------------------------------
No asynchronous control signals found in this design

Timing Summary:
---------------
Speed Grade: -5

Minimum period: 6.404ns (Maximum Frequency: 156.165MHz)
Minimum input arrival time before clock: 5.696ns
Maximum output required time after clock: 9.366ns
Maximum combinational path delay: No path found

=========================================================================

2010년 1월 24일 일요일

The Cure - boys don't cry

미안하다고 말해야 겠지
네 마음을 바꿀 수 있을꺼라고 생각했다면
그러나 나는 지금 상황을 알아
내가 너무 많은 말을 했어
너무 불친절하게 대하고

I would say I'm sorry
If I thought that it would change your mind
But I know that this time
I've said too much
Been too unkind

나는 그것에 대해서 훌훌 털어 보려고 노력해
거짓말로 덮어 버리고 싶어
나는 노력해 훌훌털어 보려하는데
눈물이 내 눈앞을 가려
남자는 울지 않으니깐
남자야 울지마

I try to laugh about it
Cover it all up with lies
I try and
Laugh about it
Hiding the tears in my eyes
Because boys don't cry
Boys don't cry

난 네 발밑에 무릎을 꿀고서라도
용서를 빌고 싶어
너에게 애원한다.
하지만, 난 알아
너무 늦었다는걸
지금은 내가 할 수 있는게 아무것도 없다는걸

I would break down at your feet
And beg forgiveness
Plead with you
But I know that
It's too late
And now there's nothing I can do

그레서 난 그냥 훌훌털어보려고 노력해
거짓말로 덮어보려고
나는 노력해 훌훌털어 보려하는데
눈물이 내 눈앞을 가려
남자는 울지 않지 때문에

So I try to laugh about it
Cover it all up with lies
I try to
laugh about it
Hiding the tears in my eyes
'cause boys don't cry

난 너에게 말하고 싶어
널 사랑했다고
네가 내곁에 있어 줄꺼라고 생각했다면,
그러나 나는 알아 아무 소용없다는걸
넌 이미 떠나
멀리 가버린걸

I would tell you
That I loved you
If I thought that you would stay
But I know that it's no use
That you've already
Gone away

네 인내심을 잘못 판단했어
널 너무 멀리 보내 버렸어
널 당연한 거라고 생각했어
넌 날 계속 좋아해 줄꺼라 생각했어

Misjudged your limits
Pushed you too far
Took you for granted
I thought that you needed me more

지금 어떤거라도 하고 싶어
니가 나에게 되돌아 오도록
그러나 난 그져
웃고만 있어
눈물이 눈앞을 가려
남자는 울지 않으니깐
울지마
울지마

Now I would do most anything
To get you back by my side
But I just
Keep on laughing
Hiding the tears in my eyes
'cause boys don't cry
Boys don't cry
Boys don't cry

2010년 1월 23일 토요일

Sync FIFO verilog code with external and single port SRAM

 module sync_fifo(

   Reset, Clk, Rd, Wr, Full, Empty, Din, Dout,
   addr, Data, nCS, nOE, nWE
);

parameter ADDR_SIZE = 18;
parameter DATA_SIZE = 16;

input Reset;
input Clk;
input Rd;
input Wr;
output Full;
output Empty;
input [DATA_SIZE-1:0] Din;
output [DATA_SIZE-1:0] Dout;
output [ADDR_SIZE-1:0] Addr;
inout [DATA_SIZE-1:0] Data;
output nCS;
output nOE;
output nWE;

// write address counter
reg [ADDR_SIZE:0] write_addr;
always @(posedge Clk) begin
   if (Reset) begin
      write_addr <= 0;
   end else begin
      if (Wr) write_addr <= write_addr+1;
   end
end

// read address counter
reg [ADDR_SIZE:0] read_addr;
always @(posedge Clk) begin
   if (Reset) begin
      read_addr <= 0;
   end else begin
      if (Rd) read_addr <= read_addr+1;
   end
end

reg Full;
reg Empty;
always @(write_addr or read_addr) begin
   if (~|(write_addr[ADDR_SIZE-1:0]^read_addr[ADDR_SIZE-1:0])) begin
      if (~|(write_addr[ADDR_SIZE]^read_addr[ADDR_SIZE])) begin
         Empty <= 1'b1;
         Full <= 1'b0;
      end else begin
         Empty <= 1'b0;
         Full <= 1'b1;
      end
   end else begin
      Empty <= 1'b0;
      Full <= 1'b0;
   end
end

assign nCS = ~(Wr | Rd);
assign nOE = ~(Rd);
assign nWE = ~(Wr);
assign Addr = Wr ? write_addr[ADDR_SIZE-1] : read_addr[ADDR_SIZE-1];
assign Data = Wr ? Din : 16'bz;
assign Dout = Rd ? Data : 16'bz;

endmodule

2010년 1월 21일 목요일

FSM(F??? State Machine)의Verilog HDL 코딩

State Machine의 타입

두 가지 종류의 State Machine이 있다.
  • Mealy State Machine : State Machine의 출력은 현재의 State와 입력에 의해서 결정된다.
  • Moore State Machine : State Machine의 출력이 현재의 State에 의해서만 결정된다.
필요에 따라서, 두 가지 종류중 한가지를 선택할 수 있다. 보통은 Mealy FSM을 사용한다.

Encoding Style

State Machine을 Digital 회로로 표현해야 하기 때문에 각 State를 다음의 세 가지 중하나로 표현해야 한다.
  • Binary Encoding : 각 State를 Binary Code로 표현한다. (i.e. 000, 001, 010, ...)
  • Gray Encoding : 각 State를 Gray Code로 표현한다. (i.e. 000, 001, 011, ...)
  • One Hot : 각 State를 한 Bit만 High가 되고 나머지는 Low가 되도록 한다. (i.e. 001, 010, 100)
  • One Cold : 각 State를 한 Bit만 Low가 되고 나머지는 High가 되도록 한다. (i.e. 110, 101, 011)
대부분의 경우 One Hot Encoding을 사용한다.

예제

두개의 request 입력과 두개의 grant 출력을 갖는 간단한 Arbiter를 살펴보자.
  • req_0가 활성화 되면, gnt_0를 활성화 한다.
  • req_1이 활성화 되면, gnt_1을 활성화 한다.
  • req_0과 req_1이 동시에 활성화 되면, gnt_0를 활성화 한다. 즉, req_1보다 req_0에 더 우선순위를 주는 방식이 된다.
그럼, 다음과 같이 세가지의 State를 정의 할 수 있다.
  • IDLE : 이 State에서 FSM은 req_0나 req_1의 활성화를 기다리고, gnt_0와 gnt_1의 비활성화 상태로 둔다. 이 State는 Reset후거나 오류 상태에 대한 FSM의 설정치이다.
  • GNT0 : FSM은 req_0가 활성화 되었을때 이 State로 진입하게 된다. 그리고 req_0가 활성화 되어 있는 동안 계속 유지된다. req_0가 비활성화 되면 FSM은 IDLE State가 된다.
  • GNT1 : FSM은 req_1가 활성화 되었을때 이 State로 진입하게 된다. 그리고 req_1가 활성화 되어 있는 동안 계속 유지된다. req_1가 비활성화 되면 FSM은 IDLE State가 된다.

Coding 방법

다양한 방법으로 위에서 진술한 FSM을 구현하였다. One Hot Encoding을 사용하였다.

module fsm_using_function(clock, reset, req_0, req_1, gnt_0, gnt_1);

input clock, reset, req_0, req_1;

output gnt_0, gnt_1;

wire clock, reset, req_0, req_1;

reg gnt_0, gnt_1;

parameter SIZE = 3;

parameter IDLE = 3'b001, GNT0 = 3'b010, GNT1 = 3'b100;

reg [SIZE-1:0] state;

wire [SIZE-1:0] next_state;


assign next_state = fsm_function(state, req_0, req_1);


function [SIZE-1:0] fsm_function;

input [SIZE-1:0] state;

input req_0;

input req_1;

case (state)

IDLE:

if (req_0 == 1'b1) begin

fsm_function = GNT0;

end else if (req_1 == 1'b1) begin

fsm_function = GNT1;

end else begin

fsm_function = IDLE;

end

GNT0:

if (req_0 == 1'b1) begin

fsm_function = GNT0;

end else begin

fsm_function = IDLE;

end

GNT1:

if (req_1 == 1'b1) begin

fsm_function = GNT1;

end else begin

fsm_function = IDLE;

end

default:

fsm_function = IDLE;

endcase

endfunction


// seq logic
always @(posedge clock)

begin : FSM_SEQ

if (reset == 1'b1) begin

state <= #1 IDLE;

end else begin state <= #1 next_state;

end

end

// output logic

always @(posedge clock)

begin : OUTPUT_LOGIC

if (reset == 1'b1) begin

gnt_0 <= #1 1'b0;

gnt_1 <= #1 1'b0;

end else begin

case (state)

...

end

2010년 1월 2일 토요일

소유냐 존재냐?

- Erich Fromm

그지 깽깽이 같은 인생이라 난 존재만 쫒아야 된다.