eda实验程序Word下载.docx
- 文档编号:4122952
- 上传时间:2023-05-02
- 格式:DOCX
- 页数:22
- 大小:19.81KB
eda实验程序Word下载.docx
《eda实验程序Word下载.docx》由会员分享,可在线阅读,更多相关《eda实验程序Word下载.docx(22页珍藏版)》请在冰点文库上搜索。
b11111110:
led_r=8'
b11111110;
//是键KEY1,则给寄存器赋值0xfe
b11111101:
b11111100;
//是键KEY2,则给寄存器赋值0xfc
b11111011:
b11111000;
//是键KEY3,则给寄存器赋值0xf8
b11110111:
b11110000;
//是键KEY4,则给寄存器赋值0xf0
b11101111:
b11100000;
//是键KEY5,则给寄存器赋值0xe0
b11011111:
b11000000;
//是键KEY6,则给寄存器赋值0xc0
b10111111:
b10000000;
//是键KEY7,则给寄存器赋值0x80
b01111111:
b00000000;
//是键KEY8,则给寄存器赋值0x00
default:
led_r=8'
b11111111;
//否则给寄存器赋值0xff
endcase
moduledecl7s(d,seg);
//模块名decl7s
input[3:
0]d;
//输入4位二进制码
0]seg;
//七段译码输出
0]seg_r;
//定义数码管输出寄存器
assignseg=seg_r;
//输出数码管译码结果
always@(d)
case(d)//七段译码
4'
h0:
seg_r=8'
hc0;
//显示0
h1:
hf9;
//显示1
h2:
ha4;
//显示2
h3:
hb0;
//显示3
h4:
h99;
//显示4
h5:
h92;
//显示5
h6:
h82;
//显示6
h7:
hf8;
//显示7
h8:
h80;
//显示8
h9:
h90;
//显示9
ha:
h88;
//显示a
hb:
h83;
//显示b
hc:
hc6;
//显示c
hd:
ha1;
//显示d
he:
h86;
//显示e
hf:
h8e;
//显示f
modulescan_led(clk_1k,d,dig,seg);
//模块名scan_led
inputclk_1k;
//输入时钟
input[31:
//输入要显示的数据
0]dig;
//数码管选择输出引脚
//数码管段输出引脚
0]dig_r;
//定义数码管选择输出寄存器
reg[3:
0]disp_dat;
//定义显示数据寄存器
reg[2:
0]count;
//定义计数寄存器
assigndig=dig_r;
//输出数码管选择
always@(posedgeclk_1k)//定义上升沿触发进程
count<
=count+1'
b1;
always@(posedgeclk_1k)
case(count)//选择扫描显示数据
3'
d0:
disp_dat=d[31:
28];
//第一个数码管
d1:
disp_dat=d[27:
24];
//第二个数码管
d2:
disp_dat=d[23:
20];
//第三个数码管
d3:
disp_dat=d[19:
16];
//第四个数码管
d4:
disp_dat=d[15:
12];
//第五个数码管
d5:
disp_dat=d[11:
8];
//第六个数码管
d6:
disp_dat=d[7:
4];
//第七个数码管
d7:
disp_dat=d[3:
//第八个数码管
case(count)//选择数码管显示位
dig_r=8'
b01111111;
//选择第一个数码管显示
b10111111;
//选择第二个数码管显示
b11011111;
//选择第三个数码管显示
b11101111;
//选择第四个数码管显示
b11110111;
//选择第五个数码管显示
b11111011;
//选择第六个数码管显示
b11111101;
//选择第七个数码管显示
//选择第八个数码管显示
endcase
always@(disp_dat)
case(disp_dat)//七段译码
moduledebounce(clk,key_in,key_out);
//按键消抖模块
inputclk;
//系统时钟输入
input[KEY_WIDTH-1:
0]key_in;
//外部按键输入
output[KEY_WIDTH-1:
0]key_out;
//按键消抖输出
reg[KEY_WIDTH-1:
0]dout1,dout2,dout3;
//寄存器
parameterKEY_WIDTH=8;
//参数
assignkey_out=(dout1|dout2|dout3);
//按键消抖输出
always@(posedgeclk)
dout1<
=key_in;
dout2<
=dout1;
dout3<
=dout2;
//*******************************************************//
//任意整数分频模块//
//功能:
对输入时钟clock进行F_DIV倍分频后输出clk_out。
//其中F_DIV为分频系数,分频系数范围为1~2^n(n=F_DIV_WIDTH)
//若要改变分频系数,改变参数F_DIV或F_DIV_WIDTH到相应范围即可。
//若分频系数为偶数,则输出时钟占空比为50%;
//若分频系数为奇数,则输出时钟占空比取决于输入时钟占空比和分
//频系数(当输入为50%时,输出也是50%)。
//--------------------------------------------------------
//奇数倍分频:
三倍分频的时序图如下所示。
//123456
//clock|--|__|--|__|--|__|--|__|--|__|--|__|
//clk_p_r|_____|-----------|_____|-----------|
//clk_n_r---|_____|-----------|_____|---------
//clk_out|________|--------|________|--------|
moduleint_div(clock,clk_out);
//I/O口声明
inputclock;
//输入时钟
outputclk_out;
//输出时钟
//内部寄存器
regclk_p_r;
//上升沿输出时钟
regclk_n_r;
//下降沿输出时钟
reg[F_DIV_WIDTH-1:
0]count_p;
//上升沿脉冲计数器
0]count_n;
//下降沿脉冲计数器
//参数--分频系数
parameterF_DIV=48000000;
//分频系数<
-----修改这里
parameterF_DIV_WIDTH=32;
//分频计数器宽度
wirefull_div_p;
//上升沿计数满标志
wirehalf_div_p;
//上升沿计数半满标志
wirefull_div_n;
//下降沿计数满标志
wirehalf_div_n;
//下降沿计数半满标志
//判断计数标志位置位与否
assignfull_div_p=(count_p<
F_DIV-1);
assignhalf_div_p=(count_p<
(F_DIV>
>
1)-1);
assignfull_div_n=(count_n<
assignhalf_div_n=(count_n<
//时钟输出
assignclk_out=(F_DIV==1)?
clock:
(F_DIV[0]?
(clk_p_r&
clk_n_r):
clk_p_r);
//上升沿脉冲计数
always@(posedgeclock)
if(full_div_p)
begin
count_p<
=count_p+1'
if(half_div_p)
clk_p_r<
=1'
b0;
else
end
else
=0;
clk_p_r<
//下降沿脉冲计数
always@(negedgeclock)
if(full_div_n)
count_n<
=count_n+1'
if(half_div_n)
clk_n_r<
clk_n_r<
//*********************************************************
//**交通灯实验
//**控制模块:
traffic_ctrl.v
moduletraffic_ctrl(clock,rst_n,lampa,lampb,acount,bcount);
//系统时钟48MHz
inputrst_n;
//同步复位信号,低电平有效
output[2:
0]lampa;
//控制A方向三盏灯的亮灭;
其中lampa[2:
0]分
//别控制A方向的绿灯、黄灯、红灯(低电平灯亮)
0]lampb;
//控制B方向三盏灯的亮灭;
其中lampb[2:
//别控制B方向的绿灯、黄灯、红灯(低电平灯亮)
output[7:
0]acount;
//用于A方向灯的时间显示,8位BCD码输出
0]bcount;
//用于B方向灯的时间显示,8位BCD码输出
reg[25:
0]clk_cnt;
//设置各种灯的计数器的预置数
parameterared=8'
d30,//30秒ared=bgreen+byellow
ayellow=8'
d5,//5秒
agreen=8'
d15,//15秒
bred=8'
d20,//20秒bred=agreen+ayellow
byellow=8'
bgreen=8'
d25;
//25秒
//产生1Hz时钟使能信号
if(clken)
clk_cnt<
=26'
h0;
=clk_cnt+26'
h1;
assignclken=(clk_cnt>
d47999999);
//
//A方向信号灯控制
regacount_startred,acount_startgreen,acount_startyellow;
//用于倒数计数器的复位
//状态机A
reg[1:
0]currentstate_A,nextstate_A;
//以下状态机A的代码自己完成
parameteridle=0,red=1,green=2,yellow=3;
always@(posedgeclockornegedgerst_n)
if(!
rst_n)currentstate_A<
=idle;
elsecurrentstate_A<
=nextstate_A;
always@(currentstate_Aoracount)
case(currentstate_A)
idle:
nextstate_A=red;
lampa=3'
b111;
acount_startred=1'
acount_startgreen=1'
acount_startyellow=1'
end
red:
begin
b110;
if(acount==0)acount_startgreen=1'
elseacount_startgreen=1'
beginif(acount!
=0)nextstate_A=red;
elseif(acount==0)nextstate_A=green;
end
green:
=0)nextstate_A=green;
elseif(acount==0)nextstate_A=yellow;
begin
b101;
if(acount==0)acount_startyellow=1'
elseacount_startyellow=1'
yellow:
=0)nextstate_A=yellow;
elseif(acount==0)nextstate_A=red;
b011;
if(acount==0)acount_startred=1'
elseacount_startred=1'
acount_startgreen=1'
acount_startyellow=1'
default:
nextstate_A=red;
endcase
//倒数计数器A
always@(posedgeclock)
if(acount_startred)
acount<
=ared;
elseif(acount_startgreen)
=agreen;
elseif(acount_startyellow)
=ayellow;
elseif(clken)
=acount-1'
//B方向信号灯控制
regbcount_startred,bcount_startgreen,bcount_startyellow;
//状态机B
0]currentstate_B,nextstate_B;
//以下状态机B的代码自己完成
rst_n)currentstate_B=idle;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- eda 实验 程序