首页 > 代码库 > ad7928
ad7928
module ad_pro( clk,rst_n, smg1,smg2,smg3, dout,cs_n,din,clk_50k//12.5M ); input clk; input rst_n; input dout; output reg [7:0] smg1; output reg [7:0] smg2; output reg [7:0] smg3; output reg cs_n; output reg din; output reg clk_50k; //50K时钟 reg [8:0] cnt_50k; always@(negedge clk or negedge rst_n) if(!rst_n)begin cnt_50k <= ‘d0; clk_50k <= ‘d0; end else if(cnt_50k == 2‘d2)begin //12.5M cnt_50k <= ‘d0; clk_50k =~ clk_50k; end else cnt_50k <= cnt_50k + 1‘b1; //fsm parameter din_regis = 16‘b100_001_110_001_0000; reg [3:0] state; reg [15:0] ad_buffer; reg [9:0] ad_buffer1; reg [3:0] num_din; reg [3:0] num_dout; reg [15:0] temp; always @(posedge clk_50k or negedge rst_n) if(!rst_n)begin cs_n <= 1‘d1; din <= 1‘d1; state <= ‘d0; num_din <= 4‘d15; num_dout <= ‘d0; ad_buffer <= ‘d0; ad_buffer1 <= ‘d0; end else case(state) 4‘d0:begin cs_n <= 1‘d1; state <= state + 1‘b1; num_din <= 4‘d15; num_dout <= 4‘d0; ad_buffer <= ‘d0; //ad_buffer1 <= ‘d0; end 4‘d1:begin //cs_n <= 1‘d0; //din <= 1‘d1; state <= state + 1‘b1; end 4‘d2:begin //写寄存器 cs_n <= 1‘d0; din <= (din_regis >> num_din) & 1; num_din <= num_din - 1‘b1; ad_buffer <= (ad_buffer << 1) | dout; num_dout <= num_dout + 1‘b1; if(num_dout == 4‘d15 && num_din == 4‘d0) state <= state + 1‘b1; else state <= state; end 4‘d3:begin ad_buffer1 <= (ad_buffer[11:4]*100/51); cs_n <= 1‘d1; state <= 1‘d0; end endcase //smg display //0~9的键值 共阴极 parameter _0=8‘hc0,_1=8‘hf9,_2=8‘ha4,_3=8‘hb0,_4=8‘h99, _5=8‘h92,_6=8‘h82,_7=8‘hf8,_8=8‘h80,_9=8‘h90; always @(posedge clk or negedge rst_n) if(!rst_n)begin smg1 <= 8‘h0; end else case(ad_buffer1/100) 4‘d0:smg1 <= _0; 4‘d1:smg1 <= _1; 4‘d2:smg1 <= _2; 4‘d3:smg1 <= _3; 4‘d4:smg1 <= _4; 4‘d5:smg1 <= _5; 4‘d6:smg1 <= _6; 4‘d7:smg1 <= _7; 4‘d8:smg1 <= _8; 4‘d9:smg1 <= _9; endcase always @(posedge clk or negedge rst_n) if(!rst_n)begin smg2 <= 8‘h0; end else case(ad_buffer1%100/10) 4‘d0:smg2 <= _0; 4‘d1:smg2 <= _1; 4‘d2:smg2 <= _2; 4‘d3:smg2 <= _3; 4‘d4:smg2 <= _4; 4‘d5:smg2 <= _5; 4‘d6:smg2 <= _6; 4‘d7:smg2 <= _7; 4‘d8:smg2 <= _8; 4‘d9:smg2 <= _9; endcase always @(posedge clk or negedge rst_n) if(!rst_n)begin smg3 <= 8‘h0; end else case(ad_buffer1%10) 4‘d0:smg3 <= _0; 4‘d1:smg3 <= _1; 4‘d2:smg3 <= _2; 4‘d3:smg3 <= _3; 4‘d4:smg3 <= _4; 4‘d5:smg3 <= _5; 4‘d6:smg3 <= _6; 4‘d7:smg3 <= _7; 4‘d8:smg3 <= _8; 4‘d9:smg3 <= _9; endcase endmodule
这次有待解决的问题是如何把八位数据通过移位的方法变成小数形式
总结:fpga会自动舍弃小数部分,所以要乘一个数来增加精确度
注意位宽因为定义尾位宽不够,所以buffer1出来的数据不准确
注意datasheet给定的时钟,刚开始因为时钟频率过小,导致数字有的点闪
ad7928
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。