如果对占空比没有明确的要求,则可以直接对上升沿计数:
计数到(N-1)/2 时让输出翻转
计数到(N-1)时让输出状态再次翻转
并将计数器清零,这样就可以得到一个占空比为2:3的N分频(N为奇数)的分频器。
如果要实现50%的占空比,可以通过“错位相或”的方法实现。
具体方法是用刚才的方法先通过对上升沿计数产生一个占空比为不是50%的N分频器,
再用同样的方法对下降沿计数产生一个占空比也不是50%的N分频器
最后将这两个分频器的输出进行“或”运算,就可以得到占空比为50%的奇数N分频器。
1.程序
所遇到的bug:
1)verilog与c不同,只有高与低两种表达方式,所以++等只能用多位数拼接。
2)如果一个值为多位,那么在测试文件中也需要多位。需要描述,不然虽然该数属于中间量,但仿真图中数据会看不懂,造成误解。
3)一个输出值不可以在测试文件中给它值,失去输出的意义,同时也给不了,因为类型不对。强行给值会报错。输出值可以在程序中初始化的时候给出,程序运行到下面语句块的时候,always并行重复,但不会初始化,所以不需要担心。
【】【】【】【】
程序如下:
module test(clk,gdp,ddp,out,add,n,m);
input clk;
output out,add,m,n,gdp,ddp;
reg [0:3]n=4'b1;
reg [0:3]m=4'b1;
reg gdp=1,ddp=0,out;
//高电平持续(add-1)/2 -1时钟
always @(posedge clk)
begin
if (n<4'd4)
begin
gdp<=1;
n<=n+1'b1;
end
else
begin
gdp<=0;
n<=n+1'b1;
if (n==4'd7)
n<=4'b1;
end
end
//低电平持续(add-1)/2 +1时钟
always @(negedge clk)
begin
if (m<4'd4)
begin
ddp<=1;
m<=m+1'b1;
end
else
begin
ddp<=0;
m<=m+1'b1;
if (m==4'd7)
m<=4'b1;
end
end
always @(posedge clk or negedge clk)
begin
out=gdp||ddp;
end
Endmodule
测试文件:
module testbench;
reg clk;
wire ddp;
wire gdp;
wire out;
wire add;
wire [3:0]m;
wire [3:0]n;
test test(
.clk(clk),
.out(out),
.gdp(gdp),
.ddp(ddp),
.add(add),
.m(m),
.n(n)
);
initial begin
clk =1;
#100;
end
always #20 clk =~clk;
Endmodule