DAC芯片TLC5620 Verilog代码
TLC5620是TI公司的DA转换芯片,
下面的代码实现的简单的DA转换功能。
说明:数码管1显示通道, 数码管2显示RNG值,数码管3和4显示CODE值。按键1切换通道,按键2改变RNG值(0或1),按键3改变CODE值,按键4未使用。
wtd/**************************************************************************************************
** DAC11位数据输入说明:Bit[10:9] 通道选择00:CHA; 01:CHB; 10:CHC; 11:CHD
Bit[8] RNG 0:参考电压到地 1:两倍参考电压到地
prentvalue Bit[7:0] DAC转换代码,范围0~255.
输出电压Vo=REF*(CODE/256)*(1+RNG)
**************************************************************************************************/
module dac(
clk,
山东化妆培训学校 rst_n,
dac_clk,
dac_data,
dac_load,
sw1_n,sw2_n,sw3_n,sw4_n,
digit_o,
cs
);
input clk; // 输入时钟50MHz
input rst_n; // 复位
input sw1_n,sw2_n,sw3_n,sw4_n; // 按键
output dac_clk; // DAC时钟 MAX=1MHz
output dac_data; // DAC数据输出
output dac_load; // 加载信号
// 电路图中LDAC已经接地,因此略去
output [7:0] digit_o; // 数码管输出
output [3:0] cs; // 数码管片选
parameter DAC_Idle = 3'b001, // 状态参数
DAC_Send = 3'b010,
DAC_Store = 3'b100;
//=================================================================================================
parameter // 字模
MSK_0 = 8'hC0, // '0'
MSK_1 = 8'hF9, // '1'
MSK_2 = 8'hA4, // '2'
MSK_3 = 8'hB0, // '3'
MSK_4 = 8'h99, // '4'
MSK_5 = 8'h92, // '5'
MSK_6 = 8'h82, // '6'
MSK_7 = 8'hF8, // '7'
MSK_8 = 8'h80, // '8'
MSK_9 = 8'h90, // '9'
MSK_A = 8'h88, // 'A'
MSK_B = 8'h83, // 'B'
MSK_C = 8'hC6, // 'C'
MSK_D = 8'hA1, // 'D'
MSK_E = 8'h86, // 'E'
内包装 MSK_F = 8'h8E; // 'F'
//=================================================================================================雅思阅读评分标准
/**************************************************************************************************建筑师资格证怎么考
** 按键部分
**************************************************************************************************/
reg [3:0] key_rst; // 保存按键前一个状态
always @(podge clk or negedge rst_n)
if (!rst_n)
key_rst <= 4'b1111;
el key_rst <= {sw4_n,sw3_n,sw2_n,sw1_n};
reg[3:0] key_rst_r; // 保存按键下一个状态
always @(podge clk or negedge rst_n)
if (!rst_n)
key_rst_r <= 4'b1111;
el key_rst_r <= key_rst;
wire[3:0] key_val = key_rst_r & (~key_rst); // 检测是否有1到0跳变
reg[19:0] cnt; // 计数器
always @(podge clk or negedge rst_n)
if (!rst_n)
cnt <= 20'd0;
el if (key_val) // 有按键按下(由1变为0)计数器开始计时 20ms
cnt <= 20'd0;
el
cnt <= cnt + 1'b1;
7755
// 去抖动后的按键检测,仍然用两级寄存器
reg[3:0] low_sw;
always @(podge clk or negedge rst_n)
would like if (!rst_n)
low_sw <= 4'b1111;
el if (cnt == 20'hfffff) // 20ms后的按键状态锁存到low_sw中
low_sw <= {sw4_n,sw3_n,sw2_n,sw1_n};
reg[3:0] low_sw_r;
always @(podge clk or negedge rst_n)
if (!rst_n)
low_sw_r <= 4'b1111;
el
low_sw_r <= low_sw;
wire[3:0] led_ctrl = low_sw_r & (~low_sw);
reg [10:0] rData;
always @(podge clk or negedge rst_n)
if (!rst_n)
rData <= 11'd255;
el begin
transactionmanager if (led_ctrl[0] == 1) // S1键按下
rData[10:9] <= rData[10:9] + 1'b1; // 通道切换
if (led_ctrl[1] == 1) // S2键按下
rData[8] <= ~rData[8]; // RNG位变化
if (led_ctrl[2] == 1) // S3键按下
rData[7:0] <= rData[7:0] + 8'd8; // CODE变化
end
北京雅思家教/*************************************************************************************************/