流水灯试验.docx
- 文档编号:29464151
- 上传时间:2023-07-23
- 格式:DOCX
- 页数:19
- 大小:18.12KB
流水灯试验.docx
《流水灯试验.docx》由会员分享,可在线阅读,更多相关《流水灯试验.docx(19页珍藏版)》请在冰豆网上搜索。
流水灯试验
//流水灯试验,分频计数器选得大些,否则显示不出流水灯的效果
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 流水 试验