用verilog语言设计四位简单计算器.doc
module jsq(clk,keyin,keyout,leda,ledb,num3);inputclk;input3:0keyin;output3:0keyout;reg3:0keyout;output3:0leda;reg3:0leda;output3:0ledb;reg3:0ledb;integer clk_klv;output31:0num3;always (posedge clk)/分频clk_klv=clk_klv+1;reg1:0keyhang=0;/按键扫描reg3:0keynum=0;/最近按键的值regkeyen=0;/按键锁定作用,每次都必须重新按下才有效regkeysign=0;/当前按键的属性,0代表数字,1代表 +-*/=复位reg7:0delay=0;/按键消抖regorder2=0;/作用:延迟一个时钟,keyen跳变输出,确保keynum被赋值always (posedge clk_klv10)beginif(order2=0)begincase(keyhang,keyin)6'b00_1110: begin delay=0;if(keyen=0)begin keysign=0;keynum=4'h0;order2=1;end end6'b00_1101: begin delay=0;if(keyen=0)begin keysign=0;keynum=4'h1;order2=1;end end6'b00_1011: begin delay=0;if(keyen=0)begin keysign=0;keynum=4'h2;order2=1;end end6'b00_0111: begin delay=0;if(keyen=0)begin keysign=0;keynum=4'h3;order2=1;end end6'b01_1110: begin delay=0;if(keyen=0)begin keysign=0;keynum=4'h4;order2=1;end end6'b01_1101: begin delay=0;if(keyen=0)begin keysign=0;keynum=4'h5;order2=1;end end6'b01_1011: begin delay=0;if(keyen=0)begin keysign=0;keynum=4'h6;order2=1;end end6'b01_0111: begin delay=0;if(keyen=0)begin keysign=0;keynum=4'h7;order2=1;end end6'b10_1110: begin delay=0;if(keyen=0)begin keysign=0;keynum=4'h8;order2=1;end end6'b10_1101: begin delay=0;if(keyen=0)begin keysign=0;keynum=4'h9;order2=1;end end6'b10_1011: begin delay=0;if(keyen=0)begin keysign=1;keynum=4'ha;order2=1;end end6'b10_0111: begin delay=0;if(keyen=0)begin keysign=1;keynum=4'hb;order2=1;end end6'b11_1110: begin delay=0;if(keyen=0)begin keysign=1;keynum=4'hc;order2=1;end end6'b11_1101: begin delay=0;if(keyen=0)begin keysign=1;keynum=4'hd;order2=1;end end6'b11_1011: begin delay=0;if(keyen=0)begin keysign=1;keynum=4'he;order2=1;end end6'b11_0111: begin delay=0;if(keyen=0)begin keysign=1;keynum=4'hf;order2=1;end enddefault: begin keyhang=keyhang+1;delay=delay+1;if(delay>=100)keyen=0;endendcasecase(keyhang)0:keyout=4'b1110;1:keyout=4'b1101;2:keyout=4'b1011;3:keyout=4'b0111;endcaseendelsebegin keyen=1;order2=0;endendreg 2:0order=0;/当前状态integernum1=0,num2=0,num3=0;/第一个,第二个,结果reg 3:0sign;/+-*/reg7:0lednum=100;/显示的数字reg3:0in_num=0;/限制显示的数字位,限制在2为:099always (posedge keyen)begincase(order)0:if(keysign)begin sign3:0=keynum3:0;order=order+1;in_num=0;end/在没有按下+-*/之前会存储数字else if(num1<10000)begin num1=num1*10+keynum;lednum=num1; in_num=in_num+1;end1:if(keysign)begin case(sign)/在没有按下=号之前会存储数字4'ha:num3=num1+num2;4'hb:num3=num1-num2;4'hc:num3=num1*num2;4'hd:num3=num1/num2;endcaselednum=num3+0;order=order+1;end else if(num2<10000)begin num2=num2*10;num2=num2+keynum;lednum=num2;in_num=in_num+1;endendcaseif(keynum=4'hf)begin order=0;num1=0;num2=0;num3=0;lednum=100;end/复位endalways (*)/显示函数if(lednum<=99)beginleda=lednum/10;ledb=lednum%10;endelsebeginleda=15;ledb=15;endendmodule