欢迎光临散文网 会员登陆 & 注册

VERILOG-A二进制码转温度计码译码器代码

2022-03-01 21:49 作者:核弹君·  | 我要投稿

最近项目需要用到一个二进制码转温度计译码的模块,放在Virtuoso中仿真使用

但是一开始我只会写Verilog代码,而Verilog代码只能用AMS仿真,比较麻烦

所以我自己尝试完成了一个Verilog-A描述的二进制转温度计码译码器

输入的高6位采取温度计码译码,低两位直接二进制译码

模块的Verilog描述如下:

module decoder

(

    input               clk,

    input               rst_n,

    input               [7:0]indata,

    output              [1:0]bin_data,

    output  reg         [62:0]therm_data

);


reg         [7:0]data;

   

always@(posedge clk or negedge rst_n)

begin

    if(~rst_n)

    begin

        data <= 8'b0;

    end

    else begin

        data <= indata;

    end

end


assign bin_data[1:0] = data[1:0];


always@(*)

begin

    case(data[7:2])

     6'd0:therm_data<=63'b0000000_00000000_00000000_00000000_0000000_00000000_00000000_00000000;

     6'd1:therm_data<=63'b0000000_00000000_00000000_00000000_0000000_00000000_00000000_00000001;

     6'd2:therm_data<=63'b0000000_00000000_00000000_00000000_0000000_00000000_00000000_00000011;

     6'd3:therm_data<=63'b0000000_00000000_00000000_00000000_0000000_00000000_00000000_00000111;

     6'd4:therm_data<=63'b0000000_00000000_00000000_00000000_0000000_00000000_00000000_00001111;

     6'd5:therm_data<=63'b0000000_00000000_00000000_00000000_0000000_00000000_00000000_00011111;

     6'd6:therm_data<=63'b0000000_00000000_00000000_00000000_0000000_00000000_00000000_00111111;

     6'd7:therm_data<=63'b0000000_00000000_00000000_00000000_0000000_00000000_00000000_01111111;

     6'd8:therm_data<=63'b0000000_00000000_00000000_00000000_0000000_00000000_00000000_11111111;

     6'd9:therm_data<=63'b0000000_00000000_00000000_00000000_0000000_00000000_00000001_11111111;

    6'd10:therm_data<=63'b0000000_00000000_00000000_00000000_0000000_00000000_00000011_11111111;

    6'd11:therm_data<=63'b0000000_00000000_00000000_00000000_0000000_00000000_00000111_11111111;

    6'd12:therm_data<=63'b0000000_00000000_00000000_00000000_0000000_00000000_00001111_11111111;

    6'd13:therm_data<=63'b0000000_00000000_00000000_00000000_0000000_00000000_00011111_11111111;

    6'd14:therm_data<=63'b0000000_00000000_00000000_00000000_0000000_00000000_00111111_11111111;

    6'd15:therm_data<=63'b0000000_00000000_00000000_00000000_0000000_00000000_01111111_11111111;

    6'd16:therm_data<=63'b0000000_00000000_00000000_00000000_0000000_00000000_11111111_11111111;

    6'd17:therm_data<=63'b0000000_00000000_00000000_00000000_0000000_00000001_11111111_11111111;

    6'd18:therm_data<=63'b0000000_00000000_00000000_00000000_0000000_00000011_11111111_11111111;

    6'd19:therm_data<=63'b0000000_00000000_00000000_00000000_0000000_00000111_11111111_11111111;

    6'd20:therm_data<=63'b0000000_00000000_00000000_00000000_0000000_00001111_11111111_11111111;

    6'd21:therm_data<=63'b0000000_00000000_00000000_00000000_0000000_00011111_11111111_11111111;

    6'd22:therm_data<=63'b0000000_00000000_00000000_00000000_0000000_00111111_11111111_11111111;

    6'd23:therm_data<=63'b0000000_00000000_00000000_00000000_0000000_01111111_11111111_11111111;

    6'd24:therm_data<=63'b0000000_00000000_00000000_00000000_0000000_11111111_11111111_11111111;

    6'd25:therm_data<=63'b0000000_00000000_00000000_00000000_0000001_11111111_11111111_11111111;

    6'd26:therm_data<=63'b0000000_00000000_00000000_00000000_0000011_11111111_11111111_11111111;

    6'd27:therm_data<=63'b0000000_00000000_00000000_00000000_0000111_11111111_11111111_11111111;

    6'd28:therm_data<=63'b0000000_00000000_00000000_00000000_0001111_11111111_11111111_11111111;

    6'd29:therm_data<=63'b0000000_00000000_00000000_00000000_0011111_11111111_11111111_11111111;

    6'd30:therm_data<=63'b0000000_00000000_00000000_00000000_0111111_11111111_11111111_11111111;

    6'd31:therm_data<=63'b0000000_00000000_00000000_00000000_1111111_11111111_11111111_11111111;

    6'd32:therm_data<=63'b0000000_00000000_00000000_00000001_1111111_11111111_11111111_11111111;

    6'd33:therm_data<=63'b0000000_00000000_00000000_00000001_1111111_11111111_11111111_11111111;

    6'd34:therm_data<=63'b0000000_00000000_00000000_00000011_1111111_11111111_11111111_11111111;

    6'd35:therm_data<=63'b0000000_00000000_00000000_00000111_1111111_11111111_11111111_11111111;

    6'd36:therm_data<=63'b0000000_00000000_00000000_00001111_1111111_11111111_11111111_11111111;

    6'd37:therm_data<=63'b0000000_00000000_00000000_00011111_1111111_11111111_11111111_11111111;

    6'd38:therm_data<=63'b0000000_00000000_00000000_00111111_1111111_11111111_11111111_11111111;

    6'd39:therm_data<=63'b0000000_00000000_00000000_01111111_1111111_11111111_11111111_11111111;

    6'd40:therm_data<=63'b0000000_00000000_00000000_11111111_1111111_11111111_11111111_11111111;

    6'd41:therm_data<=63'b0000000_00000000_00000001_11111111_1111111_11111111_11111111_11111111;

    6'd42:therm_data<=63'b0000000_00000000_00000011_11111111_1111111_11111111_11111111_11111111;

    6'd43:therm_data<=63'b0000000_00000000_00000111_11111111_1111111_11111111_11111111_11111111;

    6'd44:therm_data<=63'b0000000_00000000_00001111_11111111_1111111_11111111_11111111_11111111;

    6'd45:therm_data<=63'b0000000_00000000_00011111_11111111_1111111_11111111_11111111_11111111;

    6'd46:therm_data<=63'b0000000_00000000_00111111_11111111_1111111_11111111_11111111_11111111;

    6'd47:therm_data<=63'b0000000_00000000_01111111_11111111_1111111_11111111_11111111_11111111;

    6'd48:therm_data<=63'b0000000_00000000_11111111_11111111_1111111_11111111_11111111_11111111;

    6'd49:therm_data<=63'b0000000_00000001_11111111_11111111_1111111_11111111_11111111_11111111;

    6'd50:therm_data<=63'b0000000_00000011_11111111_11111111_1111111_11111111_11111111_11111111;

    6'd51:therm_data<=63'b0000000_00000111_11111111_11111111_1111111_11111111_11111111_11111111;

    6'd52:therm_data<=63'b0000000_00001111_11111111_11111111_1111111_11111111_11111111_11111111;

    6'd53:therm_data<=63'b0000000_00011111_11111111_11111111_1111111_11111111_11111111_11111111;

    6'd54:therm_data<=63'b0000000_00111111_11111111_11111111_1111111_11111111_11111111_11111111;

    6'd55:therm_data<=63'b0000000_01111111_11111111_11111111_1111111_11111111_11111111_11111111;

    6'd56:therm_data<=63'b0000000_11111111_11111111_11111111_1111111_11111111_11111111_11111111;

    6'd57:therm_data<=63'b0000001_11111111_11111111_11111111_1111111_11111111_11111111_11111111;

    6'd58:therm_data<=63'b0000011_11111111_11111111_11111111_1111111_11111111_11111111_11111111;

    6'd59:therm_data<=63'b0000111_11111111_11111111_11111111_1111111_11111111_11111111_11111111;

    6'd60:therm_data<=63'b0001111_11111111_11111111_11111111_1111111_11111111_11111111_11111111;

    6'd61:therm_data<=63'b0011111_11111111_11111111_11111111_1111111_11111111_11111111_11111111;

    6'd62:therm_data<=63'b0111111_11111111_11111111_11111111_1111111_11111111_11111111_11111111;

    6'd63:therm_data<=63'b1111111_11111111_11111111_11111111_1111111_11111111_11111111_11111111;

    endcase

