Verilog数字系统设计
专用硬线逻辑与微处理器的比较
微处理器:设计周期短,可以利用的资源多;但速度,能耗,体积等性能受该微处理器芯片和外围电路的;串口工作方式 专用硬线逻辑:由于FPGA是一种通用的器件,它的基本结构决定了只对某一种特殊的应用,其性能不如专用的ASIC电路;功能单一 名词缩写
SOC 片上系统 SOPC 片上可编程系统 UDP 用户定义源语元件(用真值表表达) ASIC 专用集成电路 HDL 硬件描述语言 EDA 电子设计自动化
PLD 可编程逻辑器件 {FPGA现场可编程逻辑门阵列
CPLD 复杂的可编程逻辑器件}
Verilog HDL与VHDL的比较
Verilog HDL 拥有更广泛的设计群体,成熟的资源也远比VHDL丰富。且Verilog HDL 是一种非常容易掌握的硬件描述语言;而掌握VHDL设计技术比较困难。 Verilog的优越性使其成为IEEE标准,因而拥有更强的生命力。 IP核:是具有知识产权的
包括:软核:源代码,设计文件(Verilog HDL模型 固核:经过编译的(电路结构编码文件
硬核:于芯片结合的(电路结构版图掩膜 测试模块
module test(sout,sin,ena); output sout; input sin,ena;
mytri tri_int(.out(sout),.in(sin),.enable(ena)); endmodule
module mytri(out,in,enable); output out;//默认为wire类型 input in,enable;
assign out=enable?in:’bz;//‘bz高阻 endmodule
Verilog 的基本设计单元式“模块”(block)
模块由两部分组成: 一部分描述接口; 另一部分描述逻辑功能。 Verilog程序包括4个部分:端口定义,I/O口说明,内部信号声明和功能定义 输入输出,方向,位宽,数据类型; 顺序块:顺序执行 parameter d=50; reg[7:0] r; begin
#d r=’h35;
#d ->end_ware;//表示触发事件end_ware使其翻转
end
并行块:同时执行 reg[7:0] r; fork
#50 r=’h35;
#150 ->end_ware;//表示触发事件end_ware使其翻转
join
module test; „„ always begin „„ end initial begin „„ end
endmodule
在这个module中always模块与initial模块同时执行 赋值
Input[width-1:0] r1; Parameter geshu=4; Input r2[geshu-1:0]; reg[width-1:0] r1; reg r2[geshu-1:0]; output[width-1:0] r3; wire[width-1:0] r3; assign r3=r1|r2;
reg 时序逻辑电路(赋值有先后区别的,always必须reg) wire组合逻辑电路(内部线连接,assign必须用wire) 其他时候要判断过的
Decode #(4,0) D1(A4,F16); 等同于:Decode D1(A4,F16);deparam D1.width=4
Decode模块名,D1自己调用时取的名字,width模块中的参数 阻塞式:
reg FF1,FF2,FF3;
always@(posedge Clock); begin Output=FF3;
FF3=FF2; FF2=FF1; FF1=Input;
End
非阻塞式:
reg FF1,FF2,FF3;
always@(posedge Clock); begin FF1《=Input;
FF2《=FF1; FF3《=FF2; Outpu《t=FF3;
end
连续赋值:
module mytri(out,in,enable); output out;//默认为wire类型 input in,enable;
assign out=enable?in:’bz;//‘bz高阻 endmodule
always@(al or d); begin
if(al) q=d;//有锁存器 end
always@(al or d); begin if(al) q=d; else q=0; //无锁存器 end
initial 语句只执行一次。用于初始化
always语句在仿真过程中时不断活动着的
task定义任务。无返回值,能启动任务和函数,出入变量可有可无可多可少 task light
output color; input[31:0] tics;
begin repeat(tics) @(posedge clock);//等待tics个时钟的上升沿 Color=off; //关灯 end endtask
function定义函数。有返回值,不能启动任务,至少一个输入变量 functiom<返回值的类型或范围>(函数名及返回值,例如getbyte); <端口定义>
<内部信号声明> begin „„
(getbyte=„„;) end
endfunction
看书P117页
从行为和功能表述一块电路模块 行为模块:系统级,算法级,RTL级 结构模块:门级,开关级
看书P313实验代码的注释(表述代码功能,不是单纯读代码,而是要讲出实际意义) 10进制计数器 测试代码
module test(rest,clk,q);
reg rest;// cnt的输入 reg clk; // cnt的输入
wire q; //作为test_cnt10的输入,cnt的输出 always #50 clk=~clk; initial
begin
reset=0; clk=0;
#100 reset=1; #100 reset=0; #3000 reset=1; #100 reset=0; #10000 $stop; end
cnt10 test_cnt10(.rest(rest),.clk(clk),.q(q)); endmodule
十进制
Module cnt10(reset,clk,q); input reset,clk; output [3:0] q; reg [3:0] q;
always @ (posedge clk or posedge reset) begin if(reset) q=0; else if(q==9) q=0; else q=q+1; end
endmodule
60进制计数器
module cnt60(reset,load,d,cin,clk,q,cout); input reset,load,cin,clk; input [6:0] d; output cout; output [6:0]q;
reg [6:0]q;
always @ (posedge clk or posedge reset) begin if(reset) q=0; else if(load) q=d; else if(cin) begin if(q==9) q=7'h10; else if(q==7'h19) q=7'h20; else if(q==7'h29) q=7'h30; else if(q==7'h39) q=7'h40; else if(q==7'h49) q=7'h50; else if(q==7'h59) q=0; else q=q+1; end end
assign cout=((q==7'h59)?1:0)&cin; endmodule
//always模块和assgin是并行处理的