国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【FPGA/verilog -入門學(xué)習(xí)4】verilog 實(shí)現(xiàn)多路脈沖計(jì)數(shù)

這篇具有很好參考價(jià)值的文章主要介紹了【FPGA/verilog -入門學(xué)習(xí)4】verilog 實(shí)現(xiàn)多路脈沖計(jì)數(shù)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

需求:

設(shè)計(jì)一個(gè)脈沖計(jì)數(shù)器,其功能如下

輸入脈沖:4路脈沖信號,分別對每路進(jìn)行脈沖檢測并計(jì)數(shù)

使能信號:高電平進(jìn)行計(jì)數(shù),低電平清零計(jì)數(shù)器

計(jì)數(shù)器:在使能信號高電平期間,對脈沖信號的上升沿進(jìn)行檢測并遞增計(jì)數(shù)值

編寫測試腳本,進(jìn)行仿真驗(yàn)證

需求分析:

使用上一章的一路脈沖檢測,使用例化方式產(chǎn)生多路

vlg_design

使用上章節(jié)生成的最小系統(tǒng)

/
/*
脈沖計(jì)數(shù),當(dāng)是能時(shí),對pluse脈沖計(jì)數(shù)
實(shí)現(xiàn)步驟
1)產(chǎn)生pluse 上升沿脈沖 一個(gè)clk時(shí)鐘
2)產(chǎn)生i_en 下降沿,當(dāng)下降沿 o_state=1
3)對pluse上升沿計(jì)數(shù),鎖存在r_cnt
4)當(dāng)o_state=1 時(shí),o_cnt<=r_cnt
 
 */
/
`timescale 1ns/1ps
module vlg_design(
    input clk,//100M
    input pulse,// 
    input reset_n,
    input  i_en,  
    output reg[31:0] o_cnt,  //輸出計(jì)數(shù)值
    output  o_state
    );
    

reg [1:0] r_pluse;
reg [1:0] r_en;
wire w_pluse_pos;
wire w_en_neg;
reg[31:0] r_cnt;

//產(chǎn)生一個(gè)pluse 上升沿脈沖時(shí)鐘
 always @(posedge clk) begin
    if(!reset_n) r_pluse <='b00;
    else  r_pluse <= {r_pluse[0],pulse};
 end 
assign w_pluse_pos = r_pluse[0] & ~r_pluse[1];


//產(chǎn)生一個(gè)i_en 下降沿脈沖時(shí)鐘
//en 下降沿時(shí) o_state =1
 always @(posedge clk) begin
    if(!reset_n) r_en <='b00;
    else  r_en <= {r_en[0],i_en};
 end 
assign o_state = r_en[1] & ~r_en[0];

 


//EN = 1時(shí)候計(jì)數(shù)
 always @(posedge clk) begin
    if(!reset_n) r_cnt <= 'b0;
    else if(i_en)
            if(w_pluse_pos)r_cnt <= r_cnt + 1'b1;
            else ; 
         else  r_cnt <= 'b0;
end



//輸出o_cnt
always @(posedge clk) begin
    if(!reset_n) o_cnt  <= 'b0;
    else if(!i_en && r_cnt)  begin
        o_cnt <= r_cnt;
        $display("r_cnt=%d\n",r_cnt);//顯示
        end
    else o_cnt  <= 'b0;
end
 

endmodule

vlg_cnt4

創(chuàng)建需求功能模塊

1,端口定義

input[3:0]pulse //多個(gè)輸入,數(shù)據(jù)是并行的,定義方式

output [31:0]o_cnt_0, //數(shù)據(jù)也是并行的,用o_cnt_0~o_cnt_3

output [31:0]o_cnt_1,

output [31:0]o_cnt_2,

output [31:0]o_cnt_3,

output [3:0]o_state //輸出狀態(tài)

2,例化最小模塊


/
`timescale 1ns/1ps
module vlg_cnt4(
    input clk,//100M
    input [3:0]pulse,// 
    input reset_n,
    input  i_en,  

    output [31:0]o_cnt_0,
    output [31:0]o_cnt_1,
    output [31:0]o_cnt_2,
    output [31:0]o_cnt_3,  //輸出計(jì)數(shù)值
    output  [3:0]o_state    
    );
    

