FPGA project : volt

module top(
    input   wire            sys_clk     ,
    input   wire            sys_rst_n   ,
    input   wire    [7:0]   ad_data     ,

    output  wire            ds          ,
    output  wire            oe          ,
    output  wire            shcp        ,
    output  wire            stcp        ,
    output  wire            ad_clk
);


    // 例化间连线
    wire    [15:0]          volt_w      ;
    wire    [19:00]         data_w      ;
    assign                  data_w = {4'b0000,volt_w} ;
    wire    [05:00]         point_w     ;
    assign                  point_w = 6'b001_000 ;
    wire                    sign_w      ;
    wire                    seg_en_w    ;
    assign                  seg_en_w = 1'b1 ;
dig_volt dig_volt_insert(
    .sys_clk                ( sys_clk    ) ,
    .sys_rst_n              ( sys_rst_n  ) ,
    .ad_data                ( ad_data    ) ,

    .volt                   ( volt_w     ) ,
    .sign                   ( sign_w     ) ,
    .ad_clk                 ( ad_clk     )
);

seg_595_dynamic seg_595_dynamic_insert(
    .sys_clk                ( sys_clk    ) ,
    .sys_rst_n              ( sys_rst_n  ) ,
    .data                   ( data_w     ) ,
    .point                  ( point_w    ) ,
    .sign                   ( sign_w     ) ,
    .seg_en                 ( seg_en_w   ) ,

    .ds                     ( ds         ) ,
    .oe                     ( oe         ) ,
    .shcp                   ( shcp       ) ,
    .stcp                   ( stcp       )    
);


endmodule

module dig_volt(
    input   wire            sys_clk     ,
    input   wire            sys_rst_n   ,
    input   wire    [7:0]   ad_data     ,

    output  reg     [15:0]  volt        ,
    output  reg             sign        ,
    output  wire            ad_clk
);
    // reg signal define
    reg                 cnt_ad_clk  ;
    reg                 ad_clk_reg  ; // 四分频。
    reg     [19:0]      cnt_1024    ;
    reg                 sum_en      ;
    reg                 sum_en_reg1 ;
    reg                 sum_en_reg2 ;
    reg     [19:0]      sum_1024    ;
    reg     [19:0]      data_medium ;
    reg     [19:0]      data_n_fenmm;
    reg     [19:0]      data_p_fenmm;
    reg     [28:0]      data_n      ;
    reg     [28:0]      data_p      ;
    reg     [15:0]      volt_reg    ;

    // reg                 cnt_ad_clk  ;
    always @(posedge sys_clk or negedge sys_rst_n) 
        if(~sys_rst_n) 
            cnt_ad_clk <= 1'b0 ;
        else 
            cnt_ad_clk <= cnt_ad_clk + 1'b1 ; // 溢出自动归零

    // reg                 ad_clk_reg  ;
    always @(posedge sys_clk or negedge sys_rst_n) 
        if(~sys_rst_n)
            ad_clk_reg <= 1'b0 ;
        else if(cnt_ad_clk == 1'b1)
            ad_clk_reg <= ~ad_clk_reg ;

    // reg     [19:0]      cnt_1024    ;
    always @(posedge ad_clk_reg or negedge sys_rst_n) 
        if(~sys_rst_n)
            cnt_1024 <= 20'd0 ;
        else if(cnt_1024 == 20'd1025)
            cnt_1024 <= cnt_1024 ;
        else 
            cnt_1024 <= cnt_1024 + 1'b1 ;

    // reg                 sum_en      ;
    always @(posedge ad_clk_reg or negedge sys_rst_n) 
        if(~sys_rst_n)
            sum_en <= 1'b0 ;
        else if(cnt_1024 == 20'd1025)
            sum_en <= 1'b1 ;
        else 
            sum_en <= 1'b0 ;
    // reg                 sum_en_reg1  ;
    always @(posedge ad_clk_reg or negedge sys_rst_n) 
        if(~sys_rst_n)
            sum_en_reg1 <= 1'b0 ;
        else 
            sum_en_reg1 <= sum_en ;    
    // reg                 sum_en_reg2  ;
    always @(posedge ad_clk_reg or negedge sys_rst_n) 
        if(~sys_rst_n)
            sum_en_reg2 <= 1'b0 ;
        else 
            sum_en_reg2 <= sum_en_reg1 ;

    // reg     [19:0]      sum_1024    ;
    always @(posedge ad_clk_reg or negedge sys_rst_n) 
        if(~sys_rst_n)
            sum_1024 <= 20'd0 ;
        else if(cnt_1024 >= 20'd1 && cnt_1024 <= 20'd1024)
            sum_1024 <= sum_1024 + ad_data ;
        else
            sum_1024 <= sum_1024 ;

    // reg     [19:0]      data_medium ;
    always @(posedge ad_clk_reg or negedge sys_rst_n) 
        if(~sys_rst_n)
            data_medium <= 20'd0 ;
        else if(cnt_1024 == 20'd1025)
            data_medium <= sum_1024 / 20'd1024 ;
        else 
            data_medium <= data_medium ;

    // reg     [19:0]      data_n_fenmm;
    // reg     [19:0]      data_p_fenmm;
    always @(posedge ad_clk_reg or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            data_n_fenmm <= 20'd0 ;
            data_p_fenmm <= 20'd0 ;
        end else begin
            if(sum_en == 1'b1) begin
                data_n_fenmm <= data_medium  + 1'd1 ;
                data_p_fenmm <= 20'd256 - data_medium;
            end
        end
    end
    // reg     [28:0]      data_n      ;
    // reg     [28:0]      data_p      ;
    always @(posedge ad_clk_reg or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            data_n <= 26'd0 ;
            data_p <= 26'd0 ;
        end else begin
            if(sum_en_reg1 == 1'b1) begin
                data_n <= 26'd40960000 / data_n_fenmm ;
                data_p <= 26'd40960000 / data_p_fenmm  ;
            end else begin
                data_n <= 26'd0 ;
                data_p <= 26'd0 ;
            end
        end
    end
    // reg     [15:0]      volt_reg    ;
    always @(posedge ad_clk_reg or negedge sys_rst_n) 
        if(~sys_rst_n) 
            volt_reg <= 16'd0 ;
        else if(sum_en_reg2 == 1'b1 && ad_data >= data_medium)
            volt_reg <= ((data_p * (ad_data - data_medium)) >> 4'd13) ;
        else if(sum_en_reg2 == 1'b1 && ad_data < data_medium)
            volt_reg <= ((data_n * (data_medium - ad_data)) >> 4'd13) ;
        else 
            volt_reg <= 16'd0 ;
    // reg     [15:0]  volt        ,
    always @(posedge ad_clk_reg or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            volt <= 16'd0 ;
        end else begin
            volt <= volt_reg ;
        end
    end
    // sign
    always @(posedge ad_clk_reg or negedge sys_rst_n) 
        if(~sys_rst_n) 
            sign <= 1'b0 ;
        else if(sum_en_reg2 == 1'b1 && ad_data < data_medium) // 小于中值有符号位.
            sign <= 1'b1 ;
        else 
            sign <= 1'b0 ;
    // wire             ad_clk
    assign ad_clk = ~ad_clk_reg ;
endmodule

`timescale 1ns/1ns
module test_top();
    reg             sys_clk     ;
    reg             sys_rst_n   ;
    reg     [7:0]   ad_data     ;

    reg             data_en     ; // 当数据使能信号为低电平,ad_data == 125 ;高,把ad_data_reg 赋值给ad_data.
    reg     [7:0]   ad_data_reg ; // 数据寄存。

    wire            ds          ;
    wire            oe          ;
    wire            shcp        ;
    wire            stcp        ;
    wire            ad_clk      ;

top top_insert(
    .sys_clk                ( sys_clk    ) ,
    .sys_rst_n              ( sys_rst_n  ) ,
    .ad_data                ( ad_data    ) ,

    .ds                     ( ds         ) ,
    .oe                     ( oe         ) ,
    .shcp                   ( shcp       ) ,
    .stcp                   ( stcp       ) ,
    .ad_clk                 ( ad_clk     )
);

    parameter CYCLE = 20 ;
    initial begin
        sys_clk = 1'b1      ;
        sys_rst_n <= 1'b0   ;
        data_en   <= 1'b0 ;
        #(CYCLE * 10)       ;
        sys_rst_n <= 1'b1   ;
        #(CYCLE * 4 * 5000) ;
        data_en <= 1'b1 ;
    end
    always #(CYCLE / 2) sys_clk = ~sys_clk ;


    // reg             data_en     ; // 当数据使能信号为低电平,ad_data == 125 ;高,把ad_data_reg 赋值给ad_data.
    // reg     [7:0]   ad_data_reg ; // 数据寄存。
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            ad_data_reg <= 1'b0 ;
        end else begin
            ad_data_reg <= ad_data_reg + 1'b1 ;
        end
    end
    // reg     [7:0]   ad_data     ;
    always @(posedge ad_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            ad_data <= 1'b0 ;
        end else begin
            if(data_en == 1'b0) begin
                ad_data <= 8'd125 ;
            end else begin
                ad_data <= ad_data_reg ;
            end
        end
    end


endmodule
相关推荐
9527华安3 小时前
FPGA多路红外相机视频拼接输出,提供2套工程源码和技术支持
图像处理·fpga开发·视频拼接·红外相机
可知可知不可知6 小时前
详解VHDL如何编写Testbench
fpga开发
szxinmai主板定制专家19 小时前
【国产NI替代】32振动/电压(配置复合型)高精度终端采集板卡,应用于复杂的大型测量场景
fpga开发
9527华安21 小时前
FPGA实时红外相机采集输出系统,提供工程源码和技术支持
图像处理·fpga开发·红外相机
博览鸿蒙1 天前
FPGA自学之路:到底有多崎岖?
fpga开发
搬砖的小码农_Sky1 天前
硬件设计:RS485电平标准
单片机·嵌入式硬件·fpga开发
搬砖的小码农_Sky1 天前
硬件设计:LVDS电平标准
嵌入式硬件·fpga开发
∑狸猫不是猫1 天前
(15)CT137A- 按键消抖设计
fpga开发
我爱C编程1 天前
基于FPGA的2ASK+帧同步系统verilog开发,包含testbench,高斯信道,误码统计,可设置SNR
fpga开发·信道·帧同步·snr·2ask·误码统计
可知可知不可知2 天前
明解FPGA中LUT原理
fpga开发