利用条件语句实现不同占空比的分频时钟电路
2015-04-21 23:01
148 查看
1,要实现的是如下的一个“产生占空比不同的分频时钟”:
(1)、建模:
module fdivision_module(clock,d_clock,reset,j);
input clock,reset;
output d_clock,j;
reg d_clock;
reg [2:0]j;
always @(posedge clock)
begin
if(!reset)
//初始化过程
begin
d_clock<=0;
j<=0;
end
else
begin
if(j==4)
j<=0;
else if(j==1)
begin
d_clock=1;
j<=j+1;
end
else
begin
d_clock=0;
j<=j+1;
end
end
end
endmodule
(2)testbench:
`include "fdivision_module.v"
module fdivision_stimulus;
reg clock,reset;
wire d_clock;
wire [2:0]j;
fdivision_module fd(clock,d_clock,reset,j);
initial
begin
clock=0;
forever #5 clock=~clock;
end
initial
begin
reset=0;
#20 reset=1;
#100 reset=1;
#5 reset=1;
end
(3)、正确仿真波形:
2、出现的问题及解决办法:
(1)、第一次的仿真结果如下:由图可见,在reset置0的时候,d_clock并没有置0,没有初始化;
(2)、为了调试程序,我将局部变量j也作为输出变量,得到下面的仿真结果:局部起到计数的变量一直为未知量x。
(3)、改动程序,将reset也放入always的敏感列表中,写成always @(posedge clock,negedge reset),得到下面的结果:很显然,尽管仿真出结果,但是占空比错误,这个错归根结底还是在于计数器的设定,开始我写成(j==5)时,j<=0;(j==2)时,d_clock=1;特别很明显0~5总共经历了6个时钟。所以,建模过程中,要特别注意计数器j的设定。
(4),现在回过头来想想最开始的建模有什么错误,在2.3中,将reset置于敏感列表中,写成always @(posedge clock,negedge reset),这相当于异步置0 ,reset的置0信号是不受时钟控制的,只要reset=0,就能将d_clock和j置0。但是在最开始错误的2.1中,敏感列表为always @(posedge clock),再在后面过程块中写,reset=0时,j=0,d_clock=0;那么这时的reset置0为同步置0,只有当上升沿出现时,才生效,给j和d_clock赋值。但是,我在testbench模块中,给reset的赋值如下图:很显然,在0~5ns时,reset=0,#5ns之后reset=1,则当#10ns,上升沿到来时,reset已经为1,不能再给j和d_clock赋值了,所以造成了2.1的错误。特别值得注意的是,在异步置0时,reset=0的保持时间可以任意,但同步置0时,reset=0的保持时间需要大于一个时钟,否则就会出现上面上升沿还没到来,reset就为1,不能赋值的错误。
(1)、建模:
module fdivision_module(clock,d_clock,reset,j);
input clock,reset;
output d_clock,j;
reg d_clock;
reg [2:0]j;
always @(posedge clock)
begin
if(!reset)
//初始化过程
begin
d_clock<=0;
j<=0;
end
else
begin
if(j==4)
j<=0;
else if(j==1)
begin
d_clock=1;
j<=j+1;
end
else
begin
d_clock=0;
j<=j+1;
end
end
end
endmodule
(2)testbench:
`include "fdivision_module.v"
module fdivision_stimulus;
reg clock,reset;
wire d_clock;
wire [2:0]j;
fdivision_module fd(clock,d_clock,reset,j);
initial
begin
clock=0;
forever #5 clock=~clock;
end
initial
begin
reset=0;
#20 reset=1;
#100 reset=1;
#5 reset=1;
end
(3)、正确仿真波形:
2、出现的问题及解决办法:
(1)、第一次的仿真结果如下:由图可见,在reset置0的时候,d_clock并没有置0,没有初始化;
(2)、为了调试程序,我将局部变量j也作为输出变量,得到下面的仿真结果:局部起到计数的变量一直为未知量x。
(3)、改动程序,将reset也放入always的敏感列表中,写成always @(posedge clock,negedge reset),得到下面的结果:很显然,尽管仿真出结果,但是占空比错误,这个错归根结底还是在于计数器的设定,开始我写成(j==5)时,j<=0;(j==2)时,d_clock=1;特别很明显0~5总共经历了6个时钟。所以,建模过程中,要特别注意计数器j的设定。
(4),现在回过头来想想最开始的建模有什么错误,在2.3中,将reset置于敏感列表中,写成always @(posedge clock,negedge reset),这相当于异步置0 ,reset的置0信号是不受时钟控制的,只要reset=0,就能将d_clock和j置0。但是在最开始错误的2.1中,敏感列表为always @(posedge clock),再在后面过程块中写,reset=0时,j=0,d_clock=0;那么这时的reset置0为同步置0,只有当上升沿出现时,才生效,给j和d_clock赋值。但是,我在testbench模块中,给reset的赋值如下图:很显然,在0~5ns时,reset=0,#5ns之后reset=1,则当#10ns,上升沿到来时,reset已经为1,不能再给j和d_clock赋值了,所以造成了2.1的错误。特别值得注意的是,在异步置0时,reset=0的保持时间可以任意,但同步置0时,reset=0的保持时间需要大于一个时钟,否则就会出现上面上升沿还没到来,reset就为1,不能赋值的错误。
相关文章推荐
- sql利用在一条语句中count出不同的条件的值
- MySQL 如何利用一条语句实现类似于if-else条件语句的判断
- 利用decode函数实现按不同的选择条件 对数据进行分组统计
- 在使用ibatis实现多条件模糊查询的语句
- 利用hibernate实现多条件组合查询的两种方式(2017年5月18日22:45:09)
- 利用T-SQL语句,实现数据库的备份与还原的功能
- 利用包来实现视图内容的不同展现
- (精)如何利用T_SQL实现数据库备份与还原处理之一--(如何利用sql语句,得到数据库文件目录)
- html页通过条件注释语句来加载不同的js或css
- 利用Forms实现两种不同验证系统
- 以下是C++的不同数据类型值的比较语句,请问这些判断语句中作为条件部分的语句编写有问题的有:
- 在同一个sql语句中,统计不同条件的Count数量
- Sql语句实现不同记录同一属性列的差值计算
- 利用管道命名锁,实现进程间名称的不同
- ModelDriven利用泛型实现多个Action得到不同的getModel类
- 编写一个计算某个月份的天数程序,请用if-else条件语句实现。要求根据用户输入的月份,判断出月份所包含的天数。
- 利用自定义事件实现不同窗体间的通讯 -- Delphi篇
- C语言利用switch语句实现输入一个字母,输出它前后紧挨着的字母
- 2、SQL Server:SQL利用Case When Then多条件判断SQL 语句
- 利用硬件描述语言实现交通灯控制模型5,分频