Veriog_Notes_Chapter 2

第二章(模块和测试平台概念)

  1. 行为描述语言(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;
  1. 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值