end

endmodule


上述代码转换为verilog-a后如下:

二进制转温度计码 译码器 VERILOG-A代码

`include "constants.vams"

`include "disciplines.vams"


module DECODER( VDD, GND, CLK, RST_N, INDATA, BIN_DATA, THERM_DATA);


input VDD, GND, CLK ,RST_N ;

electrical VDD, GND, CLK ,RST_N;


input [7:0] INDATA ;

electrical  [7:0] INDATA ;


output [1:0] BIN_DATA ;

electrical [1:0] BIN_DATA ;


output  [62:0] THERM_DATA ;

electrical [62:0] THERM_DATA ;


integer count = 0;

integer clock = 0;

integer flag_clk = 0;


integer indata [7:0];


integer bin_in_data [1:0];

integer th_in_data [5:0];

integer th_out_data  [62:0];


integer sum;


parameter real td = 0.1n;  

parameter real tr = 0.1n;  

parameter real tf = 0.1n;

parameter real vth_h = 0.9; // threshold voltage at inputs

parameter real vth_l = 0.3; // threshold voltage at inputs


genvar i ;


//clock

analog begin

        @(initial_step) begin

            count = 0 ;

            clock = 0 ;

            flag_clk = 0 ;

        end


        @( cross( V(CLK,GND)- V(VDD,GND), +1 ) ) begin  

            clock = 1 ;

            count = count + 1 ;

            if(count >= 100 ) count = 0 ;

        end


        @( cross( clock - 1 , +1) )  begin

            if(clock != 0) clock = 0 ;

            flag_clk = 1 ;  

        end


        if (V(RST_N)<vth_l) begin

            count = 0 ;

            clock = 0 ;

            flag_clk = 0 ;

        end


       

    end

   

