一、实验目的
- 掌握条件语句在简单时序模块设计中的使用;
- 学习在Verilog模块中应用计数器;
- 学习测试模块的编写、综合和不同层次的仿真。
二、实验原理
与常用的高级程序语言一样,为了描述较为复杂的时序关系,Verilog HDL提供了条件语句供分支判断时使用。在可综合风格的Verilg HDL模型中,常用的条件语句有 if…else 和 case…endcase 两种结构,用法和C程序语言中类似。两者相比 if…else 用于不很复杂的分支关系,实际编写可综合风格的模块,特别是用状态机构成的模块时,更常用的是case…endcase风格的代码。这一节给的是有关 if…else 的范例,有关case…endcase结构的代码以后会经常用到。
在Verilog HDL中,相对于组合逻辑电路,可综合成具体电路结构的时序逻辑电路也有标准的表述方式。在可综合的Verilog HDL模型,通常使用always块和@ (posedge clk)或@ (negedge clk)的结构来表述时序逻辑。
下面给出的范例也是一个可综合风格的分频器,可将10MHz的时钟分频为500kHz的时钟,基本原理与1/2分频器是一样的,但是需要定义一个计数器,以便准确获得1/20分频。
模块源代码:
//-------------- fdivision.v --------------
module fdivision(RESET,F10M,F500K);
input F10M,RESET;
output F500K;
reg F500K;
reg [7:0] j;
always @(posedge F10M)
if(!RESET)
begin
F500K<=0;
j<=0;
end
else
begin
if(j==19)
begin
j<=j+1;
F500K<=~F500K;
end
else
j<=j+1;
end
endmodule
测试模块源代码:
//-------------- fdivision_Top.v --------------
`timescale 1ns/100ps
`define clk_cycle 50
`include "./fdivision.v"
module fdivision_Top;
reg RESET,F10M_clk;
wire F500K_clk;
always #`clk_cycle F10M_clk=~F10M_clk;
initial
begin
RESET=1;
F10M_clk=0;
#100 RESET=0;
#100 RESET=1;
#10000 $stop;
end
fdivision fd(.RESET(RESET),.F10M(F10M_clk),.F500K(F500K_clk));
endmodule
计数分频器的仿真波形如下图所示:
三、实验要求及实验内容
(1)实验内容:
利用10MHz的时钟,设计一个单周期形状的周期波形。
(2)实验代码:
模块源代码:
//-------------- fdivision.v --------------
module fdivision(RESET,F10M,F500K);
input F10M,RESET;
output F500K;
reg F500K;
reg [7:0] j;
always @(posedge F10M)
if(!RESET)
begin
F500K<=0;
j<=0;
end
else
begin
if(j==19)
begin
j<=j+1;
F500K<=~F500K;
end
else if(j==29)
begin
j<=j+1;
F500K<=~F500K;
end
else if(j==49)
begin
j<=0;
F500K<=0;
end
else
j<=j+1;
end
endmodule
测试模块源代码:
//-------------- fdivision_Top.v --------------
`timescale 1ns/100ps
`define clk_cycle 50
`include "./fdivision.v"
module fdivision_Top;
reg RESET,F10M_clk;
wire F500K_clk;
always #`clk_cycle F10M_clk=~F10M_clk;
initial
begin
RESET=1;
F10M_clk=0;
#100 RESET=0;
#100 RESET=1;
#10000 $stop;
end
fdivision fd(.RESET(RESET),.F10M(F10M_clk),.F500K(F500K_clk));
endmodule
四、实验结果
(1)目标波形
(2)实验波形