可综合文件放到design文件夹下,testbench文件放到sim文件夹下(文件夹名可自定义)
- //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
- //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
- //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 [url=home.php?mod=space&uid=72445]@[/url] (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
例化时,变量的赋值应该遵循下图(按照自己理解画的,不一定正确,欢迎指正):
Design中的模块输出的时候可以作为寄存器,它相当于把输出寄存器的Q端直接连接到输出口了,就把中间那根线给省略了;
Testbench中输出变量必须是wire类型,因为芯片画PCB时,输出的管脚都用线连。
|