流水灯试验.docx

上传人:b****5 文档编号:29464151 上传时间:2023-07-23 格式:DOCX 页数:19 大小:18.12KB
下载 相关 举报
流水灯试验.docx_第1页
第1页 / 共19页
流水灯试验.docx_第2页
第2页 / 共19页
流水灯试验.docx_第3页
第3页 / 共19页
流水灯试验.docx_第4页
第4页 / 共19页
流水灯试验.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

流水灯试验.docx

《流水灯试验.docx》由会员分享,可在线阅读,更多相关《流水灯试验.docx(19页珍藏版)》请在冰豆网上搜索。

流水灯试验.docx

流水灯试验

//流水灯试验,分频计数器选得大些,否则显示不出流水灯的效果

moduleledwater(clk_50M,rst,dataout);

inputclk_50M,rst;

output[5:

0]dataout;

reg[5:

0]dataout;

reg[24:

0]count;//分频计数器

//分频计数器

always@(posedgeclk_50M)

begin

count<=count+1;

end

//经仿真知:

循环一次大约90毫秒左右,而每个间隔之间大约10毫秒

always@(posedgeclk_50Mornegedgerst)

begin

case(count[24:

21])

0:

dataout<=6'b11_1110;1:

dataout<=6'b11_1100;

2:

dataout<=6'b11_1000;3:

dataout<=6'b11_0000;

4:

dataout<=6'b10_0000;5:

dataout<=6'b00_0000;//循环

6:

dataout<=6'b01_1111;//倒回来7:

dataout<=6'b00_1111;

8:

dataout<=6'b00_0111;9:

dataout<=6'b00_0011;

10:

dataout<=6'b00_0001;11:

dataout<=6'b00_0000;

endcaseend

endmodule7段数码管测试实验1:

以动态扫描方式在8位数码管“同时”显示0--7

实验的目的是向用户介绍多个数码管动态显示的方法。

动态显示的方法是,按一定的频率轮流向各个数码管的COM端送出低电平,同时送出对应的数据给各段。

*/

moduleseg71(clk,rst,dataout,en);

inputclk,rst;

output[7:

0]dataout;

output[7:

0]en;//COM使能输出

reg[7:

0]dataout;//各段数据输出

reg[7:

0]en;

reg[15:

0]cnt_scan;//扫描频率计数器

reg[4:

0]dataout_buf;

always@(posedgeclkornegedgerst)

begin

if(!

rst)begin

cnt_scan<=0;

end

elsebegin

cnt_scan<=cnt_scan+1;

end

end

always@(cnt_scan)

begin

case(cnt_scan[15:

13])

3'b000:

en=8'b1111_1110;

3'b001:

en=8'b1111_1101;

3'b010:

en=8'b1111_1011;

3'b011:

en=8'b1111_0111;

3'b100:

en=8'b1110_1111;

3'b101:

en=8'b1101_1111;

3'b110:

en=8'b1011_1111;

3'b111:

en=8'b0111_1111;

default:

en=8'b1111_1110;

endcase

end

always@(en)//对应COM信号给出各段数据

begin

case(en)

8'b1111_1110:

dataout_buf=0;

8'b1111_1101:

dataout_buf=1;

8'b1111_1011:

dataout_buf=2;

8'b1111_0111:

dataout_buf=3;

8'b1110_1111:

dataout_buf=4;

8'b1101_1111:

dataout_buf=5;

8'b1011_1111:

dataout_buf=6;

8'b0111_1111:

dataout_buf=7;

default:

dataout_buf=8;

endcase

end

always@(dataout_buf)

begin

case(dataout_buf)

4'b0000:

dataout=8'b0000_0011;

4'b0001:

dataout=8'b1001_1111;

4'b0010:

dataout=8'b0010_0101;

4'b0011:

dataout=8'b0000_1101;

4'b0100:

dataout=8'b1001_1001;

4'b0101:

dataout=8'b0100_1001;

4'b0110:

dataout=8'b0100_0001;

4'b0111:

dataout=8'b0001_1111;

4'b1000:

dataout=8'b0000_0001;

4'b1001:

dataout=8'b0001_1001;

4'b1010:

dataout=8'b0001_0001;

4'b1011:

dataout=8'b1100_0001;

4'b1100:

dataout=8'b0110_0011;

4'b1101:

dataout=8'b1000_0101;

4'b1110:

dataout=8'b0110_0001;

4'b1111:

dataout=8'b0111_0001;

endcase

end

endmodule

本模块的功能是验证实现和PC机进行基本的串口通信的功能。

需要在PC机上安装一个串口调试工具来验证程序的功能。

程序实现了一个收发一帧10个bit(即无奇偶校验位)的串口控制器,10个bit是1位起始位,8个数据位,1个结束位。

串口的波特律由程序中定义的div_par参数决定,更改该参数可以实现相应的波特率。

程序当前设定的div_par的值

是0x145,对应的波特率是9600。

用一个8倍波特率的时钟将发送或接受每一位bit的周期时间划分为8个时隙以使通

