CHAN 发表于 2010-6-27 23:20:24

频率计的verilog的程序

//测频率控制器
module testctl(clkk,cnt_en,rst_cnt,load);
inputclkk;
outputcnt_en,rst_cnt,load;
reg rst_cnt;
reg div2clk;

always @(posedge clkk)
begin
   div2clk=~div2clk;
end
always @(clkk or div2clk)
begin
   if((clkk=='b0)&(div2clk=='b0))
   rst_cnt='b1;
   else tst_cnt='b0;
end
assign load=~div2clk;
assign cnt_en=div2clk;
endmodule
//10进制计数器
module cnt10(clk,rst,ena,outy,cout);
input   clk,rst,ena;
output outy;
outputcout;
regouty;

always @(posedge clk)
begin
   if(rst) outy='b0000;
    else if(ena)
   begin
   if(outy<'b1001) outy=outy+1;
   elseouty='b0000;
    end
end
assign cout=outy&outy;
endmodule
//4位锁存器
module reg4b(load,din,dout);
inputdin;
input   load;
output dout;
regdout;

always @(posedge load)
   begin
    dout=din;
   end
endmodule
//顶层源程序
module plj4(f1hz,fin,doutt,coutt);
input   f1hz,fin;
outputdoutt;
output   coutt;
regdoutt;
wire   cnt_ent,rst_cntt,loadt;
wire   couty1,couty2,couty3,couty4;
wire      cout1,cout2,cout3;
testctl   u1(f1hz,cnt_ent,rst_cntt,loadt);
cnt10    u2(fin,rst_cntt,cnt_ent,outy1,cout1);
cnt10    u3(cout1,rst_cntt,cnt_ent,outy2,cout2);
cnt10    u4(cout2,rst_cntt,cnt_ent,outy3,cout3);
cnt10    u5(cout3,rst_cntt,cnt_ent,outy4,coutt);
reg4b    u6(loadt,outy1,doutt);
reg4b    u6(loadt,outy1,doutt);
reg4b    u6(loadt,outy1,doutt);
reg4b    u6(loadt,outy1,doutt);
endmodule
测频率控制器那段不怎么看得懂呢 大家帮帮忙啊 谢谢 
能再给我个程序就更好了

HANG 发表于 2010-6-28 00:55:53

我只有vhdl的,最后那段是调用前面的模块,举个例子,就拿testctl来说吧,<br>
testctl&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; u1(f1hz,cnt_ent,rst_cntt,loadt);<br>
module testctl(clkk,cnt_en,rst_cnt,load);<br>
f1hz与clkk对应,<br>
cnt_ent 与cnt_en对应<br>
rst_cntt 与rst_cnt对应<br>
loadt 与load对应

UFP 发表于 2010-6-28 02:07:26

testctl中的div2clk是对clkk二分频。<br>
load是一个相对div2clk相移180度的时钟,信号在load为0的半周期内计数,同时cnt_ent在此周期内使能,对应cnt10中的ena,使得计数进行。当load跳变的上边沿,将数传给寄存器输出。至于rst_cnt,是为了在load跳变为低时清零,开始计数。<br>
计数有1的误差。

ATA 发表于 2010-6-28 02:10:19

晕,又学到东西了

ngtim 发表于 2010-6-28 03:57:38

我真佩服高手们,同时也感谢他们
页: [1]
查看完整版本: 频率计的verilog的程序