2011-03-21

Verilog ашиглан цуваа танигч хийсэн минь

Verilog хэрэглээд цуваа танигч хийснийгээ та бүхэнтэй хуваалцья гэж бодлоо. Электрон хэлхээ нь хир зай эзлэх вэ, хэлхээ их халах уу гэх мэт асуудлуудыг бодолцоогүйг анхаарна уу!

Энд цуваа танигчийгаа finite-state machine болон цуваа оролт, паралель гаралттай shift register ашиглан хийсэн юм.

Finite-state machine


`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Module Name:   fsm
// Tool versions: Xilinx ISE 12.1
// Description:
//                Sequence detector using FSM
//
//////////////////////////////////////////////////////////////////////////////////
module fsm(clk, reset, inp, outp);
  input clk;
  input reset;
  input inp;
  output outp;
 
  reg[2:0] state;
  reg outp;
 
  always @(posedge clk) // always trigger on clk
     begin
        if (reset)  // check if reset
           begin
              state <= 3'b000;                outp <= 1'b0;             end          else        // else update outp             begin                if (state == 3'b111 & inp == 1'b0)                   outp <= 1'b1;                else                   outp <= 1'b0;             end          case(state) // state transition          3'b000:             if (inp == 1'b1) state <= 3'b001;             else state <= 3'b000;          3'b001:             if (inp == 1'b0) state <= 3'b010;             else state <= 3'b000;          3'b010:             if (inp == 1'b0) state <= 3'b011;             else state <= 3'b000;          3'b011:             if (inp == 1'b1) state <= 3'b100;             else state <= 3'b000;          3'b100:             if (inp == 1'b0) state <= 3'b101;             else state <= 3'b000;          3'b101:             if (inp == 1'b1) state <= 3'b110;             else state <= 3'b000;          3'b110:             if (inp == 1'b1) state <= 3'b111;             else state <= 3'b000;          3'b111:             state <= 3'b000;          default:             state <= 3'b000;          endcase       end       endmodule 

Хэлхээ нь ийм болж байна:

Shift-register


`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Module Name:   shr
// Tool versions: Xilinx ISE 12.1
// Description: 
//                Sequence detector using shift register
//
//////////////////////////////////////////////////////////////////////////////////
module shr(clk, reset, inp, outp);
   input clk;
   input reset;
   input inp;
   output outp;
   
   reg[7:0] shr;
   reg outp;
   
   always @(posedge clk) // always trigger on clk
      begin
         if (reset)  // check if reset
            begin
               shr <= 8'b00000000;
               outp <= 1'b0;
            end
         else
            begin
               shr <= shr << 1;
               shr[0] <= inp;
               if (shr == 8'b10010110)
                  outp <= 1'b1;
               else
                  outp <= 1'b0;
            end
         
      end

endmodule

За тэгээд 2уланг нь доорх тест модулиар ажиллууллаа даа:


`timescale 1ns / 1ps
////////////////////////////////////////////////////////////////////////////////
// Module Name:   shr_test
// Tool versions: Xilinx ISE 12.1
// Description:
//                Verilog Test Fixture created by ISE for modules:
//                   shr
//
////////////////////////////////////////////////////////////////////////////////

module shr_test;

// Inputs
reg clk;
reg reset;
reg inp;

// Outputs
wire outp;

// Instantiate the Unit Under Test (UUT)
shr uut (
 .clk(clk),
 .reset(reset),
 .inp(inp),
 .outp(outp)
);

always #5 clk = ~clk;

initial begin
 // Initialize
 clk = 1;
 inp = 0;
 reset = 0;

 // reset=1 when clk rises and reset=0
 // in the next rise of clk
 #9 reset = 1;
 #3 reset = 0;

 // Stimulus
 #1 inp = 1;
 #10 inp = 0;
 #10 inp = 0;
 #10 inp = 1;
 #10 inp = 0;
 #10 inp = 1;
 #10 inp = 1;
 #10 inp = 0;
 #30
 $finish;
end
    
endmodule

За тэгсэн чинь доорх симуляцууд гараад ирлээ.

Finite-state machine

Shift register