小例子及testbench介绍描述一个异步D触发器模块:
文件ex_module.v 定义可综合模块
[plain] view plain copy
- module ex_module( //模块名字和文件名字要一样 紧接着接口列表
- input wire sclk, //时钟命名 sclk
- input wire rst_n, // reset_n 复位时低复位
- input wire [7:0] d, //模块声明的时候,输入必须是wire变量
- output reg [7:0] q //reg变量必须在always块里面来赋值,模块声明的时候,输出可以是wire变量也可以是reg
- );
- //异步D触发器
- always @(posedge sclk or negedge rst_n) //敏感列表 可以包括电平触发或者沿触发
- if (rst_n == 1'b0) //条件表,这里是组合逻辑 还有其他表达方式 2'b01 8'b0000_1111 8'd10 8'h0f
- q<=8'h00;
- else
- q<=d;
- //alway块中只能给reg类型变量赋值,wire会报错,如果是wire型变量 可以用assign 语句赋值
- endmodule
可综合模块写完后,需要用仿真测试去验证设计的正确性。可以编写testbench模块,在结合modelsim仿真就可以看到前仿真的结果。
文件tb_ex_module.v 定义激励模块
[plain] view plain copy
- `timescale 1ns/100ps //单位时标声明 精度到100ps 小数点前是ns 例 10.1 就是10ns + 100ps 而10.11就达不到精度了
- module tb_ex_module; //激励模块声明时不需要端口列表
- reg [7:0] d_r;
- reg sclk_r, rst_n_r;//激励信号的声明
- wire [7:0] q; //原始模块输出信号连接线
- initial //上电初始化过程 上电只只执行一次
- begin //顺序执行 initial块内只能对寄存器变量赋值
- d_r <= 0;
- sclk_r <= 0;
- rst_n_r <= 0;
- #20
- rst_n_r <= 1;
- end
- initial
- begin
- #20
- send_d();
- end
- always #10 sclk_r <= ~sclk_r; //产生时钟,循环震荡周期 一个周期用时20ns
- //例化的方法
- //原始的名字 例化的名字(激励信号名字 可以自定义)
- ex_module ex_module_inst(
- .sclk (sclk_r), //.后面是原模块的 ()里面是连接的当前模块的 这样通道就打开了
- .rst_n (rst_n_r),
- .d (d_r),
- .q (q) //如果是输出变量 ()中必须是wire变量
- );
- task send_d();
- integer i;
- begin
- for (i = 0; i < 255; i = i + 1)
- begin
- @(posedge sclk_r)//卡一个时钟拍子
- d_r <= d_r + 1;
- end
- end
- endtask
- endmodule
modelsim仿真结果
testbench编写可以归纳为:
1)对被测试设计的顶层接口进行例化。
2)给被测试设计的输入接口添加激励。
3)判断被测试设计的输出响应是否满足设计要求。
有限状态机FSM 硬件设计多是并行实现的,但对于实际的工程应用,往往需要让硬件来实现一些具有一定顺序的工作,这样就用到了状态机的思想。简单的说状态机就是通过不同的状态迁移来完成一些特定的顺序逻辑。 |