信同步.

程序的基本工作过程是,按动一个按键key1控制器向PC的串口发送“welcome",

PC机接收后显示验证数据是否正确(串口调试工具设成按ASCII码接受方式).

PC可随时向CPLD发送0-F的十六进制数据,CPLD接受后显示在7段数码管上.

*/

moduleserial(clk,rst,rxd,txd,en,seg_data,key_input,lowbit);

inputclk,rst;

inputrxd;//串行数据接收端

inputkey_input;//按键输入

output[7:

0]en;

output[7:

0]seg_data;

reg[7:

0]seg_data;

outputtxd;//串行数据发送端

outputlowbit;

 

////////////////////innerreg////////////////////

reg[15:

0]div_reg;//分频计数器,分频值由波特率决定。

分频后得到频率8倍波特率的时钟

reg[2:

0]div8_tras_reg;//该寄存器的计数值对应发送时当前位于的时隙数

reg[2:

0]div8_rec_reg;//该寄存器的计数值对应接收时当前位于的时隙数

reg[3:

0]state_tras;//发送状态寄存器

reg[3:

0]state_rec;//接受状态寄存器

regclkbaud_tras;//以波特率为频率的发送使能信号

regclkbaud_rec;//以波特率为频率的接受使能信号

regclkbaud8x;//以8倍波特率为频率的时钟,它的作用是将发送或接受一个bit的时钟周期分为8个时隙

regrecstart;//开始发送标志

regrecstart_tmp;

regtrasstart;//开始接受标志

regrxd_reg1;//接收寄存器1

regrxd_reg2;//接收寄存器2,因为接收数据为异步信号,故用两级缓存

regtxd_reg;//发送寄存器

reg[7:

0]rxd_buf;//接受数据缓存

reg[7:

0]txd_buf;//发送数据缓存

reg[2:

0]send_state;//每次按键给PC发送"Welcome"字符串,这是发送状态寄存器

reg[19:

0]cnt_delay;//延时去抖计数器

regstart_delaycnt;//开始延时计数标志

regkey_entry1,key_entry2;//确定有键按下标志

////////////////////////////////////////////////

parameterdiv_par=16'h145;//分频参数,其值由对应的波特率计算而得,按此参数分频的时钟频率是波倍特率的8

//倍,此处值对应9600的波特率,即分频出的时钟频率是9600*8(CLK50M)

////////////////////////////////////////////////

assigntxd=txd_reg;

assignlowbit=0;

assignen=0;//7段数码管使能信号赋值

always@(posedgeclk)

begin

if(!

rst)begin

cnt_delay<=0;

start_delaycnt<=0;

end

elseif(start_delaycnt)begin

