第二章(模块和测试平台概念)
- 行为描述语言(system or RTL or algorithm)的功能:并行或顺序、可控延时、可命名事件触发其他过程中的激活或停止、循环结构、可带参数且非零延续时间的task程序结构、函数function、算数,逻辑,位运算符。
程序基本概念 测试平台
利用上升沿和下降沿来实现奇数倍分频
module Clk_divided(
sys_clk,
clk_out
);
// parameter
parameter M = 5; parameter N = 3;
// IO declaration
input sys_clk; output clk_out;
// intern signal defination
reg div1; reg div2;
reg [N-1:0] cnt1; reg [N-1:0] cnt2;
// function defination
always@(posedge sys_clk)
begin
if(cnt1==M-1) begin
cnt1 <= 2'b0;end
else begin
cnt1 <= cnt1+2'b1;end
if(cnt1==2'b0) begin
div1<=1; end
if(cnt1==(M-1)/2) begin
div1<=0; end
end
always@(negedge sys_clk)
begin
if(cnt2==M-1) begin
cnt2 <= 2'b0; end
else begin
cnt2 <= cnt2+2'b1; end
if(cnt2==2'b0) begin
div2<=1;end
if(cnt2==(M-1)/2) begin
div2<=0;
end
end
assign clk_out = div1||div2; 50% clk_5
//assign clk_out = div1&&div2; 25% clk_5
Endmodule
module Clk_divided_tb(sys_clk,clk_out);
reg sys_clk ; wire clk_out;
clk_divided uut( .sys_clk(sys_clk),
.clk_out(clk_out)
);
initial begin
sys_clk = 0;
# 100;
end
always #100 sys_clk =~sys_clk;
- endmodule分上升沿和下降沿记奇数个数并分别翻转。例如上升沿计数5个后翻转div1,下降沿计数5个后翻转
div2,div1比div2提前半个时钟周期,最后将div1与div2按位或并赋值给clk_out即得到最5分频后的时钟。
时钟周期200ns,分频后为1us。占空比50%
时钟周期200ns,分频后为1us。占空比25%
思考:非整数倍分频实现思路1、在奇数倍分频的基础上进行2倍分频即可。
3、基本语法使用示例:一位全加器
A B C1(前一位进位) C2(加后进位) S(和)
0 0 0 0 0
0 1 0 0 1
0 0 1 0 1
0 1 1 1 0
1 0 0 0 1
1 1 0 1 0
1 0 1 1 0
1 1 1 1 1
由此得Verilog程序如下所示:
input A,B,C1,sys_clk,sys_rst;
output C2,S;
reg sum;
reg cout;
initial begin
sum = 2'b0;
cout = 2'b0;
end
assign C2 = A^~B^~C1; //同或的使用
assign S = (B&C1)+A&(B^~C1);
Endmodule
module full_adder_tb;
reg A;reg B;reg C1;
reg sys_clk;reg sys_rst;
wire C2;wire S;
full_adder uut (
.A(A), .B(B), .C1(C1), .C2(C2),
.S(S), .sys_clk(sys_clk),
.sys_rst(sys_rst)
);
initial begin
A = 0;B = 0;C1 = 0;sys_clk = 0; sys_rst = 0; #100;
end
always #100 sys_clk = ~sys_clk;
always begin
Fork //重复执行fork中的语句块
#100 begin A = 0; B = 1; C1 = 0; end
#200 begin A = 0; B = 1; C1 = 1; end
#300 begin A = 1; B = 0; C1 = 0; end
#400 begin A = 1; B = 1; C1 = 1; end
join
end
Endmodule
4、测试平台可在行为级(RTL仿真)和逻辑网表(逻辑网表仿真)和门级(门级仿真)结构中进行。其中门级结构加工艺技术再引入延迟模型称为布线后仿真,此时最接近实际电路。
5、initial只执行一次,而always总是在执行。
6、名词理解:synthesize 中(RTL原理图,语法查错,前综合后仿真(功能仿真))、implement中(translate将代码转换为具体的器件,map(器件布局可通过地域约束控制),布线(之后加入延迟信息))。
第三章
1.模块结构:模块端口定义,IO说明,内部信号说明,功能定义。
过程块都是并行执行(initial always)、连续赋值语句(assign)、实例引用语句。无关顺序
2.数据类型:(wire、reg、integer、parameter)最常用。Large medium scalered …16共16种
3.常量:数字,进制有关:注意负数写法:-30’d10、8’h4x(低四位不定)、8’b1100_0011(可读性)“AB”=16’B01000001_01000010 (字符串AB,值为16’h4142),长度默认是32位或64。
4.参数型:parameter average_delay=(r+f)/2 参数型在调用时具有很高的灵活性。定义延迟时间和位宽。
5.变量:网络类型的变量只能被驱动(门,连续赋值语句,assign)等,若无则为高组态。
6.Wire 常为单门驱动,而tri则是多驱动器是的网络数据。Wire或tri在逻辑强度不同时会产生不定值。Wire [N-1:0] a,b;
7.reg 常代表触发器,默认初始值为不定。Always中的每一个信号都必须为reg型。Reg[ N-1:0] a,b;可以正负值。当为操作数时其为无符号值,即当一个4为的寄存器值倍赋值为-1时,运算时将会被当作+15。
memory型即通过reg型建立数组建模,描述ram型存储器、rom储存器、reg文件。Reg[7:0] mema[255:0]; 256个八位储存器,寻址范围0到255。
对mema操作 必须指定位置。如mema[3]=0;
8.算术运算符(+,-, x,/,%)赋值运算(=,<=)关系运算符(<,>,<=,>=)逻辑运算符(&&,||,!)条件运算符(?:)位运算符(~,|,^,&,^~)移位运算符(<<,>>)拼接运算符({})%运算符最后去被除数符号:例如-10%3= -1;
Parameter在实例中的应用优势
module decode(a,f)
Parameter width=1;polarity=1;
...
endmodule
module top;
wire [3:0] a4;wire [4:0] a5;
wire[15:0] f16;wire[31:0] f32;
decode #(4,0) d1(a4,f16);
decode #(5) d1(a5,f32);
endmodule
d1得到了来自参数传递过来的值其此时的width和polarity分别为4,0而d2的为5和0。
不可综合条件:字符串$display,网络类型wire初始化,defparam,deassign,延时(#5),mos开关,双向传输开关,cmos门和电源上下拉,循环语句(forever,while)specify语句和自定义udp元件
一个模块中改变另一个模块中的参数值则需使用defparam命令。(不可综合)
‘include “top.v” ‘include “block.v”
‘include “annotate.v”
module test
Wire w; top t();
endmodule
module top;
wire w;block b1();block b2();
endmodule
module block;
Parameter p=0;
endmodule
module annotate;
defparam
test.t.b1.p=2; test.t.b2.p=3;
endmodule