FPGA CW Keyer (4)

waveform7

スクィーズ動作を実現するには、状態遷移表を用いたほうが簡単かも知れません。

//------- ELK Test Bench ---------
`timescale 1ms/1us

module tb_elk;

    reg RST_N;
    reg CLK;
    reg IN_DOT;
    reg IN_DASH;

ELK ELK_0(.RST_N   (RST_N),
          .CLK     (CLK)  ,
          .IN_DOT  (IN_DOT)  ,
          .IN_DASH (IN_DASH)  ,
          .KEY_OUT (KEY_OUT)   );

initial begin
    CLK <= 1'b1;
    forever begin
        #10;
        CLK <= ~CLK;
    end
end

initial begin
    RST_N <= 1'b0;
     #50;
    RST_N <= 1'b1;
    #1100000;
    $finish;
end

initial begin
    IN_DOT <= 1'b1; #063;
    IN_DOT <= 1'b0; #073;
    IN_DOT <= 1'b1; #323;
    IN_DOT <= 1'b0; #223;
    IN_DOT <= 1'b1; #243;
    IN_DOT <= 1'b0; #023;
    IN_DOT <= 1'b1; #1000000;
end

initial begin
    IN_DASH <= 1'b1; #183;
    IN_DASH <= 1'b0; #123;
    IN_DASH <= 1'b1; #223;
    IN_DASH <= 1'b0; #023;
    IN_DASH <= 1'b1; #260;
    IN_DASH <= 1'b0; #300;
    IN_DASH <= 1'b1; #1000000;
end

endmodule
module ELK(RST_N, CLK, IN_DOT, IN_DASH, KEY_OUT);

    input RST_N;
    input CLK;
    input IN_DOT;
    input IN_DASH;
    output KEY_OUT;

    reg      KEY_OUT;
    reg      m_dot;
    reg      m_dash;
    reg[2:0] r_state;

//--------- dot memory ---------------------
    always @ (negedge IN_DOT or negedge RST_N) begin
        if ( RST_N == 1'b0 ) begin
            m_dot  <= 1'b0;
        end if ( IN_DOT == 1'b0) begin
            m_dot  <= 1'b1;
        end
    end

//--------- dash memory ---------------------
    always @ (negedge IN_DASH or negedge RST_N) begin
        if ( RST_N == 1'b0 ) begin
            m_dash  <= 1'b0;
        end if ( IN_DASH == 1'b0) begin
            m_dash  <= 1'b1;
        end
    end

//--------- state output ---------------------
    always @ (r_state) begin
        case(r_state)
            3'b000: begin KEY_OUT <= 1'b0; end
            3'b001: begin KEY_OUT <= 1'b1; end
            3'b010: begin KEY_OUT <= 1'b1; end
            3'b011: begin KEY_OUT <= 1'b1; end
            3'b100: begin KEY_OUT <= 1'b0; end
            3'b101: begin KEY_OUT <= 1'b1; end
            3'b110: begin KEY_OUT <= 1'b0; end
        default:begin
        end
        endcase
    end

//--------- state transition ---------------------
    always @ (posedge CLK or negedge RST_N) begin
        if ( RST_N == 1'b0 ) begin
            r_state <= 3'b000;
        end else
        case (r_state)
        3'b000:begin // idle
            if(IN_DASH == 1'b0) begin
                r_state <= 3'b001;
            end else if(IN_DOT == 1'b0) begin
                r_state <= 3'b101;
            end
        end
        3'b001:begin // dash running 1
                r_state <= 3'b010;
                m_dash  <= 1'b0;
        end
        3'b010:begin // dash running 2
                r_state <= 3'b011;
        end
        3'b011:begin // dash running 3
                r_state <= 3'b100;
        end
        3'b100:begin // dash running 4
            if(IN_DOT == 1'b0 || m_dot == 1'b1) begin
                r_state <= 3'b101;
                m_dot   <= 1'b0;
            end else if(IN_DASH == 1'b0) begin
                r_state <= 3'b001;
            end else begin
                r_state <= 3'b000;
            end
        end
        3'b101:begin // dot running 1
                r_state <= 3'b110;
                m_dot   <= 1'b0;
        end
        3'b110:begin // dot running 2
            if(IN_DASH == 1'b0 || m_dash == 1'b1) begin
                r_state <= 3'b001;
                m_dash  <= 1'b0;
            end else if(IN_DOT == 1'b0) begin
                r_state <= 3'b101;
            end else begin
                r_state <= 3'b000;
            end
        end
        default:begin
        end
        endcase
    end

endmodule

FPGA CW Keyer (3)

waveform3

次は、ダッシュのみです。

    reg[1:0] r_dash; 
    wire     w_dash; 

//---------- generate dash ---------------------
    always @ ( posedge CLK or negedge RST_N) begin
        if ( RST_N == 1'b0 ) begin 
            r_dash <= 2'h0;
        end     
        else if ( IN_DASH == 1'b0 || r_dash != 2'h0 ) begin 
            if ( r_dash == 2'h3 ) begin 
                r_dash <= 2'h0;
            end     
            else begin
                r_dash <= r_dash + 2'h1; 
            end     
        end     
        else begin
            r_dash <= 2'h0;
        end     
    end

//---------- w_dash ----------------------------

    assign w_dash = ( r_dash == 2'h0 ) ? 1'b0 : 1'b1; 

FPGA CW Keyer (2)

waveform2

最初はドットのみでシミュレーションします。いつも言うことですが、細かい部分は気にしないで下さい。

//---------  test bench ---------------------
initial begin
    CLK <= 1'b1;
    forever begin
        #10;
        CLK <= ~CLK;
    end
end

initial begin
    RST_N <= 1'b0;
     #50;
    RST_N <= 1'b1;
    #1100000;
    $finish;
end

initial begin
    IN_DOT <= 1'b1; #125; 
    IN_DOT <= 1'b0; #10;
    IN_DOT <= 1'b1; #100;
    IN_DOT <= 1'b0; #30;
    IN_DOT <= 1'b1; #100;
    IN_DOT <= 1'b0; #60;
    IN_DOT <= 1'b1; #100;
    IN_DOT <= 1'b0; #80;
    IN_DOT <= 1'b1; #100;
    IN_DOT <= 1'b0; #100;
    IN_DOT <= 1'b1; #1000000;
end
//---------  generate dot ---------------------
    always @ (posedge CLK or negedge RST_N) begin
        if ( RST_N == 1'b0 ) begin
            r_dot <= 1'b0;
        end
        else if ( IN_DOT == 1'b0 ) begin
            r_dot <= ~r_dot;
        end
        else begin
            r_dot <= 1'b0;
        end
    end

Quartus PrimeをUbuntu 16.04 LTSで

quartusPrime

Quartus Prime 15.1 Lite EditionとModelSim-Altera Starter Edition 10.4bを、Ubuntu 16.04 LTSにインストールしました。

modelsim

ModelSim-Altera (Starter) Editionを、Linux 64bitプラットフォーム上で走らせるには、32bitのライブラリが必要であることに注意して下さい。

% sudo dpkg --add-architecture i386
% sudo apt-get update
% sudo apt-get install libxft2:i386 libxext6:i386 libncurses5:i386

パープル・レイン

Princepurplerain

今日は雨なので、朝からこのアルバムを聴いていました。多分、1984年にこの映画を見たのだと思いますが、その後、レーザーディスクを購入し、何度も繰り返して見ました。

パープル・レインの演奏は本当に感動的で、息をするのも忘れる位でした。

グリーンリーヴズオヴサマー

green

私が(初めて)この曲を聴いていた時、私は人生について何も知りませんでした。人生とは、これからやってくるものだったのです。

グリーンフィールズやグリーンスリーヴスも、覚えていますか?

Wi-Fiテザリングを、Android 5.0.1で

tether2

あなたは、常に”192.168.43.*”というIPアドレスを受け取るようです。

例えば、ここを見て下さい:

https://android.googlesource.com/platform/frameworks/opt/net/wifi/+/android-5.0.1_r1/service/java/com/android/server/wifi/WifiStateMachine.java.

WifiStateMachine.java

                        if (ifcg != null) {
                            /* IP/netmask: 192.168.43.1/255.255.255.0 */
                            ifcg.setLinkAddress(new LinkAddress(
                                    NetworkUtils.numericToInetAddress("192.168.43.1"), 24));
                            ifcg.setInterfaceUp();
                            mNwService.setInterfaceConfig(intf, ifcg);
                        }