// simple

    analog begin

        @( cross( flag_clk - 1 , +1) )  begin

            flag_clk = 0 ;

            for(i=0; i<8; i=i+1) begin

                if (V(INDATA[i]) > vth_h) indata[i] = 1;

                else indata[i] = 0;

            end

        end


        if (V(RST_N)< vth_l) begin

            indata[7] = 0 ;

            indata[6] = 0 ;

            indata[5] = 0 ;

            indata[4] = 0 ;

            indata[3] = 0 ;

            indata[2] = 0 ;

            indata[1] = 0 ;

            indata[0] = 0 ;

        end

       

        th_in_data[5] = indata[7];

        th_in_data[4] = indata[6];

        th_in_data[3] = indata[5];

        th_in_data[2] = indata[4];

        th_in_data[1] = indata[3];

        th_in_data[0] = indata[2];

        bin_in_data[1] = indata[1];

        bin_in_data[0] = indata[0];

    end


//                __                     __      

//               /\ \__                 /\ \__  

//   ___   __  __\ \ ,_\  _____   __  __\ \ ,_\  

//  / __`\/\ \/\ \\ \ \/ /\ '__`\/\ \/\ \\ \ \/  

// /\ \L\ \ \ \_\ \\ \ \_\ \ \L\ \ \ \_\ \\ \ \_

// \ \____/\ \____/ \ \__\\ \ ,__/\ \____/ \ \__\

//  \/___/  \/___/   \/__/ \ \ \/  \/___/   \/__/

//                          \ \_\                

//                           \/_/                


// Signal-Output


analog begin

    sum = 0;

    generate i (0,5)

        sum=sum+th_in_data[i]*pow(2,i);  

   

    for (i=0; i<63; i=i+1) begin

        if(i<sum)

            th_out_data[i]=1;

        else

            th_out_data[i]=0;

    end


    generate i (62,0)

        V(THERM_DATA[i])<+transition((V(VDD,GND)*th_out_data[i]),td,tr,tf);

   

    generate i (1,0)

        V(BIN_DATA[i])<+transition((V(VDD,GND)*bin_in_data[i]),td,tr,tf);


end


endmodule


演示结果可以移步投稿的视频观看,有问题可以在视频下方留言

VERILOG-A二进制码转温度计码译码器代码的评论 (共 条)

分享到微博请遵守国家法律