1、流水灯试验/流水灯试验,分频计数器选得大些,否则显示不出流水灯的 效果module ledwater (clk_50M,rst,dataout);input clk_50M,rst;output 5:0 dataout;reg 5:0 dataout;reg 24:0 count; /分频计数器/分频计数器always ( posedge clk_50M ) begin count=count+1; end/ 经仿真知:循环一次大约90毫秒左右,而每个间隔之间大约10毫秒always ( posedge clk_50M or negedge rst) begin case ( count24:
2、21 ) 0: dataout=6b11_1110; 1: dataout=6b11_1100; 2: dataout=6b11_1000; 3: dataout=6b11_0000; 4: dataout=6b10_0000; 5: dataout=6b00_0000; /循环 6: dataout=6b01_1111; /倒回来 7: dataout=6b00_1111; 8: dataout=6b00_0111; 9: dataout=6b00_0011; 10: dataout=6b00_0001; 11: dataout=6b00_0000; endcase endendmodule
3、段数码管测试实验:以动态扫描方式在位数码管“同时”显示-7实验的目的是向用户介绍多个数码管动态显示的方法。动态显示的方法是,按一定的频率轮流向各个数码管的COM端送出低电平,同时送出对应的数据给各段。*/module seg71(clk,rst,dataout,en);input clk,rst;output7:0 dataout;output7:0 en;/COM使能输出reg7:0 dataout;/各段数据输出reg7:0 en;reg15:0 cnt_scan;/扫描频率计数器reg4:0 dataout_buf;always(posedge clk or negedge rst)be
4、gin if(!rst) begin cnt_scan=0; end else begin cnt_scan=cnt_scan+1; endendalways (cnt_scan)begin case(cnt_scan15:13) 3b000 : en = 8b1111_1110; 3b001 : en = 8b1111_1101; 3b010 : en = 8b1111_1011; 3b011 : en = 8b1111_0111; 3b100 : en = 8b1110_1111; 3b101 : en = 8b1101_1111; 3b110 : en = 8b1011_1111; 3b
5、111 : en = 8b0111_1111; default : en = 8b1111_1110; endcaseendalways(en) /对应COM信号给出各段数据begin case(en) 8b1111_1110: dataout_buf=0; 8b1111_1101: dataout_buf=1; 8b1111_1011: dataout_buf=2; 8b1111_0111: dataout_buf=3; 8b1110_1111: dataout_buf=4; 8b1101_1111: dataout_buf=5; 8b1011_1111: dataout_buf=6; 8b
6、0111_1111: dataout_buf=7; default: dataout_buf=8; endcaseendalways(dataout_buf)begin case(dataout_buf) 4b0000: dataout=8b0000_0011; 4b0001: dataout=8b1001_1111; 4b0010: dataout=8b0010_0101; 4b0011: dataout=8b0000_1101; 4b0100: dataout=8b1001_1001; 4b0101: dataout=8b0100_1001; 4b0110: dataout=8b0100_
7、0001; 4b0111: dataout=8b0001_1111; 4b1000: dataout=8b0000_0001; 4b1001: dataout=8b0001_1001; 4b1010: dataout=8b0001_0001; 4b1011: dataout=8b1100_0001; 4b1100: dataout=8b0110_0011; 4b1101: dataout=8b1000_0101; 4b1110: dataout=8b0110_0001; 4b1111: dataout=8b0111_0001; endcaseendendmodule 本模块的功能是验证实现和P
8、C机进行基本的串口通信的功能。需要在PC机上安装一个串口调试工具来验证程序的功能。程序实现了一个收发一帧10个bit(即无奇偶校验位)的串口控制器,10个bit是1位起始位,8个数据位,1个结束位。串口的波特律由程序中定义的div_par参数决定,更改该参数可以实现相应的波特率。程序当前设定的div_par 的值是0x145,对应的波特率是9600。用一个8倍波特率的时钟将发送或接受每一位bit的周期时间划分为8个时隙以使通信同步.程序的基本工作过程是,按动一个按键key1 控制器向PC的串口发送“welcome,PC机接收后显示验证数据是否正确(串口调试工具设成按ASCII码接受方式).PC
9、可随时向CPLD发送0-F的十六进制数据,CPLD接受后显示在7段数码管上.*/module serial(clk,rst,rxd,txd,en,seg_data,key_input,lowbit);input clk,rst;input rxd;/串行数据接收端input key_input;/按键输入output7:0 en;output7:0 seg_data;reg7:0 seg_data;output txd;/串行数据发送端output lowbit;/inner reg/reg15:0 div_reg;/分频计数器,分频值由波特率决定。分频后得到频率8倍波特率的时钟reg2:0
10、div8_tras_reg;/该寄存器的计数值对应发送时当前位于的时隙数reg2:0 div8_rec_reg;/该寄存器的计数值对应接收时当前位于的时隙数reg3:0 state_tras;/发送状态寄存器reg3:0 state_rec;/接受状态寄存器reg clkbaud_tras;/以波特率为频率的发送使能信号reg clkbaud_rec;/以波特率为频率的接受使能信号reg clkbaud8x;/以8倍波特率为频率的时钟,它的作用是将发送或接受一个bit的时钟周期分为8个时隙reg recstart;/开始发送标志reg recstart_tmp;reg trasstart;/开
11、始接受标志reg rxd_reg1;/接收寄存器1reg rxd_reg2;/接收寄存器2,因为接收数据为异步信号,故用两级缓存reg txd_reg;/发送寄存器reg7:0 rxd_buf;/接受数据缓存reg7:0 txd_buf;/发送数据缓存reg2:0 send_state;/每次按键给PC发送Welcome字符串,这是发送状态寄存器reg19:0 cnt_delay;/延时去抖计数器reg start_delaycnt;/开始延时计数标志reg key_entry1,key_entry2;/确定有键按下标志/parameter div_par=16h145;/分频参数,其值由对应
12、的波特率计算而得,按此参数分频的时钟频率是波倍特率的8 /倍,此处值对应9600的波特率,即分频出的时钟频率是9600*8 (CLK 50M)/assign txd=txd_reg;assign lowbit=0;assign en=0;/7段数码管使能信号赋值always(posedge clk )begin if(!rst) begin cnt_delay=0; start_delaycnt=0; end else if(start_delaycnt) begin if(cnt_delay!=20d800000) begin cnt_delay=cnt_delay+1; end else
13、begin cnt_delay=0; start_delaycnt=0; end end else begin if(!key_input&cnt_delay=0) start_delaycnt=1; endendalways(posedge clk)begin if(!rst) key_entry1=0; else begin if(key_entry2) key_entry1=0; else if(cnt_delay=20d800000) begin if(!key_input) key_entry1=1; end endendalways(posedge clk )begin if(!r
14、st) div_reg=0; else begin if(div_reg=div_par-1) div_reg=0; else div_reg=div_reg+1; endendalways(posedge clk)/分频得到8倍波特率的时钟begin if(!rst) clkbaud8x=0; else if(div_reg=div_par-1) clkbaud8x=clkbaud8x;endalways(posedge clkbaud8x or negedge rst)begin if(!rst) div8_rec_reg=0; else if(recstart)/接收开始标志 div8_
15、rec_reg=div8_rec_reg+1;/接收开始后,时隙数在8倍波特率的时钟下加1循环endalways(posedge clkbaud8x or negedge rst)begin if(!rst) div8_tras_reg=0; else if(trasstart) div8_tras_reg=div8_tras_reg+1;/发送开始后,时隙数在8倍波特率的时钟下加1循环endalways(div8_rec_reg)begin if(div8_rec_reg=7) clkbaud_rec=1;/在第7个时隙,接收使能信号有效,将数据打入 else clkbaud_rec=0;e
16、ndalways(div8_tras_reg)begin if(div8_tras_reg=7) clkbaud_tras=1;/在第7个时隙,发送使能信号有效,将数据发出 else clkbaud_tras=0;endalways(posedge clkbaud8x or negedge rst)begin if(!rst) begin txd_reg=1; trasstart=0; txd_buf=0; state_tras=0; send_state=0; key_entry2=0; end else begin if(!key_entry2) begin if(key_entry1)
17、begin key_entry2=1; txd_buf=8d119; /w end end else begin case(state_tras) 4b0000: begin /发送起始位 if(!trasstart&send_state7) trasstart=1; else if(send_state7) begin if(clkbaud_tras) begin txd_reg=0; state_tras=state_tras+1; end end else begin key_entry2=0; state_tras=0; end end 4b0001: begin /发送第1位 if(
18、clkbaud_tras) begin txd_reg=txd_buf0; txd_buf6:0=txd_buf7:1; state_tras=state_tras+1; end end 4b0010: begin /发送第2位 if(clkbaud_tras) begin txd_reg=txd_buf0; txd_buf6:0=txd_buf7:1; state_tras=state_tras+1; end end 4b0011: begin /发送第3位 if(clkbaud_tras) begin txd_reg=txd_buf0; txd_buf6:0=txd_buf7:1; sta
19、te_tras=state_tras+1; end end 4b0100: begin /发送第4位 if(clkbaud_tras) begin txd_reg=txd_buf0; txd_buf6:0=txd_buf7:1; state_tras=state_tras+1; end end 4b0101: begin /发送第5位 if(clkbaud_tras) begin txd_reg=txd_buf0; txd_buf6:0=txd_buf7:1; state_tras=state_tras+1; end end 4b0110: begin /发送第6位 if(clkbaud_tr
20、as) begin txd_reg=txd_buf0; txd_buf6:0=txd_buf7:1; state_tras=state_tras+1; end end 4b0111: begin /发送第7位 if(clkbaud_tras) begin txd_reg=txd_buf0; txd_buf6:0=txd_buf7:1; state_tras=state_tras+1; end end 4b1000: begin /发送第8位 if(clkbaud_tras) begin txd_reg=txd_buf0; txd_buf6:0=txd_buf7:1; state_tras=st
21、ate_tras+1; end end 4b1001: begin /发送停止位 if(clkbaud_tras) begin txd_reg=1; txd_buf=8h55; state_tras=state_tras+1; end end 4b1111:begin if(clkbaud_tras) begin state_tras=state_tras+1; send_state=send_state+1; trasstart=0; case(send_state) 3b000: txd_buf=8d101;/e 3b001: txd_buf=8d108;/l 3b010: txd_buf
22、=8d99;/c 3b011: txd_buf=8d111;/o 3b100: txd_buf=8d109;/m 3b101: txd_buf=8d101;/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 endendalways(posedge clkbaud8x or negedge rst)/接受PC机的数据begin if(!rst) begin rxd_reg1=0;
23、 rxd_reg2=0; rxd_buf=0; state_rec=0; recstart=0; recstart_tmp=0; end else begin 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 else if(!rxd_reg1&rxd_reg2) /检测到起始位的下降沿,进入接受状态 recstart_tmp=1&state_rec=8) begin if(c
24、lkbaud_rec) begin rxd_buf7=rxd_reg2; rxd_buf6:0=rxd_buf7:1; state_rec=state_rec+1; end end else if(state_rec=9) begin if(clkbaud_rec) begin state_rec=0; recstart=0; end end endendalways(rxd_buf) /将接受的数据用数码管显示出来begin case (rxd_buf) 8h30: seg_data=8b11000000; 8h31: seg_data=8b11111001; 8h32: seg_data=
25、8b10100100; 8h33: seg_data=8b10110000; 8h34: seg_data=8b10011001; 8h35: seg_data=8b10010010; 8h36: seg_data=8b10000010; 8h37: seg_data=8b11111000; 8h38: seg_data=8b10000000; 8h39: seg_data=8b10010000; 8h41: seg_data=8b00010001; 8h42: seg_data=8b11000001; 8h43: seg_data=8b0110_0011; 8h44: seg_data=8b1000_0101; 8h45: seg_data=8b0110_0001; 8h46: seg_data=8b0111_0001; default: seg_data=8b1111_1111; endcaseend endmodule
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1