赞
踩
在学习fpga的第一个电路。
module adder ( input rst_n, input clk, output [3:0] ad_o output [6:0]ad_o1, output [6:0]ad_o2, output [6:0]ad_o3, ); reg [6:0] adder; reg [6:0] adder1; reg [6:0] adder2; always@(posedge clk) begin if(~rst_n) adder<=0; else if(adder==7'd100) adder<=0; else adder<=adder+1'b1; end always@(posedge clk or negedge rst_n) begin if(~rst_n) adder1<=0; else if(adder==7'd100) adder1<=0; else adder1<=adder1+1'b1; end always@(*) begin if(~rst_n) adder2=0; else if(adder2==7'd100) adder2=0; else adder2=adder1+1'b1; end wire [6:0]adder3; assign adder3=adder1+1'b1; //output assign ad_o = adder; assign ad_o1 = adder1; assign ad_o2 = adder2; assign ad_o3 = adder3; endmodule 激励程序 `timescale 1ns/1ps module adder_tp(); reg clk; reg rst_n; initial begin rst_n=0; #100 rst_n=1; #2003 rst_n=0; #4003 rst_n=1; #2000 $stop ; end initial begin clk=0; end parameter PER=5; always #PER clk<=~clk; adder adder_inst ( .rst_n (rst_n), .clk(clk), .ad_o() .ad_o1(), .ad_o2(), .ad_o3(), ); endmodule
adder:时序电路,受敏感列表中的时钟控制,在时钟上升沿开始,是非阻塞赋值**(<=)。
adder1:时序电路,受敏感列表中的时钟和复位控制,在时钟的上升沿或者复位的下降沿时开始,是非阻塞赋值(<=)。
adder2:组合电路,它受任和进来的信号控制。这种写法容易写成锁存器。列如:always@(*)
begin
if()
else if()
end
*这里没有else,它的一些信号进来,有一些符合if与else if的条件,但有一些不符合,就会停在always块,出不去。*阻塞赋值(=)
adder3:典型的组合电路。wire线性定义,它表示线性关系。直接赋值,且不会延迟一拍。阻塞赋值(=**)
激励程序:有部分固定写法,在给时钟与复位定义。然后将顶层模块实列化。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。