微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 掌握基本时序逻辑电路的实现 求助

掌握基本时序逻辑电路的实现 求助

时间:10-02 整理:3721RD 点击:
目的:掌握基本时序逻辑电路的实现     在verilog hdl中,相对于组合逻辑电路,时序逻辑电路也有规定的表述方式。在可综合的verilog hdl模型中,通常使用always块结构来表述时序逻辑。下面是一个1/2分频器的可综合模型。
//half_clk.v
//名称:1/2分频器
//功能:频率变为原来的一半
module half_clk(reset,clk_in,clk_out);
input clk_in,reset;
output clk_out;
reg clk_out;
always @(posedge clk_in)
begin
if(!reset) clk_out=0;
else clk_out=~clk_out;
end
endmodule

测试模块
//名称:半分频的测试模块
`timescale 1ns/100ps
`define clk_cycle 50
module clk_top;
reg clk,reset;
wire clk_out;
always # `clk_cycle clk=~clk;
initial
begin
clk=0;
reset=0;
#100 reset=0;
#100 reset=1;
#10000 $stop;
end
half_clk half_clk(.reset(reset),.clk_in(clk),.clk_out(clk_out));
endmodule
仿真结果图:


说明:
1、第一次仿真时候没有波形都是直线,后查明是因为单位时间和时间精度写的有误,将1ns/100ps, 写成了    1ns/1ps。因此波形出不来。
问:为什么1ns/1ps出不来波形呢,而1ns/100ps就可以正常出现波形呢?

请小编自己把自己的代码里的1ns/100ps,改回1ns/1ps确认一下是否确实不能出波形。

module half_clk 里面always语句应用非阻塞赋值。

   这里没区别吧

`timescale 1ns/100ps
module half_clk_test;
reg clk_in,reset;
wire clk_out;
parameter clk_cycle=50;
half_clk half_clk(reset,clk_in,clk_out);
always #clk_cycle clk_in=~clk_in;
initial
begin
clk_in=0;
reset=0;
#200 reset=1;
#1000 $finish;
end
endmodule
我把test的程序改成这个,是可以的,lz试试

   试了一下,上面的程序把100ps改成1ps也是可以的;具体为什么我也不知道,我用自己比较习惯的写法改的,但lz哪里有问题我也说不来



    我只是说用always综合时序逻辑最好用非阻塞,可能这里是没有区别的。在设计module的时候,最好能有延迟语句(#2....),方便功能仿真。



    刚才测试了一下小编代码,不论是1ns/1ps 还是1ns/100ps都可以正常显示波形。我用的是modelsim 6.0 SE版本。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top