IIC接口E2PROM(AT24C64) 读写VERILOG 驱动源码+仿真激励文件: module i2c_dri #( parameter SLAVE_ADDR = 7'b1010000 , //EEPROM从机地址 parameter CLK_FREQ = 26'd50_000_000, //模块输入的时钟频率 parameter I2C_FREQ = 18'd250_000 //IIC_SCL的时钟频率 ) ( input clk , input rst_n , //i2c interface input i2c_exec , //I2C触发执行信号 input bit_ctrl , //字地址位控制(16b/8b) input i2c_rh_wl , //I2C读写控制信号 input [15:0] i2c_addr , //I2C器件内地址 input [ 7:0] i2c_data_w , //I2C要写的数据 output reg [ 7:0] i2c_data_r , //I2C读出的数据 output reg i2c_done , //I2C一次操作完成 output reg i2c_ack , //I2C应答标志 0:应答 1:未应答 output reg scl , //I2C的SCL时钟信号 inout sda , //I2C的SDA信号 //user interface output reg dri_clk //驱动I2C操作的驱动时钟 ); //localparam define localparam st_idle = 8'b0000_0001; //空闲状态 localparam st_sladdr = 8'b0000_0010; //发送器件地址(slave address) localparam st_addr16 = 8'b0000_0100; //发送16位字地址 localparam st_addr8 = 8'b0000_1000; //发送8位字地址 localparam st_data_wr = 8'b0001_0000; //写数据(8 bit) localparam st_addr_rd = 8'b0010_0000; //发送器件地址读 localparam st_data_rd = 8'b0100_0000; //读数据(8 bit) localparam st_stop = 8'b1000_0000; //结束I2C操作 //reg define reg sda_dir ; //I2C数据(SDA)方向控制 reg sda_out ; //SDA输出信号 reg st_done ; //状态结束 reg wr_flag ; //写标志 reg [ 6:0] cnt ; //计数 reg [ 7:0] cur_state ; //状态机当前状态 reg [ 7:0] next_state; //状态机下一状态 reg [15:0] addr_t ; //地址 reg [ 7:0] data_r ; //读取的数据 reg [ 7:0] data_wr_t ; //I2C需写的数据的临时寄存 reg [ 9:0] clk_cnt ; //分频时
FPGA设计 6位8通道同步采集AD芯片MAX11046 Verilog驱动源码: /* * @Description: MAX11046 divider */ module max11046_dev( input clk, input rst_n, input en, //开始采集信号 input sny_clk, //同步信号 input eoc, //转换结束输出 output reg wr, //写使能 输入(低电平有效) output reg cs, //片选 输入(低电平有效) output reg rd, //读使能 输入(低电平有效) output convst, //启动转换 输入(上升沿结束采样,并开始对捕获的样本进行转换。 当COVST为低电平时, ADC处于采集模式) inout [15:0] db, //数据信号 输入输出 output [127:0] mdb, //数据输出 output reg rev_done //获取数据完成 ); reg [15:0] dataBus; reg [127:0] r_mdb; reg [3:0] channel; reg [4:0] cur_state; reg [4:0] next_state; reg [7:0] time_cnt; reg time_cnt_clr; //计数器清零信号 reg st_dong; parameter st_cfg = 5'b0_0001; //配置状态 parameter st_mesu = 5'b0_0010; //采样状态 parameter st_covt = 5'b0_0100; //转换状态 parameter st_rdata = 5'b0_1000; //接收单通道数据 parameter st_nover = 5'b1_0000; //接收数据 //寄存器配置 parameter cr0 = 1'b0; //采集模式 0:convst 下降沿开始采集上升沿开始转换 1:一旦先前的转换完成,获取模式就会启动。 上升沿开始转换 parameter cr1 = 1'b0; //必须为0 parameter cr2 = 1'b1; //0:偏移二进制 1:补码二进制 parameter cr3 = 1'b0; //0:内部基准电源 1:外部基准电源 assign db = wr ? 16'hzzzz : dataBus ; assign convst = sny_clk; assign mdb = r_mdb; //系统主频50MHZ,每个节拍20nS always @(posedge clk or negedge rst_n) begin if(!rst_n) time_cnt <= 8'b0; else if(time_cnt_clr) time_cnt <= 8'b0; else time_cnt <= time_cnt + 8'b1; end always @ (posedge clk or negedge rst_n) begin if(!rst_n) cur_state <= st_cfg; else cur_state <= next_state ; end always @ (*) begin case(cur_state) st_cfg:begin if(st_dong)begin next_state = st_mesu; end else begin next_state = st_cfg; end end st_mesu:begin if(st_dong)begin next_state = st_covt; end else begin next_state = st_mesu;
4通道12bit位宽的DA芯片AD5724 Verilog驱动源码+芯片技术手册: odule ad5724_ctrl #( parameter DATA_WIDTH = 12 , parameter RANG_WIDTH = 16 )( input wire clk , //这里的时钟频率为50M,如果降低时钟频率请同步降低触发周期i_trig // 提高频率需要代码中o_da5724_sclk的周期 input wire rst_n , input wire i_trig , //DA输出数据更新触发信号,在50M时钟频率下可以设置为5us input wire [DATA_WIDTH - 1 : 0] i_ch1_data , input wire [DATA_WIDTH - 1 : 0] i_ch2_data , input wire [DATA_WIDTH - 1 : 0] i_ch3_data , input wire [DATA_WIDTH - 1 : 0] i_ch4_data , input wire [RANG_WIDTH - 1 : 0] i_out_range , //设置为16'd4 表示输出正负10V input wire i_ad_en , input wire i_da5724_sdout , output wire o_da5724_sclk , output wire o_da5724_sdin , output wire o_da5724_sync_n , output wire o_da5724_ldac_n , output wire o_da5724_clr_n ); localparam POWER_CFG_REF = 24'h10000f ; localparam DV_RANG_CFG_REF = 8'h0c ; localparam CH_A_REF = 8'h00 ; localparam CH_B_REF = 8'h01 ; localparam CH_C_REF = 8'h02 ; localparam CH_D_REF = 8'h03 ; localparam CH_NUM_WIDTH = 2 ; localparam CFG_NUM_WIDTH = 3 ; localparam WAIT_CNT_WIDTH = 4 ; localparam DAC_DATA_WIDTH = 16 ; localparam REG_DATA_WIDTH = 24 ; localparam TRAN_CNT_WIDTH = 5 ; localparam CTRL_ST_WIDTH = 10 ; localparam IDLE = 10'b0000000001 , INIT_PWR = 10'b0000000010 , TRANS_OP_HIGH = 10'b0000000100 , TRANS_OP_LOW = 10'b0000001000 , LDAC_SET = 10'b00000100
温度传感器ds18b20读写Verilog驱动源码Quartus工程文件,FPGA型号Cyclone4E系列中的EP4CE10F17C8,Quartus版本18.0。 module temp_disp( input sys_clk , //输入的系统时钟 input sys_rst_n , //输入的复位信号 inout dq , //ds18b20温度传感器单总线 output [5:0] sel , //输出数码管位选信号 output [7:0] seg_led //输出数码管段选信号 ); //parameter define parameter POINT = 6'b000100; // 数码管小数点的位置 //wire define wire [19:0] temp_data; // 温度数值 wire sign; // 符号位 //***************************************************** //** main code //***************************************************** //例化动态数码管驱动模块 seg_led u_seg_led( //module clock .clk (sys_clk ), // 时钟信号 .rst_n (sys_rst_n), // 复位信号 //seg_led interface .seg_sel (sel ), // 位选 .seg_led (seg_led ), // 段选 //user interface .data (temp_data), // 显示的数值 .point (POINT ), // 小数点具体显示的位置,从高到低,高电平有效 .en (1'b1 ), // 数码管使能信号 .sign (sign ) // 符号位(高电平显示“-”号) ); //例化DS18B20驱动模块 ds18b20_dri u1_ds18b20_dri( //module clock .clk (sys_clk ), // 时钟信号(50MHz) .rst_n (sys_rst_n), // 复位信号 //user interface .dq (dq ), // DS18B20的DQ引脚数据 .temp_data (temp_data), // 转换后得到的温度值 .sign (sign ) // 符号位 ); endmodule
温湿度传感器DHT11读写Verilog驱动源码Quartus工程文件,FPGA读取DHT11温度湿度数据并通过数码管显示输出,FPGA型号Cyclone4E系列中的EP4CE10F17C8,Quartus版本18.0。 module top_dht11( input sys_clk , //系统时钟 input sys_rst_n, //系统复位 inout dht11 , //DHT11总线 input key , //按键 output [5:0] sel , //数码管位选信号 output [7:0] seg_led //数码管段选信号 ); //wire define wire [31:0] data_valid; wire [19:0] data ; wire [5:0] point ; //***************************************************** //** main code //***************************************************** //dht11驱动模块 dht11_drive u_dht11_drive ( .sys_clk (sys_clk), .rst_n (sys_rst_n), .dht11 (dht11), .data_valid (data_valid) ); //按键消抖模块 key_debounce u_key_debounce( .sys_clk (sys_clk), .sys_rst_n (sys_rst_n), .key (key), .key_flag (key_flag), .key_value (key_value) ); //按键控制温/湿度显示 dht11_key u_dht11_key( .sys_clk (sys_clk), .sys_rst_n (sys_rst_n), .key_flag (key_flag), .key_value (key_value), .data_valid (data_valid), .data (data), .sign (sign), .en (en), .point (point) ); //动态数码管显示模块 seg_led u_seg_led ( .clk (sys_clk), .rst_n (sys_rst_n), .seg_sel (sel), .seg_led (seg_led), .data (data), .point (point), .en (en), .sign (sign) ); endmodule
I2C接口距离传感器ap3216c读写Verilog驱动源码Quartus工程文件,FPGA型号Cyclone4E系列中的EP4CE10F17C8,Quartus版本18.0。 module ap3216c_top( //global clock input sys_clk , // 系统时钟 input sys_rst_n , // 系统复位 //ap3216c interface output ap_scl , // i2c时钟线 inout ap_sda , // i2c数据线 //user interface output [3:0] led , // led灯接口 output [5:0] sel , // 数码管位选 output [7:0] seg_led // 数码管段选 ); //parameter define parameter SLAVE_ADDR = 7'h1e ; // 器件地址 parameter BIT_CTRL = 1'b0 ; // 字地址位控制参数(16b/8b) parameter CLK_FREQ = 26'd50_000_000; // i2c_dri模块的驱动时钟频率(CLK_FREQ) parameter I2C_FREQ = 18'd250_000 ; // I2C的SCL时钟频率 //wire define wire clk ; // I2C操作时钟 wire i2c_exec ; // i2c触发控制 wire [15:0] i2c_addr ; // i2c操作地址 wire [ 7:0] i2c_data_w; // i2c写入的数据 wire i2c_done ; // i2c操作结束标志 wire i2c_ack ; // I2C应答标志 0:应答 1:未应答 wire i2c_rh_wl ; // i2c读写控制 wire [ 7:0] i2c_data_r; // i2c读出的数据 wire [15:0] als_data ; // ALS的数据 wire [ 9:0] ps_data ; // PS的数据 //***************************************************** //** main code //***************************************************** //例化i2c_dri,调用IIC协议 i2c_dri #( .SLAVE_ADDR (SLAVE_ADDR), // slave address从机地址,放此处方便参数传递 .CLK_FREQ (CLK_FREQ ), // i2c_dri模块的驱动时钟频率(CLK_FREQ) .I2C_FREQ (I2C_FREQ ) // I2C的SCL时钟频率 ) u_i2c_dri( //global clock .clk (sys_clk ), // i2c_dri模块的驱动时钟(CLK_FREQ) .rst_n (sys_rst_n ), // 复位信号 //i2c interface .i2c_exec
I2C接口RTC实时时钟pcf8563读写Verilog驱动源码Quartus工程文件,FPGA型号Cyclone4E系列中的EP4CE10F17C8,Quartus版本18.0。 module rtc( //system clock input sys_clk , // 系统时钟 input sys_rst_n , // 系统复位 //pcf8563 interface output rtc_scl , // i2c时钟线 inout rtc_sda , // i2c数据线 //user interface input key2 , // 开关按键 output [5:0] sel , // 数码管位选 output [7:0] seg_led // 数码管段选 ); //parameter define parameter SLAVE_ADDR = 7'h51 ; // 器件地址 parameter BIT_CTRL = 1'b0 ; // 字地址位控制参数(16b/8b) parameter CLK_FREQ = 26'd50_000_000; // i2c_dri模块的驱动时钟频率(CLK_FREQ) parameter I2C_FREQ = 18'd250_000 ; // I2C的SCL时钟频率 parameter POINT = 6'b010100 ; // 控制点亮数码管小数点的位置 //初始时间设置,从高到低为年到秒,各占8bit parameter TIME_INI = 48'h18_05_23_09_30_00; //wire define wire clk ; // I2C操作时钟 wire i2c_exec ; // i2c触发控制 wire [15:0] i2c_addr ; // i2c操作地址 wire [ 7:0] i2c_data_w; // i2c写入的数据 wire i2c_done ; // i2c操作结束标志 wire i2c_ack ; // I2C应答标志 0:应答 1:未应答 wire i2c_rh_wl ; // i2c读写控制 wire [ 7:0] i2c_data_r; // i2c读出的数据 wire [23:0] num ; // 数码管要显示的数据 wire key_value ; // 按键消抖后的数据 //***************************************************** //** main code //***************************************************** //例化i2c_dri,调用IIC协议 i2c_dri #( .SLAVE_ADDR (SLAVE_ADDR), // slave address从机地址,放此处方便参数传递 .CLK_FREQ (CLK_FREQ ), // i2c_dri模块的驱动时钟频率(CLK_FREQ) .I2C_FREQ (I2C_FREQ ) // I2C的SCL时钟频率 ) u_i2c_dri( //global clock .clk (sys_clk ), // i2c_dri模块的驱动时钟(CLK_F