interface笔记一,传统verilog的方式使用interface

1.首先写一个简单的加法器。

module counter_ud (clk,rstn,load,load_en,count);
	
	input clk;
	input rstn;     //复位端
	input load_en;  //使能端
	input  [3:0] load; 
	output [3:0] count;

	logic [3:0] load;
	logic[3:0] count;

	always @ (posedge clk or negedge rstn) begin
		
		if (!rstn)
			count <= 0;
		else begin
			if (load_en)
				count <= load;
			else
				count <= count + 1;
	    end
	end
endmodule

2.interface模块。

interface cnt_if (input clk);
	
	logic rstn;
	logic load_en;
	logic [3:0] load;
	logic [3:0] count;

endinterface

3.testbench模块。

module tb;

	logic clk;

	always #5 clk = ~clk;  //产生周期为10的clk

	cnt_if cnt_if0 (clk);  //实例化interface

    //将接口一一对应
	counter_ud u0 ( .clk      (cnt_if0.clk),
				    .rstn     (cnt_if0.rstn),
					.load_en  (cnt_if0.load_en),
					.load     (cnt_if0.load),
					.count    (cnt_if0.count));

	initial begin
	
        //监测数据的变化
		$monitor("[%0t] load_en = %0d;load = %0d; count = %0d",$time,cnt_if0.load_en,cnt_if0.load,cnt_if0.count);

        //初始化变量
		clk <= 0;
		cnt_if0.rstn <= 0;
		cnt_if0.load_en <= 1;
		cnt_if0.load <= 0;

        //5个周期之后开始仿真
		repeat (5) @(posedge clk);
		

            cnt_if0.rstn <= 1;
			#(10); cnt_if0.load_en <=1;cnt_if0.load<=6;
			#(10); cnt_if0.load_en <=1;cnt_if0.load<=8;
			#(10); cnt_if0.load_en <=1;cnt_if0.load<=10;
			#(10); cnt_if0.load_en <=0;cnt_if0.load<=10;
			#(10); cnt_if0.load_en <=0;cnt_if0.load<=10;

        //重复两个周期后结束
		repeat (2) @(posedge clk);
		$finish;
	end
endmodule

4.SimLog

当使能端load_en = 1时,count = load;

当使能端load_en = 0时,count = count +1;

因为非阻塞赋值,count的变化总是落后一个周期。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个基本的 APB 接口的 Verilog 代码: ```verilog module apb_interface ( input clk, input rst_n, input paddr, input psel, input penable, input pwrite, input [31:0] pwdata, output [31:0] prdata, output pready, output pslverr ); // Internal registers reg [31:0] mem [0:255]; reg [31:0] addr_reg; reg [31:0] rdata_reg; reg psel_reg; // APB Address decoder assign pready = (psel & ~psel_reg) ? 1'b1 : 1'b0; assign prdata = (psel & ~psel_reg) ? rdata_reg : 32'h0; assign pslverr = 1'b0; always @(posedge clk) begin if (!rst_n) begin addr_reg <= 0; end else begin if (psel && penable) begin if (pwrite) begin mem[paddr] <= pwdata; end else begin rdata_reg <= mem[paddr]; end addr_reg <= paddr; psel_reg <= 1; end else begin psel_reg <= 0; end end end endmodule ``` 该模块包含八个输入和输出信号: - `clk`:时钟信号。 - `rst_n`:重置信号。 - `paddr`:APB 总线地址。 - `psel`:APB 总线片选信号。 - `penable`:APB 总线使能信号。 - `pwrite`:APB 总线写使能信号。 - `pwdata`:APB 总线写数据。 - `prdata`:APB 总线读数据。 - `pready`:APB 总线读就绪信号。 - `pslverr`:APB 总线错误信号。 该模块将 APB 读写操作映射到一个内部存储器数组。它使用 `addr_reg` 寄存器来存储上一次的地址,并在下一次读写操作中使用。为了确保读取数据正确,该模块在下一个时钟周期中输出 `prdata` 和 `pready` 信号。如果有错误,`pslverr` 信号将置高。 注意,此代码仅用于演示目的,可能需要根据具体的应用进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值