DAC芯片TLC5620verilog代码文档格式.docx
- 文档编号:6902196
- 上传时间:2023-05-07
- 格式:DOCX
- 页数:9
- 大小:110.09KB
DAC芯片TLC5620verilog代码文档格式.docx
《DAC芯片TLC5620verilog代码文档格式.docx》由会员分享,可在线阅读,更多相关《DAC芯片TLC5620verilog代码文档格式.docx(9页珍藏版)》请在冰点文库上搜索。
//输入时钟50MHz
rst_n;
//复位
sw1_n,sw2_n,sw3_n,sw4_n;
//按键
output
dac_clk;
//DAC时钟MAX=1MHz
dac_data;
//DAC数据输出
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;
//=================================================================================================
//字模
MSK_0
=8'
hC0,
//'
0'
MSK_1
hF9,
1'
MSK_2
hA4,
2'
MSK_3
hB0,
3'
MSK_4
h99,
4'
MSK_5
h92,
5'
MSK_6
h82,
6'
MSK_7
hF8,
7'
MSK_8
h80,
8'
MSK_9
h90,
9'
MSK_A
h88,
A'
MSK_B
h83,
B'
MSK_C
hC6,
C'
MSK_D
hA1,
D'
MSK_E
h86,
E'
MSK_F
h8E;
F'
**按键部分
reg[3:
0]key_rst;
//保存按键前一个状态
always@(posedgeclkornegedgerst_n)
if(!
rst_n)
key_rst<
=4'
b1111;
elsekey_rst<
={sw4_n,sw3_n,sw2_n,sw1_n};
reg[3:
0]key_rst_r;
//保存按键下一个状态
key_rst_r<
elsekey_rst_r<
=key_rst;
wire[3:
0]key_val=key_rst_r&
(~key_rst);
//检测是否有1到0跳变
reg[19:
0]cnt;
//计数器
cnt<
=20'
d0;
elseif(key_val)
//有按键按下(由1变为0)计数器开始计时20ms
else
=cnt+1'
b1;
//去抖动后的按键检测,仍然用两级寄存器
reg[3:
0]low_sw;
low_sw<
elseif(cnt==20'
hfffff)
//20ms后的按键状态锁存到low_sw中
0]low_sw_r;
always@(posedgeclkornegedgerst_n)
low_sw_r<
=low_sw;
0]led_ctrl=low_sw_r&
(~low_sw);
reg[10:
0]rData;
rst_n)
rData<
=11'
d255;
elsebegin
if(led_ctrl[0]==1)
//S1键按下
rData[10:
9]<
=rData[10:
9]+1'
//通道切换
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
/*************************************************************************************************/
**DAC控制部分
reg[5:
div_cnt;
//分频计数器64分频
reg
div_clk;
//分频时钟注意不是DAC输入时钟
if(!
rst_n)begin
div_cnt<
=6'
div_clk<
=1'
bz;
end
elsebegin
=div_cnt+1'
if(div_cnt==6'
d63)
div_clk<
b0;
end
reg[2:
current_state,next_state;
rDac_load;
bit_cnt_rst;
//位计数器复位信号
wire
dat_send_done;
always@(posedgeclkornegedgerst_n)
//时序进程
current_state<
=DAC_Idle;
else
=next_state;
always@(current_stateordiv_clkordat_send_done)begin
//组合进程
rDac_load
<
bit_cnt_rst<
next_state<
case(current_state)
DAC_Idle:
begin
bit_cnt_rst<
next_state<
=DAC_Send;
//空闲时直接进入send状态
end
DAC_Send:
if(dat_send_done)
//数据发送完成
=DAC_Store;
DAC_Store:
rDac_load
//LOAD变低进行锁存
if(div_clk)
endcase
reg[4:
0]bit_cnt;
//位计数器对div_clk计数
always@(posedgeclkornegedgerst_n)begin
bit_cnt<
=5'
elseif(bit_cnt_rst)
elseif(div_clk)
=bit_cnt+1'
assigndat_send_done=(bit_cnt==5'
d24);
rDac_data;
always@(bit_cnt[4:
1]orrData)begin
case(bit_cnt[4:
1])
//从高到低发送11位数据
4'
d1:
rDac_data<
=rData[10];
d2:
=rData[9];
d3:
=rData[8];
d4:
=rData[7];
d5:
=rData[6];
d6:
=rData[5];
d7:
=rData[4];
d8:
=rData[3];
d9:
=rData[2];
d10:
=rData[1];
d11:
=rData[0];
default:
rDac_clk;
always@(bit_cnt)begin
//DAC_CLK输出时钟的产生period=2560ns
if((bit_cnt>
=2)&
&
(bit_cnt<
24))
rDac_clk<
=~bit_cnt[0];
//在时钟下降沿数据要有效
else
assigndac_clk=rDac_clk;
assigndac_data=rDac_data;
assigndac_load=rDac_load;
/**************************************************************************************************/
**数码管显示部分
**说明:
数码管1显示通道数码管2显示RNG值
**
数码管3和4显示CODE值
[3:
//片选信号
[16:
cnt2;
//计数寄存器2,确定扫描间隔
submsk;
//保存要显示的数据
cnt2<
=17'
//计数器2置零
cs
b0111;
elsebegin
=cnt2+1'
//计数器2开始计数
if(cnt2==17'
d0)
//溢出了,又从0开始
if(cs==4'
b0111)
b1110;
//选择第四个数码管
submsk<
=rData[3:
0];
//显示CODE低4位
elseif(cs==4'
b1110)
begin
b1101;
//选择第三个数码管
4];
//显示CODE高4位
b1101)
b1011;
//选择第二个数码管
={3'
b000,rData[8]};
//显示RNG值
b1011)
//选择第一个数码管
={2'
b00,rData[10:
9]}+1'
//显示通道
[7:
digit_o;
//数码管输出寄存器
always@(submsk)
case(submsk)
h0:
digit_o<
=MSK_0;
h1:
=MSK_1;
h2:
=MSK_2;
h3:
=MSK_3;
h4:
=MSK_4;
h5:
=MSK_5;
h6:
=MSK_6;
h7:
=MSK_7;
h8:
=MSK_8;
h9:
=MSK_9;
hA:
=MSK_A;
hB:
=MSK_B;
hC:
=MSK_C;
hD:
=MSK_D;
hE:
=MSK_E;
hF:
=MSK_F;
default:
endcase
endmodule
//End
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DAC 芯片 TLC5620verilog 代码