if(cnt_delay!

=20'd800000)begin

cnt_delay<=cnt_delay+1;

end

elsebegin

cnt_delay<=0;

start_delaycnt<=0;

end

end

elsebegin

if(!

key_input&&cnt_delay==0)

start_delaycnt<=1;

end

end

always@(posedgeclk)

begin

if(!

rst)

key_entry1<=0;

elsebegin

if(key_entry2)

key_entry1<=0;

elseif(cnt_delay==20'd800000)begin

if(!

key_input)

key_entry1<=1;

end

end

end

always@(posedgeclk)

begin

if(!

rst)

div_reg<=0;

elsebegin

if(div_reg==div_par-1)

div_reg<=0;

else

div_reg<=div_reg+1;

end

end

always@(posedgeclk)//分频得到8倍波特率的时钟

begin

if(!

rst)

clkbaud8x<=0;

elseif(div_reg==div_par-1)

clkbaud8x<=~clkbaud8x;

end

 

always@(posedgeclkbaud8xornegedgerst)

begin

if(!

rst)

div8_rec_reg<=0;

elseif(recstart)//接收开始标志

div8_rec_reg<=div8_rec_reg+1;//接收开始后,时隙数在8倍波特率的时钟下加1循环

end

always@(posedgeclkbaud8xornegedgerst)

begin

if(!

rst)

div8_tras_reg<=0;

elseif(trasstart)

div8_tras_reg<=div8_tras_reg+1;//发送开始后,时隙数在8倍波特率的时钟下加1循环

end

always@(div8_rec_reg)

begin

if(div8_rec_reg==7)

clkbaud_rec=1;//在第7个时隙,接收使能信号有效,将数据打入

else

clkbaud_rec=0;

end

always@(div8_tras_reg)

begin

if(div8_tras_reg==7)

clkbaud_tras=1;//在第7个时隙,发送使能信号有效,将数据发出

else

clkbaud_tras=0;

end

always@(posedgeclkbaud8xornegedgerst)

begin

if(!

rst)begin

txd_reg<=1;

trasstart<=0;

txd_buf<=0;

state_tras<=0;

send_state<=0;

key_entry2<=0;

end

elsebegin

if(!

key_entry2)begin

if(key_entry1)begin

key_entry2<=1;

txd_buf<=8'd119;//"w"

end

end

elsebegin

case(state_tras)

4'b0000:

begin//发送起始位

if(!

trasstart&&send_state<7)

trasstart<=1;

elseif(send_state<7)begin

if(clkbaud_tras)begin

txd_reg<=0;

state_tras<=state_tras+1;

end

end

elsebegin

key_entry2<=0;

state_tras<=0;

end

end

4'b0001:

begin//发送第1位

if(clkbaud_tras)begin

txd_reg<=txd_buf[0];

txd_buf[6:

0]<=txd_buf[7:

1];

state_tras<=state_tras+1;

end

end

4'b0010:

begin//发送第2位

if(clkbaud_tras)begin

txd_reg<=txd_buf[0];

txd_buf[6:

0]<=txd_buf[7:

1];

state_tras<=state_tras+1;

end

end

4'b0011:

begin//发送第3位

if(clkbaud_tras)begin

txd_reg<=txd_buf[0];

txd_buf[6:

0]<=txd_buf[7:

1];

state_tras<=state_tras+1;

end

end

4'b0100:

begin//发送第4位

if(clkbaud_tras)begin

txd_reg<=txd_buf[0];

txd_buf[6:

0]<=txd_buf[7:

1];

state_tras<=state_tras+1;

end

end

4'b0101:

begin//发送第5位

if(clkbaud_tras)begin

txd_reg<=txd_buf[0];

txd_buf[6:

0]<=txd_buf[7:

1];

state_tras<=state_tras+1;

end

end

4'b0110:

begin//发送第6位

if(clkbaud_tras)begin

txd_reg<=txd_buf[0];

txd_buf[6:

0]<=txd_buf[7:

1];

state_tras<=state_tras+1;

end

end

4'b0111:

begin//发送第7位

if(clkbaud_tras)begin

txd_reg<=txd_buf[0];

txd_buf[6:

0]<=txd_buf[7:

1];

state_tras<=state_tras+1;

end

end

4'b1000:

begin//发送第8位

if(clkbaud_tras)begin

txd_reg<=txd_buf[0];

txd_buf[6:

0]<=txd_buf[7:

1];

state_tras<=state_tras+1;

end

end

4'b1001:

begin//发送停止位

if(clkbaud_tras)begin

txd_reg<=1;

txd_buf<=8'h55;

state_tras<=state_tras+1;

end

end

4'b1111:

begin

if(clkbaud_tras)begin

state_tras<=state_tras+1;

send_state<=send_state+1;

trasstart<=0;

case(send_state)

3'b000:

txd_buf<=8'd101;//"e"

3'b001:

txd_buf<=8'd108;//"l"

3'b010:

txd_buf<=8'd99;//"c"

3'b011:

txd_buf<=8'd111;//"o"

3'b100:

txd_buf<=8'd109;//"m"

3'b101:

txd_buf<=8'd101;//"e"

default:

txd_buf<=0;

endcase

end

end

default:

begin

if(clkbaud_tras)begin

state_tras<=state_tras+1;

trasstart<=1;

end

end

endcase

end

end

end

always@(posedgeclkbaud8xornegedgerst)//接受PC机的数据

begin

if(!

rst)begin

rxd_reg1<=0;

rxd_reg2<=0;

rxd_buf<=0;

state_rec<=0;

recstart<=0;

recstart_tmp<=0;

end

elsebegin

rxd_reg1<=rxd;

rxd_reg2<=rxd_reg1;

if(state_rec==0)begin

if(recstart_tmp==1)begin

recstart<=1;

recstart_tmp<=0;

state_rec<=state_rec+1;

end

elseif(!

rxd_reg1&&rxd_reg2)//检测到起始位的下降沿,进入接受状态

recstart_tmp<=1;

end

elseif(state_rec>=1&&state_rec<=8)begin

if(clkbaud_rec)begin

rxd_buf[7]<=rxd_reg2;

rxd_buf[6:

0]<=rxd_buf[7:

1];

state_rec<=state_rec+1;

end

end

elseif(state_rec==9)begin

if(clkbaud_rec)begin

state_rec<=0;

recstart<=0;

end

end

end

end

always@(rxd_buf)//将接受的数据用数码管显示出来

begin

case(rxd_buf)

8'h30:

seg_data=8'b11000000;

8'h31:

seg_data=8'b11111001;

8'h32:

seg_data=8'b10100100;

8'h33:

seg_data=8'b10110000;

8'h34:

seg_data=8'b10011001;

8'h35:

seg_data=8'b10010010;

8'h36:

seg_data=8'b10000010;

8'h37:

seg_data=8'b11111000;

8'h38:

seg_data=8'b10000000;

8'h39:

seg_data=8'b10010000;

8'h41:

seg_data=8'b00010001;

8'h42:

seg_data=8'b11000001;

8'h43:

seg_data=8'b0110_0011;

8'h44:

seg_data=8'b1000_0101;

8'h45:

seg_data=8'b0110_0001;

8'h46:

seg_data=8'b0111_0001;

default:

seg_data=8'b1111_1111;

endcase

end

endmodule

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1