2011年9月29日8:30:26
1、assign一般多用于组合逻辑,其后变量必须为wire类型;对于输入和输出变量,如不声明其类型,默认为wire类型。
2、always多用于时序逻辑。
2011年9月30日
3、modelsim仿真问题解决,见文档ModelSim相关。
网络真的很强大,modelsim问题都已解决,现在自己的问题及网上找的解决方法整理上传。
4、testbench是一种验证的手段。首先,任何设计都是会有输入输出的。但是在软环境中没有激励输入,也不会对你设计的输出正确性进行评估。那么此时便有一种,模拟实际环境的输入激励和输出校验的一种“虚拟平台”的产生。在这个平台上你可以对你的设计从软件层面上进行分析和校验,这个就是testbench的含义。
5、Testbench三步走:
a、对被测试设计的顶层接口进行例化;
b、给被测试设计的输入接口添加激励;
c、判断被测试设计的输出响应是否满足设计要求。
6、最简单的Testbench应包含:时钟激励、复位激励及其它激励。
7、最简单的Testbench例子(时钟的产生)
// 定义时钟周期为20ns,已定义“`timescal 1ns/1ps”
parameter PERIOD 20;
initial
begin
clk = 0;
forever
#(PERIOD/2) clk = ~clk;
end
同例子的不同实现方法(用always来实现)
parameter PERIOD 20;
always begin
#(PERIOD/2) clk = 0;
#(PERIOD/2) clk = 1;
end
8、最简单的Testbench例子(复位信号的产生)
// 已经定义`timescale 1ns/1ps
initial
begin
rst_n = 0;
#100; //延时100ns
rst_n = 1; //撤销复位
......
end
9、以任务的形式给出复位激励
initial
begin
reset_task(100); // 复位100ns,已经定义 `timescale 1ns/1ps
........
end
task reset_task;
input[15:0] reset_time; //定义复位时间
begin
rst_n = 0;
#reset_time; // 延时reset_time 时间
rst_n = 1;
........
end
end task
2011年10月2日9:04:01
1、深入学习按键操作:
2、解决一个警告,有时感觉学习好无头绪,其实像这样去解决一个个的警告也不为一种好的学习方法。
警告:Found pins functioning as undefined clocks
解决方法,见附件
3、自己通过学习对 如何检测按键按下动作 的理解
定义寄存器(A,用到几个按键可对应定义几位),在每个时钟周期不断更新存放对应按键的状态值;在将该状态延时一个周期存放到另外一个定义的寄存器(B)中,然后进行以下操作:C = B & (~A);而得到的C状态可维持一个周期,在这个周期内可对其进行检测来判断是否有键按下。对以上所述用如下实例来加以说明:
A: 1 1 1 1 0 0 0 0
~A: 0 0 0 0 1 1 1 1
B: 1 1 1 1 0 0 0 0
C: 0 0 0 1 0 0 0
从上可以看出:当A状态翻转时(只能从1到0),可通过C的值判断出来:一个下降沿的到来
?问题:只要有状态的变化,都能检测出来,即既能检测下降沿又能检测下降沿。(自己正在尝试中)
程序实例:
//------------------------------------------------------------- //说明:实现按键按下(只实现下降边沿)功能检测 //------------------------------------------------------------- reg[3:0] sw_reg1; //存放键值状态
always @ (posedge clk or negedge rst_n) if (!rst_n) //异步复位 sw_reg1 <= 4'b1111; else // 每一个时钟上升沿到来时,读取按键的值,并存入到定义的寄存器中 sw_reg1 <= {sw1_n, sw2_n, sw3_n, sw4_n};
//延时一个时钟周期,存放键值状态 reg[3:0] sw_reg2;
always @ (posedge clk or negedge rst_n) if (!rst_n) sw_reg2 <= 4'b1111; else sw_reg2 <= sw_reg1;
//当寄存器sw_reg1由1变为0时,sw_reg的值变为高,维持一个时钟周期 wire[3:0] sw_reg = sw_reg2 & (~sw_reg1);
4、自学几个基础知识
a、变量分为两种:网络型(nets type)和寄存器型(register type);
b、nets型指输出始终根据输入的变化而更新其值的变量,它一般指的是硬件电路中的各种物理连接;最常用的wire(连线类型),常用来表示以assign语句赋值的组合逻辑信号。Verilog HDL模块中的输入/输出信号类型缺省时,默认为wire类型。
[ 本帖最后由 xiaomiking 于 2011-10-2 14:15 编辑 ]
|