Verilog经典设计模块
3-1 半加器的Verilog 描述
module h_adder(A,B,SO,CO);
input A,B;
output SO,CO;
assign SO=A^B;
assign CO=A&B;
endmodule
3-2 三八译码器
module yima(input [2:0] sel,output [7:0] y)
case(sel)
3'b000:y=8'd00000001;
3'b001:y=8'd00000010;
3'b010:y=8'd00000100;
3'b011:y=8'd00001000;
3'b100:y=8'd00010000;
3'b101:y=8'd00100000;
3'b110:y=8'd01000000;
3'b111:y=8'd10000000;
3-6 全加器设计以及例化语句应用
module f_adder(ain,bin,cin,cout,sum);
output cout,sum;
input ain,bin,cin;
wire net1,net2,net3;
h_adder U1(ain,bin,net1,net2);
h_adder U2(.A(net1),.SO(sum),.B(cin),.CO(net3);
// A为内部元件端口 net1为外部元件端口
or U3 (cout,net2,net3);
endmodule
例3-14 设计4位乘法器
module MULT4B(A,B,R);
parameter S=4;
output [2*S:1] R;
input [S:1] A,B;
reg [2*S:1] AT,R;
reg [S:1] BT,CT;
always@(A or B)
begin
R=0;AT={{S{1'b0}},A};
BT=B;
CT=S;
while(CT>0) begin
if(BT[1]) R=R+AT;
else
R=R;
begin CT=CT-1;
AT=AT<<1;
BT=BT>>1; end
end
endmodule
5-4含同步复位控制的D触发器设计
module DFF1(CLK,D,Q,RST);
input CLK,D,RST;
output Q;
reg Q,Q1;
always@(RST)
if(RST)
Q1<=0;
else
Q1<=D;
always@(posedge CLK)
Q<=Q1;
endmodule
5-13 带有异步复位,同步计数使能和可预置型的十进制计数器的程序设计
module CNT10(CLK,RST,EN,LOAD,COUT,DOUT,DATA)
input CLK,RST,EN,LOAD;
input [3:0] DATA;
output [3:0] DOUT;
output COUT;
reg COUT;
reg Q1;
assign DOUT=Q1;
always@(posedge CLK or negedge RST)
if(!RST) Q1<=0;
else if (EN)
begin
if(!LOAD) Q1<=DATA;
else if(Q1<9) Q1<=Q1+1;
else Q1<=4'b0000;
end
endmodule
5-15 用移位操作符设计 4位右移 移位寄存器
Module SHIF4 (DIN,CLK,RST,DOUT);
input CLK,DIN,RST;
output DOUT;
reg [3:0] SHFT;
always@(posedge CLK or posedge RST)
if(RST) shft<=4'B0;
else begin SHFT<=(SHFT>>1);
SHFT[3]<=DIN; end
assign DOUT=SHFT[0];
endmodule
5-16 同步加载计数器设计
module FDIV0B (input CLK,RST,input [3:0] D,output PM,output [3:0] DOUT);
reg [3:0] Q1;
reg FULL;
wire LD;
always@(posedge CLK or negedge RST)
if(!RST) begin Q1<=0;FULL<=0;end
else begin Q1<=Q1+1; FULL<=0;end
assign LD=(Q1==4'B1111);
assign PM=FULL;
assign DOUT=Q1;
endmodule
序列检测器设计 检测序列11010011
module SCHK (input CLK,DIN,RST,output SOUT);
parameter s0=40,s1=41,s2=42,s3=43,s4=44,s5=45,s6=46,s7=47,s8=48;
reg [8:0] ST,NST;
always@ ( posedge CLOK or posedge RST)
if( RST ) ST<=s0;else ST<=NST;
always@(ST or DIN) begin
case (ST)
s0: if ( DIN==1'b1) NST<=s1;else NST<=s0;
s1:if ( DIN==1'b1) NST<=s2;else NST<=s0;
s2:if ( DIN==1'b0) NST<=s3;else NST<=s2;
s3:if ( DIN==1'b1)NST<=s4;else NST<=s0;
s3:if ( DIN==1'b0)NST<=s5;else NST<=s2;
s3:if ( DIN==1'b0)NST<=s6;else NST<=s1;
s3:if ( DIN==1'b1)NST<=s7;else NST<=s0;
s3:if ( DIN==1'b1)NST<=s8;else NST<=s0;
s3:if ( DIN==1'b0)NST<=s3;else NST<=s2;
default :NST<=s0;
endcase end
assign SOUT =(ST==s8);
endmodule