最近上手一个新项目,工期有点赶,收到很多同学私信催续更,加班加点的终于差不多完事了,开始了心心念念的续更,在这里谢谢大家的支持。
上一张对模块概念和调用作了详细描述,本文主要对模块调用进行巩固,基础模块比如触发器、计数器、选择器都是构建复杂模块的基本单元,这些基础得打牢,建议大家一定要多看代码,下面就带大家一起实战操作。
需要注意的点都在代码里面作了说明,还有问题的可以私信我,我会统一时间回复。
module AOI(A,B,C,D,F);
//模块名为 AOI(端口列表 A,B,C,D,F)
input A,B,C,D;
//模块的输入端口为 A,B,C,D
output F;
//模块的输出端口为 F
wire A,B,C,D,F;
//定义信号的数据类型
assign F= ~((A&B)|(C&D)); //逻辑功能描述
endmodule
module mux4_1(out,in0,in1,in2,in3,sel);
output out;
input in0,in1,in2,in3;
//默认wire型
input[1:0] sel;
reg out;
/*
如果output作为过程赋值语句的左值,则应该用reg类型;
如果output作为连续赋值语句的左值,则应该用wire类型。
*/
always @(in0 or in1 or in2 or in3 or sel) //敏感信号列表
case(sel)
2'b00: out=in0;
2'b01: out=in1;
2'b10: out=in2;
2'b11: out=in3;
default: out=2'bx;
endcase
endmodule
module adder4(cout,sum,ina,inb,cin);
output[3:0] sum;
output cout;
input[3:0] ina,inb;
input cin;
assign {cout,sum}=ina+inb+cin;
endmodule
module count4(out,reset,clk);
output[3:0] out;
input reset,clk;
reg[3:0] out;
always @(posedge clk)
begin
if (reset) out<=0;
//同一个时钟下为同步复位
else out<=out+1;
//计数
end
endmodule
module count(out,data,load,reset,clk);
output[7:0] out;
input[7:0] data;
input load,clk,reset;
reg[7:0] out;
always @(posedge clk) //clk 上升沿触发
begin
if (!reset) out = 8'h00; //同步清 0,低电平有效
else if (load) out = data; //同步预置
else out = out + 1; //计数
end
endmodule
`define add 3'd0
`define minus 3'd1
`define band 3'd2
`define bor 3'd3
`define bnot 3'd4
module alu(out,opcode,a,b);
output[7:0] out;
reg[7:0] out;
input[2:0] opcode; //操作码
input[7:0] a,b; //操作数
always@(opcode or a or b) //电平敏感的 always 块
begin
case(opcode)
`add: out = a+b; //加操作
`minus: out = a-b; //减操作
`band: out = a&b; //求与
`bor: out = a|b; //求或
`bnot: out=~a; //求反
default: out=8'hx; //未收到指令时,输出任意态
endcase
end
endmodule
章节进程条-STEP1