vlg_design uut0_vlg_design(

.clk(clk),
.pulse(pulse[0]),
.reset_n(reset_n),
.i_en(i_en),
.o_cnt(o_cnt_0),
.o_state(o_state[0])
);

vlg_design uut1_vlg_design(

.clk(clk),
.pulse(pulse[1]),
.reset_n(reset_n),
.i_en(i_en),
.o_cnt(o_cnt_1),
.o_state(o_state[1])
);

vlg_design uut2_vlg_design(

.clk(clk),
.pulse(pulse[2]),
.reset_n(reset_n),
.i_en(i_en),
.o_cnt(o_cnt_2),
.o_state(o_state[2])
);

vlg_design uut3_vlg_design(

.clk(clk),
.pulse(pulse[3]),
.reset_n(reset_n),
.i_en(i_en),
.o_cnt(o_cnt_3),
.o_state(o_state[3])
);



endmodule

testbench_top

//仿真文件

//隨機(jī)數(shù)產(chǎn)生

rand = $random%100;不帶{} 產(chǎn)生的是有符號的數(shù)字,范圍是-99~99

rand = {$random}%100;使用帶{} 表示產(chǎn)生的是正數(shù),%后面的數(shù)表示數(shù)據(jù)的范圍0~99

rand = 30 +{$random}%100 ;范圍 30~129文章來源地址http://www.zghlxwxcb.cn/news/detail-757225.html


`timescale 1ns/1ps
module testbench_top();
    

//參數(shù)定義

`define CLK_PERIORD        10        //時(shí)鐘周期設(shè)置為10ns(100MHz)    


//接口申明
    
reg clk;
reg [3:0]pulse;
reg reset_n;
reg i_en;
wire[31:0] o_cnt_0;
wire[31:0] o_cnt_1;
wire[31:0] o_cnt_2;
wire[31:0] o_cnt_3;
wire [3:0]o_state;

 
    
vlg_cnt4        uut_vlg_cnt4(
    .clk(clk),
    .pulse(pulse),
    .reset_n(reset_n),
    .i_en(i_en),
    .o_cnt_0(o_cnt_0),
    .o_cnt_1(o_cnt_1),
    .o_cnt_2(o_cnt_2),
    .o_cnt_3(o_cnt_3),    
    .o_state(o_state)
    );    
    
//時(shí)鐘和復(fù)位初始化、復(fù)位產(chǎn)生 
initial begin
clk <= 0;
reset_n <= 0;
#10;
reset_n <= 1;
clk <= 1;
pulse <= 4'b0000; 
i_en <= 0;
end

//時(shí)鐘產(chǎn)生
always #(`CLK_PERIORD/2) clk = ~clk;    
integer i;
    
 
//測試激勵產(chǎn)生
initial begin

    @(posedge reset_n);    //等待復(fù)位完成
    @(posedge clk);


 //生成一個(gè)4位的0~15的隨機(jī)數(shù),賦值給pluse
i_en <= 1;
@(posedge clk);

for(i = 0;i < 10;i = i+1) begin
    pulse  <=  {$random} % 15;
    repeat(3)@(posedge clk);
end
pulse <= 4'b0000; 
i_en <= 0;

#2_000_000;
 //生成一個(gè)4位的0~15的隨機(jī)數(shù),賦值給pluse
i_en <= 1;
@(posedge clk);

for(i = 0;i < 5;i = i+1) begin
    pulse  <=  {$random} % 15;
    repeat(3)@(posedge clk);
end
pulse <= 4'b0000; 
i_en <= 0;



@(posedge clk);
#2_000_000;
$stop;
end

endmodule

仿真結(jié)果

到了這里,關(guān)于【FPGA/verilog -入門學(xué)習(xí)4】verilog 實(shí)現(xiàn)多路脈沖計(jì)數(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包