集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 3955|回复: 6

Verilog语法(reg、wire、always语法)

[复制链接]
fpga_feixiang 发表于 2017-11-16 15:10:14 | 显示全部楼层 |阅读模式
/ex_module.v
module ex_module(
                input   wire                 sclk,
                input   wire             rst_n,
                input   wire  [7:0]  d,//声明模块的时候,输入一定是wire变量
                output  reg   [7:0]  q//声明模块的时候,输出可以是wire变量也可以是reg;reg变量必须在always块里面赋值
);//接口列表
//异步的D触发器
always @(posedge sclk or negedge rst_n)    //括号里面是敏感列表,可以包括电平触发或者沿触发
                                  //寄存器发生变化或翻转就是由CLK(让D触发器翻转)或CLR(复位端让寄存器清零)
        if(rst_n == 1'b0) //if后面的括号里是条件表,这里是组合逻辑。"=="声明一个比较器,"1"指的是1比特、"’"用来区分阿拉伯数字和进制,"b"代表的进制binary,“0”是一个比特的0
              q<=8'h00;            //10'b00000_00000  10'd10  10'hff,沿触发的逻辑里边一定都用<=非阻塞赋值。
        else
              q<=d;

////同步
//always @(posedge sclk)//同步的时候sclk在上升沿的时候,检测到低电平;异步的时候,当rst_n出现下降沿的时候,寄存器复位
//        if(rst_n == 1'b0)
//              q<=8'h00;
//        else
//              q<=d;

endmodule
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//ex_wire.v
module ex_wire(
    input  wire sel,
    input  wire a,
    input  wire b,
    output wire c
);//always 对reg赋值,assign语句(连续赋值)对wire赋值
//wire 变量一定用assign连续赋值语句赋值,而且必须是用阻塞赋值
assign c=(sel == 1'b1)?a:b;//(条件)?条件为1:条件为0
/*
            if(sel == 1'b1)
                c =a;
            else
              c =b;
*/
endmodule
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//ex_cnt.v
module ex_cnt(
        input wire sclk,//模拟晶振产生时钟震荡
        input wire rst_n,//模拟外部复位电平testbench
      output wire [9:0] cnt
);
reg [9:0] cnt_r;//定义一个寄存器变量"r"代表reg

always @ (posedge sclk or negedge rst_n)
            if(rst_n == 1'b0)
                    cnt_r <= 10'd0;//"'d0"直接返回32位的0,截取低10位给cnt_r,1023+1=1024
            else
                cnt_r <= cnt_r + 1'b1;//0---1023-0---1023
assign cnt =cnt_r;         
//仿真工具modelsim   
//链接:http://pan.baidu.com/s/1qW5IhhM 密码:n28z         
endmodule



//请参考verilog数据常量
//数字表达式:<位宽><进制><数字>
//'b:二进制    //eg.4'b1110  表示4位二进制数1110
//'h:十六进制 //eg  8'hef、4’ha等
//'d:十进制    //eg   2'd3、4‘d15(不能写16,4位宽最大15)等
//
//所以10’d0表示10位宽的数值0,0000000000
//加入10‘d15,则表示十进制15 ,0000001111

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//tb_ex_cnt.v

//声明延时单位,1ns指的是单位,100ps(0.1ns)指的是时标的精度。
//例如:#10.11--->10.10(最后的10ps精度被忽略)
`timescale 1ns/100ps   

module tb_ex_cnt;//这是完整的顶层,没有输入输出接口
            reg  tb_sclk,tb_rst_n;
            wire [9:0]  tb_cnt;

            initial//一上电只被执行一次,在initial这个块里面只能被寄存器变量赋值
            begin//在testbench里面begin、and是顺序执行的;在可综合模块里面begin、and就是一个括号
                    tb_sclk <=0;
                    tb_rst_n<=0;//它俩有先后顺序,先是tb_sclk被赋值然后再是tb_rst_n被赋值。但是之间的延迟是0。
                    #200.1
                    tb_rst_n<=1;
            end
always #10 tb_sclk <= ~tb_sclk;//例如初始状态是0,过了10ns变成1,又保持10ns变成0,周而复始的进行翻转。于是产生了时钟和复位信号

//例化的方法
//原始模块名字 例化的名字(可以自定义)
ex_cnt ex_cnt_inst(
        .sclk  (tb_sclk),//模拟晶振产生时钟震荡
        .rst_n (tb_rst_n),//模拟外部复位电平testbench;例化模块的时候如果原始模块是输入信号,那么括号内可以是wire变量也可以是reg变量
      .cnt   (tb_cnt) //例化模块的时候如果原始模块是输出信号,那么括号内必须是wire变量(正好和可综合模块相反)
);
endmodule

点评

海!外直播 t.cn/RxlBLRP 禁闻视频 t.cn/Rxl1r5o 如果没有防火墙,魏则西只需要在谷歌、维基百科搜索一下,就会知道什么是生物免疫疗法,至少他不会受骗而耽误治疗。从这点上说,GFW的确是杀人的同谋..  发表于 2017-12-13 20:48
zxopenlz 发表于 2017-12-9 09:27:41 | 显示全部楼层
Verilog语法(reg、wire、always语法)
zxopenhl 发表于 2017-12-10 09:50:59 | 显示全部楼层
基础语法介绍,谢谢楼主分享!
陈飞龙 发表于 2017-12-13 11:17:23 | 显示全部楼层
讲的很仔细很仔细,佩服!!!
辽工大小白 发表于 2017-12-24 22:08:11 | 显示全部楼层
reg wire always都是常用的,这些知识大家应该知道的
zhangyukun 发表于 2018-2-1 09:05:54 | 显示全部楼层
Verilog语法(reg、wire、always语法)
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2024-11-23 14:57 , Processed in 0.061611 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表