系列文章目录
寄存器表单,寄存器设计代码,寄存器ral文件
概述
在SOC系统中,每个子系统或模块往往包含一组控制端口,通过控制端口可以配置模块中的寄存器,模块功能可以依据寄存器的值改变,这组控制端口就是寄存器配置总线,常见的寄存器配置总线有APB/AHB/OCP总线等等。一个简单的模块代码如下:
module dut(
input clk,
input rst_n,
input bus_cmd_valid,
input bus_op,
input [31:0] bus_addr,
input [31:0] bus_wr_data,
output reg [31:0] bus_rd_data,
input [7:0] rxd,
input rx_dv,
output reg [7:0] txd,
output reg tx_en
);
reg invert;
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
txd <= 8'b0;
tx_en <= 1'b0;
end
else if(invert) begin
txd <= ~rxd;
tx_en <= rx_dv;
end
else begin
txd <= rxd;
tx_en <= rx_dv;
end
end
always @(posedge clk or negedge rst_n) begin
if(!rst_n)
invert <= 1'b0;
else if(bus_cmd_valid && bus_op) begin
case(bus_addr)
32'h8: invert <= bus_wr_data[0];
default: ;
endcase
end
end
always @(posedge clk or negedge rst_n) begin
if(!rst_n)
bus_rd_data <= 32'b0;
else if(bus_cmd_valid && !bus_op) begin
case(bus_addr)
32'h8: bus_rd_data <= {31'b0, invert};
default: bus_rd_data <= 32'b0;
endcase
end
end
endmodule
上述代码中,第4-8行为寄存器配置总线。
第32-44行,通过寄存器配置总线写寄存器的值,模块中只有一个变量叫inve