把 扫描键盘(支持组合键) 电子琴 复杂流水灯 都加上了,感兴趣的看看吧。<br /><br />串口有点问题没调好也不想调试了,以后再说<br /><br />顺便改正了开发板的两个bug<br />1. 蜂鸣器换成交流的,而且,加上了限流电阻<br />2. 行列扫描线加上上拉电阻<br /><br />真想自己做个cpld开发板,可是,做完了,也没啥意思 verilog算是基本会用了。<br /><br />*<br />7段数码管测试实验1:以动态扫描方式在4位数码管,显示32计数器的高16位值 hex码<br />实验的目的是向用户介绍多个数码管动态显示的方法。<br />动态显示的方法是,按一定的频率轮流向各个数码管的COM端送出低电平,同时送出对应的数据给各段。<br /> -- segment encoding<br /> -- 0<br /> -- --- <br /> -- 5 | | 1<br /> -- --- <- 6<br /> -- 4 | | 2<br /> -- --- <br /> -- 3<br />COM is GND<br />*/<br /><br /><br />module seg71(clk,dataout,en,led,row,col,reset,beep,txd,ds);<br /><br />input clk;<br />output[7:0] dataout;<br />output[3:0] en;//COM使能输出<br />output[7:0] led;<br />input reset;<br />reg[7:0] led;<br />reg[7:0] dataout;//各段数据输出<br />reg[3:0] en;<br /><br />inout[3:0] row;<br />inout[3:0] col;<br />wire[3:0] row;<br />wire[3:0] col;<br />reg[7:0] key;<br />reg COL_ZERO;<br />reg ROW_ZERO;<br /><br />output reg beep;<br />reg playing;<br />reg[19:0] counter,counter_end;<br /><br />assign col[3:0]=COL_ZERO?4'b0000:4'bzzzz;<br />assign row[3:0]=ROW_ZERO?4'b0000:4'bzzzz;<br />reg[31:0] cnt_scan;//扫描频率计数器 10M/2^32=0.02Hz 429.5S<br />reg[3:0] dataout_buf;<br /><br />output txd;<br />reg txd;<br />output ds;<br />reg ds;<br />reg txd_end=0;<br />reg txd_flag=1;<br />reg[7:0] txd_clk;<br />reg[3:0] txd_counter;<br />reg[7:0] sbuf=8'h33;//first out data<br />reg[19:0] i=0;<br /><br />always@(posedge clk)<br />begin<br /> cnt_scan=cnt_scan+1;<br /> //////////////////////////txd///////////////////////////////<br /> if (txd_flag) //txd_flag=1表示用数据需要发送<br /> begin<br /> if (txd_clk==8'd86) //10000000/115200.0=86.805555555555557<br /> begin<br /> txd_clk=0;<br /> end<br /> if (txd_clk==0) //<br /> begin<br /> case (txd_counter) //传送时,数据的低位在前,高位在后<br /> 4'h0:<br /> begin<br /> txd=0; //start bit 0<br /> txd_end=0;<br /> end<br /> 4'h1:<br /> txd=sbuf[0];<br /> 4'h2:<br /> txd=sbuf[1];<br /> 4'h3:<br /> txd=sbuf[2];<br /> 4'h4:<br /> txd=sbuf[3];<br /> 4'h5:<br /> txd=sbuf[4];<br /> 4'h6:<br /> txd=sbuf[5];<br /> 4'h7:<br /> txd=sbuf[6];<br /> 4'h8:<br /> txd=sbuf[7];<br /> 4'h9:<br /> txd=1; //stop bit 1<br /> default:<br /> txd=1;<br /> endcase<br /> if (txd_counter==4'ha)<br /> begin<br /> txd_counter=0;<br /> txd_end=1; //add stop bit 1<br /> end<br /> txd_counter=txd_counter+4'h1;<br /> end<br /> txd_clk=txd_clk+4'h1;<br /> end<br /> else//if (txd_flag) //txd_flag=1表示用数据需要发送<br /> begin<br /> end<br /> /////////////////////rxd////////////////////////<br />/* if(rxd==0 && rxd_start==0)<br /> begin<br /> rxd_clk=rxd_clk+1;<br /> if (rxd_clk==87) //10000000/115200.0=86.805555555555557<br /> rxd_clk=0;<br /> if(rxd_clk=43)//中点取样<br /> begin<br /> end;<br /> end<br />*/<br />end<br /><br />always@(posedge clk)<br />begin<br /> i=i+20'h1;<br /> if (txd_end)<br /> txd_flag=0;<br /> if (i==20'hfff) //10M/1M = 0.1/256 s 发送一个数据<br /> begin<br /> ds=~ds;<br /> i=0;<br /> if (!txd_flag)<br /> begin<br /> sbuf[7:0]=8'h01;<br /> txd_flag=1;<br /> end<br /> end<br />end<br />always@(posedge cnt_scan[19])// or negedge reset)<br />begin<br />// if (led[7:0]==0)<br />// led[7:0]=8'b1111_1111;<br />// led[7:0]=led[7:0]<<1;<br /> // temp = led[7];<br />// if (!reset)<br />// led[7:0]=8'b1111_1110;<br />// else<br />// led[7:0]={led[6:0],led[7]};<br />// begin<br /> //led[7:1]<=led[6:0];<br /> //led[0]<=led[7];<br />// led[7:4]=~{key[4],key[5],key[6],key[7]};<br />// led[3:0]=~{key[0],key[1],key[2],key[3]};<br />// end<br /> // led[0]=~led[0];<br /> // led[7:0]=cnt_scan[17:10];<br /> case (led[7:0])<br /> 8'b1111_1111: led[7:0]= 8'b1111_1110;<br /> 8'b1111_1110: led[7:0]= 8'b1111_1101;<br /> 8'b1111_1101: led[7:0]= 8'b1111_1011;<br /> 8'b1111_1011: led[7:0]= 8'b1111_0111;<br /> 8'b1111_0111: led[7:0]= 8'b1110_1111;<br /> 8'b1110_1111: led[7:0]= 8'b1101_1111;<br /> 8'b1101_1111: led[7:0]= 8'b1011_1111;<br /> 8'b1011_1111: led[7:0]= 8'b0111_1111;<br /> 8'b0111_1111: led[7:0]= 8'b0011_1111;<br /><br /> 8'b0011_1111: led[7:0]= 8'b1001_1111;<br /> 8'b1001_1111: led[7:0]= 8'b1100_1111;<br /> 8'b1100_1111: led[7:0]= 8'b1110_0111;<br /> 8'b1110_0111: led[7:0]= 8'b1111_0011;<br /> 8'b1111_0011: led[7:0]= 8'b1111_1001;<br /> 8'b1111_1001: led[7:0]= 8'b1111_1100;<br /> 8'b1111_1100: led[7:0]= 8'b1111_1110;<br /> default:led[7:0]= 8'b1111_1111;<br /> endcase<br /><br />end<br /><br /><br />//频率 10M/65535 = 152 Hz<br />always @(cnt_scan or row or col or key or COL_ZERO or ROW_ZERO)<br />begin<br /> case(cnt_scan[15:14])<br /> 2'b00 :<br /> begin<br /> en = 4'b1110;<br /> dataout_buf[3:0]= cnt_scan[31:28];<br /> COL_ZERO=1;//col 输出0<br /> ROW_ZERO=0;//row zzzz<br /> end<br /> 2'b01 :<br /> begin<br /> en = 4'b1101;<br /> dataout_buf[3:0]=cnt_scan[27:24];<br /> key[3:0]=row[3:0];<br /> end<br /> 2'b10 :<br /> begin<br /> en = 4'b1011;<br /> dataout_buf[3:0]=key[3:0];<br /> COL_ZERO=0; //col zzzzzzzz<br /> ROW_ZERO=1;<br /> end<br /> 2'b11 :<br /> begin<br /> en = 4'b0111;<br /> key[7:4]=col[3:0];<br /> dataout_buf[3:0]=key[7:4];<br /><br /> end<br /> default :<br /> begin<br /> en = 4'b1111;<br /> dataout_buf[3:0]=4'b1111; <br /><br /> end<br /> endcase<br />end<br /><br />always@(dataout_buf)<br />begin<br /> case(dataout_buf)<br /> 4'b0000:<br /> dataout[7:0]=8'b00111111; //0<br /> 4'b0001:<br /> dataout[7:0]=8'b00000110; //1<br /> 4'b0010:<br /> dataout[7:0]=8'b01011011; //2<br /> 4'b0011:<br /> dataout[7:0]=8'b01001111; //3<br /> 4'b0100:<br /> dataout[7:0]=8'b01100110; //4<br /> 4'b0101:<br /> dataout[7:0]=8'b01101101; //5<br /> 4'b0110:<br /> dataout[7:0]=8'b01111101; //6<br /> 4'b0111:<br /> dataout[7:0]=8'b00000111; //7<br /> 4'b1000:<br /> dataout[7:0]=8'b01111111; //8<br /> 4'b1001:<br /> dataout[7:0]=8'b01101111; //9<br /> 4'b1010:<br /> dataout[7:0]=8'b11110111; //A<br /> 4'b1011:<br /> dataout[7:0]=8'b11111100; //b<br /> 4'b1100:<br /> dataout[7:0]=8'b10111001; //C<br /> 4'b1101:<br /> dataout[7:0]=8'b11011110; //d<br /> 4'b1110:<br /> dataout[7:0]=8'b11111001; //E<br /> 4'b1111:<br /> dataout[7:0]=8'b11110001; //F<br /> default:<br /> dataout[7:0]=8'b00000000; // <br /> endcase<br />end<br /><br />always@(posedge clk)<br />begin<br /> if ((playing))<br /> begin<br /> counter=counter+20'd1;<br /> if (counter[19:0]==counter_end[19:0])<br /> begin<br /> counter=0;<br /> beep=~beep;<br /> end<br /> end<br /> else<br /> begin<br /> beep=0;<br /> end<br />end<br /><br />always@(key or reset)<br />begin<br /> if (!reset)<br /> begin<br /> counter_end=5000;<br /> playing=1;<br /> end<br /> else<br /> case(key)<br /> 8'h77:<br /> begin<br /> counter_end<=19111;//低音1 5000000/261.63 <br /> playing<=1;<br /> end <br /> 8'hb7:<br /> begin<br /> counter_end<=17026;//低音2 293.67 <br /> playing<=1;<br /> end <br /> 8'hd7:<br /> begin<br /> counter_end<=15169;//低音3 5000000/329.63 15168.522282559234<br /> playing<=1;<br /> end <br /> 8'he7:<br /> begin<br /> counter_end<=14317;//低音4 5000000/349.23 <br /> playing<=1;<br /> end <br /> 8'h7b:<br /> begin<br /> counter_end<=12778;//低音5 5000000/391.39 12774.98147627686<br /> playing<=1;<br /> end <br /> 8'hbb:<br /> begin<br /> counter_end<=11364;//低音6 5000000/440.0 11363.636363636364 <br /> playing=1;<br /> end <br /> 8'hdb:<br /> begin<br /> counter_end=10124;//低音7 5000000/493.88 10123.916740908722 <br /> playing=1;<br /> end <br /> 8'heb:<br /> begin<br /> counter_end=9556;//中音1 5000000/523.25 9555.6617295747728 <br /> playing=1;<br /> end <br /> 8'h7d:<br /> begin<br /> counter_end=8513;//中音2 5000000/587.33 8513.1016634600637 playing:=1;<br /> playing=1;<br /> end <br /> 8'hbd:<br /> begin<br /> counter_end=7584;//中音3 5000000/659.25 7584.3761850587789<br /> playing=1;<br /> end <br /> 8'hdd:<br /> begin<br /> counter_end=7159;//中音4 45000000/698.46 7158.6060762248371<br /> playing=1;<br /> end <br /> 8'hed:<br /> begin<br /> counter_end=6378;//中音5 55000000/783.99 6377.6323677597929<br /> playing=1;<br /> end <br /> 8'h7e:<br /> begin<br /> counter_end=5682;//中音6 5000000/880.0 5681.818181818182<br /> playing=1;<br /> end <br /> 8'hbe:<br /> begin<br /> counter_end=5062;//中音7 75000000/987.76 5061.9583704543611<br /> playing=1;<br /> end <br /> 8'hde:<br /> begin<br /> counter_end=4778;//高音1 5000000/1046.50 4777.8308647873864<br /> playing=1;<br /> end <br /> 8'hee:<br /> begin<br /> counter_end=4257;//高音2 5000000/1174.66 4256.5508317300319<br /> playing=1;<br /> end <br /> 8'h6e:<br /> begin<br /> counter_end=3792;//高音3 5000000/1318.51 3792.1593313664666<br /> playing=1;<br /> end <br /> 8'hae:<br /> begin<br /> counter_end=3579;//高音4 5000000/1396.92 3579.3030381124186<br /> playing=1;<br /> end <br /> 8'hce:<br /> begin<br /> counter_end=3189;//高音5 5000000/1567.98 3188.8161838798965<br /> playing=1;<br /> end <br /> 8'hec:<br /> begin<br /> counter_end=2841;//高音6 5000000/1760.0 2840.909090909091<br /> playing=1;<br /> end <br /> 8'hea:<br /> begin<br /> counter_end=2531;//高音7 5000000/1975.52 2530.9791852271806<br /> playing=1;<br /> end <br /> 8'hff:<br /> begin<br /> //counter_end=20'hx_xxxx;//静音<br /> playing=0;<br /> end <br /> default:<br /> begin<br /> //counter_end[19:12]=1000;//key test <br /> playing=0;<br /> end <br /> endcase<br />end<br /><br /><br />endmodule
|