Verilog程序代码集
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.全加器
Sum=A⊕B⊕Cin
Count=AB+Cin(A+B)
①数据流
module adder(a,b,Cin,Sum,Count); input [2:0]a,b;
input Cin;
output [2:0] Sum;
output Count;
assign {Count,Sum}=a+b+Cin; endmodule
②行为描述always语句
module adder(a,b,c,Cin,Sum,Count); input [4:0] a,b;
input Cin;
output reg [4:0] Sum;
output reg Count;
reg T1,T2,T3;
always@(a or b or Cin)
begin
Sum=a^b^Cin;
T1=A&B;
T2=Cin&A;
T3=Cin&B;
Count=T1|T2|T3;
end
endmodule
③结构体
module adder (a,b,Cin,Sum,Count);input a,b,Cin;
output Sum,Count;
Xor a1(s1,a1,b);
Xor a2(Sum,s1,Cin);
and a3(T1,a,b);
or a4(T2,a,b);
and a5(T3,Cin,T2);
or a6(Count,T1,T3);
Endmodule
2.数值比较器
①判断两值是否相等
module compare(a,b,equal);
input [7:0] a,b;
output equal;
assign equal=(a==b)?|0; ②谁大谁输出
module compare(a,b,out);
input [7:0] a,b;
output reg[7:0] out;
always@(a or b)
begin
if (a>b) out<=a;
else if (a==b) out<=a;
else out<=b;
end
endmodule
③输出参数
module compare(a.b.xgy,xsy,xey);
input [7:0] x,y;
output reg xgy,xsy,xey;
always@(x or y)
begin
if (x==y) xey=1;
else xey=0;
if (x>y) begin xgy=1;xsy=0;end
else if (x endmodule 3.编码器(4-2 8-3 16-4编码) ①case语句8-3编码(优先) module code (in ,out); input [7:0] in; output reg [2:0] out; always@(in) case x(in) begin f=1;8‟b1xxxxxxx:out=3‟b111;end begin f=1;8‟b01xxxxxx:out=3‟b110;end begin f=1;8‟b001xxxxx:out=3‟b101;end begin f=1;8‟b0001xxxx:out=3‟b100;end begin f=1;8‟b00001xxx:out=3‟b011;end begin f=1;8‟b000001xx:out=3‟b010;end begin f=1;8‟b0000001x:out=3‟b001;end begin f=1;8‟b00000001:out=3‟b000;end default:begin f=0:out=3‟b000;end endcase endmodule ②if-else语句(4-2优先编码) module code(in,out); input[3:0] in; output reg [1:0] out; always@(in) if (in[3]==1):begin f=1;out=2‟b11;end else if (in[2]==1):begin f=1;out=2‟b10;end else if (in[1]==1):begin f=1;out=2‟b01;end else if (in[0]==1):begin f=1;out=2‟b00;end else begin f=0;out=2‟b00;end endmodule 4.多路选择器 ①行为描述(4选1) module choice(A,B,C,D,ncs addr out); input [7:0]A,B,C,D; input ncs; input [1:0] addr ; output reg[7:0] out; always@(A or B or C or D or ncs or addr) begin if (!ncs) case(addr) 2‟b00:out=A; 2‟b01:out=B; 2‟b10:out=C; 2‟b11:out=D; endcase else out=0; end endmodule 5.设计一个4位双向移位寄存器。module shift(sout,out,clk,in,sin,d,load); input clk,sin,d,load;input[3:0]in; output sout;output[3:0]out; reg[3:0]out; always @(posedge clk) if(load) out<=in; else if(d==0) begin out<=out>>1;out[3]<=sin;sout<=out[0];end else begin out<=out<<1;out[0]<=sin;sout<=out[3];end 6.11111010000序列检测器module shift(q,s,d,clk); output[11:0] q; output s; input d; input clk; reg[11:0] q; reg s; always @(posedge clk) begin q<=q<<1;q[0]<=d; end always @(posedge clk ) if(q==12'b 11111010000) s<=1; else s<=0; Endmodule 7.计数器 ①计数分频器 8分频占空比1:1 module div(clk8,clk,rst); input clk,rst; output reg clk8; reg [2:0] count; always@(posedge clk) begin if (rst) begin clk8<=0;count<=0;end else begin if (count==7) count<=0; else count<=count+1; if (count<=3) clk_8<=0; else clk_8<=1; end end endmodule