资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,6-11,6-11,试编写求补码的,Verilog,程序,输入是带符号的,8,位二进制数,module wytest(data_in,data_out);,/,习题,6-11,input7:0 data_in;,output7:0 data_out;,reg7:0 data_out;,always(data_in),begin,if(data_in7)/,正数负数判断,从最高是否为,1,来判断,data_out=(data_in)+1)|8h80;,else,data_out=data_in;,end,endmodule,6-11,仿真波形,8A-,原码表示的十进制数,-10 0A-,十进制数,10,B6-,原码表示的十进制数,-54 36-,十进制数,53,80-,原码表示的十进制数,128,6-12,6-12,编写两个四位二进制数相减的,verilog,程序,module wytest(opr1,opr2,out_data);/,完成,Opr1-opr2,的运算,input3:0 opr1,opr2;,output4:0 out_data;,reg3:0 out;,reg cout;,function3:0 abs;,input3:0 data;,case(data3),1b0:abs=data;,1b1:abs=(data)+1;/,对负数求绝对值,按位取反再加,1,endcase,endfunction,6-12,always(opr1 or opr2),case(opr13,opr23),2b00:cout,out=opr1-opr2;/,两个正数相减,2b01:cout,out=opr1+abs(opr2);/,正数减负数,化为加,法运算,2b10:cout,out=-(abs(opr1)+opr2);,/,负数减正数,化为加,法再取反,2b11:cout,out=abs(opr2)-abs(opr1);/,负数相减,化为绝,对值相减(顺序调换),endcase,assign out_data=cout,out;,endmodule,6-12,6-12,仿真波形,6-13,6-13,有一个比较电路,当输入的一位,BCD,码,大于,4,时,输出,1,,否则输出,0,。,module wytest(bcd_in,out);,input3:0 bcd_in;,output out;,assign out=(,bcd_in4,)?1:0;,endmodule,6-13,仿真波形,6-13,module wytest(bcd_in,out);/,习题,6-13,input3:0 bcd_in;,output out;,/assign out=(bcd_in4)?1:0;,reg out;,always(bcd_in),if(,bcd_in-40,),out=1;,else,out=0;,endmodule,6-13,6-14,试编写一个实现,3,输入与非门的,verilog,程序;,module wytest(a,o);,input2:0 a;,output o;,nand nand3(o,a0,a1,a2);,endmodule,6-14,6-15,6-15,设计,74138,译码器电路,6-15,module wytest(s1,s2,in,out);,input s1;,input1:0 s2;,input2:0 in;,output7:0 out;,reg8:0 out;,always(s1 or s2 or in),begin,if(s1=0),out=8hff;,else if(!s20)|(!s21),out=8hff;,else,case(in),3d0:out=8b11111110;,3d1:out=8b11111101;,3d2:out=8b11111011;,3d3:out=8b11110111;,3d4:out=8b11101111;,3d5:out=8b11011111;,3d6:out=8b10111111;,3d7:out=8b01111111;,endcase,end,endmodule,6-15,6-16,C,O,=,Q,3,Q,2,Q,1,Q,0,CT,T,注意:异步清零、同步置位,6-16,设计一个,74161,的电路。,6-16,module wytest(reset,load,ctt,ctp,clk,data_in,out,co);/,习题,6-16,input reset,load,ctt,ctp,clk;,input3:0 data_in;,output3:0 out;,output co;,reg3:0 out;,reg co;,always(posedge clk or negedge reset),if(!reset),begin,out=4b0;,co=1b0;,end,else if(!load),out=data_in;,else if(!ctt),out=out;,else if(!ctp),out=out;,else,begin,out=out+1;,if(out=14),co=1;,else,co=0;,end,endmodule,6-16,四级流水线实现的,32,位加法器,module wytest(clk,a,b,sum,cout);,input31:0 a,b;,input clk;,output31:0 sum;,output cout;,/,最后输出的结果,reg31:0 sum;,reg cout;,/,第一级流水线的输出,reg7:0 fist_sum;,reg first_cout;,/,第一级流水线要缓存的数据,/,未用的数据缓存,reg7:0 first_a_31_24,first_a_23_16,first_a_15_8;,reg7:0 first_b_31_24,first_b_23_16,first_b_15_8;,四级流水线实现的,32,位加法器,/,第二级流水线的输出,reg7:0 second_sum;,reg second_cout;,/,第二级流水线要缓存的数据,/,未用的数据缓存,reg7:0 second_a_31_24,second_a_23_16;,reg7:0 second_b_31_24,second_b_23_16;,/,第一级流水线计算结果缓存,reg7:0 first_sum_1;/,第一级流水线计算结果第一次缓存,/,第三级流水线输出,reg7:0 third_sum;,reg third_cout;,/,第三级流水线要缓存的数据,/,未用的数据缓存,reg7:0 third_a_31_24;,reg7:0 third_b_31_24;,/,第一级、第二级流水线计算结果缓存,reg7:0 first_sum_2;/,第一级流水线计算结果第二次缓存;,reg7:0 second_sum_1;/,第二级流水线计算结果第一次缓存,;,四级流水线实现的,32,位加法器,/,第一级流水线,always(posedge clk),begin,first_cout,fist_sum=a7:0+b7:0+cout;,first_a_31_24=a31:24;,first_b_31_24=b31:24;,first_a_23_16=a23:16;,first_b_23_16=b23:16;,first_a_15_8=a15:8;,first_b_15_8=b15:8;,end,/,第二级流水线,always(posedge clk),begin,second_cout,second_sum=first_a_15_8+first_b_15_8+first_cout;,second_a_31_24=first_a_31_24;,second_b_31_24=first_b_31_24;,second_a_23_16=first_a_23_16;,second_b_23_16=first_b_23_16;,first_sum_1=fist_sum;,end,四级流水线实现的,32,位加法器,/,第三级流水线,always(posedge clk),begin,third_cout,third_sum=second_a_23_16+second_b_23_16+second_cout;,third_a_31_24=second_a_31_24;,third_b_31_24=second_b_31_24;,first_sum_2=first_sum_1;,second_sum_1=second_sum;,end,/,第四级流水线,always(posedge clk),begin,cout,sum31:24=third_a_31_24+third_b_31_24+third_cout;,sum23:0=third_sum,second_sum_1,first_sum_2;,end,endmodule,四级流水线实现的,32,位加法器,8x8,乘法器实现,module wytest(out,a,b,clk);,input7:0 a,b;,input clk;,output15:0 out;,reg15:0 out;,reg3:0 firsta,firstb;,reg3:0 seconda,secondb;,wire7:0 outa,outb,outc,outd;,always(posedge clk),begin,firsta3:0=a7:4;,seconda3:0=a3:0;,firstb3:0=b7:4;,secondb3:0=b3:0;,end,mul4x4 m1(outa,firsta,firstb,clk),m2(outb,seconda,firstb,clk),m3(outc,firsta,secondb,clk),m4(outd,seconda,secondb,clk);,always(posedge clk),out=(outa8)+(outb4)+(outc,4)+outd;,endmodule,8x8,乘法器实现,用另一种方法实现:,将,8,位数字分成,4,段,每段两位,那么操作数可表示如下:,A=A1X2,6,+A2X2,4,+A3X2,2,+A4,B=B1X2,6,+B2X2,4,+B3X2,2,+B4,AXB=(A1X2,6,+A2X2,4,+A3X2,2,+A4)X(B1X2,6,+B2X2,4,+B3X2,2,+B4),上式展开后,要做,16,次,2X2,的乘法,调用,16,次,lookup,函数,然后再做移位相加的处理。,7-5,编写,4,位并,-,串转换电路,module wytest(clk,rst,in,out);,input clk,rst;,input3:0 in;,output out;,reg out;,reg1:0 i;,always(posedge clk),begin,if(rst)begin,i=2d0;,out=1d0;,end,else,if(i=3),begin,out=ini;,i=i+1;,end,end,模为,9,的占空比,50%,的奇数分频,module wytest(RESET,CLK,COUT);,input CLK,RESET;output COUT;,reg,3:0,m,n;,wire COUT;,reg COUT1,COUT2;,assign COUT=COUT1|COUT2;,always(posedge CLK),begin,if(!RESET),begin,COUT1=0;/,输出信号初态为,0,m=0;/,计数初值为,0,end,else if(RESET),begin,if(,m=8,),/n-1,begin,m=0;,end,else,m=m+1;,if(,m=3,),/N/2-1.5,COUT1=COUT1;,else if(,m=7,)/N-2,COUT1=COUT1;,end,end,always(negedge CLK),begin,if(!RESET),begin,COUT2=0;,n=0;,end,else if(RESET),begin,if(,n=8,),begin,n=0;,end,else,n=n+1;,if(,n=3,),COUT2=COUT2;,else if(,n=7,),COUT2=COUT2;,end,end,Endmodule,模为,9,的占空比,50%,的奇数分频,模为,9.3,的小数分频,分频方法,:,9,分频,7,次,,10,分频,3,次,module fdiv8_1(clk_in,rst,clk_out);,input clk_in,rst;,output clk_out;,reg clk_out;,reg3:0 cnt1;/cnt1,计,8,分频的次数,reg3:0 cnt2;/cnt2,为两个分频器的计数值,always(posedge clk_in or posedge rst),begin,if(rst),begin,cnt1=0;cnt2=0;clk_out=0;,end,else if(,cnt17,),/9,分频,7,次,begin,if(,cnt28,)/9,分频的前,8,个脉冲的处理,begin,cnt2=cnt2+1;,clk_out=0;,end,else /,处理最后一个输入脉冲,begin,cnt2=0;,clk_out=1;,cnt1=cnt1+1;,end,end,模为,9.3,的小数分频,else if(,cnt110,),begin,if(,cnt29,),/10,分频的前,9,个脉冲处理,begin,cnt2=cnt2+1;,clk_out=0;,end,else,begin,cnt2=0;,clk_out=1;,if,(,cnt1=9,),cnt1=0;,else cnt1=cnt1+1;,end,end,end,endmodule,习题,10-3 “1001”,二进制序列检测器,S0,S1,S2,S3,1/0,0/0,0/0,0/0,1/1,1/0,1/0,0/0,RESET,module wytest(reset,clk,in,out);,input reset,clk,in;,output out;,reg out;,reg1:0 state,next_state;,parameter s0=2d0,s1=2d1,s2=2d2,s3=2d3;,always(posedge clk),begin,if(!reset),state=s0;,else,state=next_state;,end,always(state or in),case(state),s0:if(in=1)next_state=s1;,else next_state=s0;,s1:if(in=0)next_state=s2;,else next_state=s1;,s2:if(in=0)next_state=s3;,else next_state=s1;,s3:if(in=1)next_state=s1;,else next_state=s0;,default:next_state=s0;,endcase,always(state or in),case(state),s0:if(in=1)out=0;,else out=0;,s1:if(in=0)out=0;,else out=0;,s2:if(in=0)out=0;,else out=0;,s3:if(in=1)out=1;,else out=0;,default:out=0;,endcase,endmodule,
展开阅读全文