宜昌市水利建设工程协会网站,工信部网站备案怎么查询,哪个网站做海报好,下海做公关的网站题目描述当A、B两组的信号请求访问某个模块时#xff0c;为了保证正确的访问#xff0c;需要对这些信号进行仲裁。请用Verilog实现一个仲裁器#xff0c;对两组请求信号进行仲后#xff0c;要求#xff1a;协议如图所示#xff0c;请求方发送req#xff08;request…题目描述当A、B两组的信号请求访问某个模块时为了保证正确的访问需要对这些信号进行仲裁。请用Verilog实现一个仲裁器对两组请求信号进行仲后要求协议如图所示请求方发送reqrequest信号1表示有请求给仲裁器仲裁器响应grant信号为1表示请求成功:通过参数定义在冲突情形下响应A/B的比例举例一段时间内有若干次A请求和若干次B请求其中AB发生冲突的有N次这N次中先响应A 3次后响应B 1次循环反复。举例中的3和1可配置。添加必要的注释增加代码可读性。解题思路根据题目描述很容易想到模块arbiter的端口应该如下module arbiter (input wire clk, // 时钟信号input wire rst, // 复位信号input wire reqA, // A组请求信号input wire reqB, // B组请求信号output reg grantA, // A组响应信号output reg grantB // B组响应信号
);时钟、复位信号。两个请求信号和两个相应响应信号。只有在冲突时AB冲突响应比为3:1。其他情况下正常响应。所以可以写一个计数器仅在冲突时加1。计数器0,1,2时响应A计数器3时响应B于此同时将计数器置0。对于仲裁部分可以将总线的请求信号reqA和reqB拼接成一个2bit信号这样使用case语句就能避免多级if-else嵌套导致的长组合逻辑链。在case语句中把{reqA, reqB}的所有可能2b00,2b01,2b10,2b11。全都规划到就行当{reqA, reqB}2b11时判断冲突计数器范围落在[0,A_ratio-1]则冲突时A获得总线若counter落在[A_ratio,A_ratioB_ratio-2]时冲突时B获得总线。这样模块满足题目要求可自定义冲突分配比例。代码module arbiter #(parameter [7:0] A_ratio 3 , // A grant ratio parameter [7:0] B_ratio 1 // B grant ratio
)(input wire clk , // 时钟信号input wire rstn , // 复位信号input wire reqA , // A组请求信号input wire reqB , // B组请求信号output grantA , // A组响应信号output grantB // B组响应信号
);// 定义计数器和比例参数
reg [7:0] counter 0; // belongs to [0, A_ratio B_ratio - 1]
reg grantA_reg,grantB_reg;assign grantA grantA_reg;
assign grantB grantB_reg;always (posedge clk) beginif (!rstn) begingrantA_reg 0;grantB_reg 0;end else begincase({reqA,reqB})2b00:begingrantA_reg 1b0;grantB_reg 1b0;end2b01:begingrantA_reg 1b0;grantB_reg 1b1;end2b10:begingrantA_reg 1b1;grantB_reg 1b0;enddefault:beginif(counter (A_ratio - 1) )begingrantA_reg 1b1;grantB_reg 1b0;endelse begingrantA_reg 1b0;grantB_reg 1b1;endendendcaseend
endalways (posedge clk)beginif(!rstn)begincounter 8d0;endif( (reqAreqB) (counter (A_ratio B_ratio - 2)) )begincounter counter 1b1;endelse counter 8d0;
endendmoduletbmodule arbiter_tb;// 定义时钟和复位信号
reg clk;
reg rstn;// 定义A组和B组请求信号
reg reqA;
reg reqB;// 定义A组和B组响应信号
wire grantA;
wire grantB;// 实例化被测试的模块
arbiter dut (.clk(clk),.rstn(rstn),.reqA(reqA),.reqB(reqB),.grantA(grantA),.grantB(grantB)
);// 时钟信号发生器
always #5 clk ~clk;// 测试用例1A组优先
initial begin// 初始化信号rstn 0;clk 0;reqA 0;reqB 0;// 复位#15 rstn 1;#1 // 发送A组请求#10 reqA 1;// 发送B组请求#10 reqA 0;reqB 1;// 发送A and B组请求 eight timesrepeat(8) begin#10 reqA 1;reqB 1;endrepeat(2) begin#10 reqA 1;reqB 0;endrepeat(2) begin#10 reqA 0;reqB 1;end#10 reqA 0;reqB 0;// 停止测试#100 $finish;
endinitial begin$fsdbDumpfile(arbiter.fsdb);$fsdbDumpvars(0);
endendmodule波形图在tb里先分别让A、B各请求总线一次然后让他们出现请求冲突8次最后再让A、B分别请求总线两次从图中可以看到在A、B请求冲突的时候A_grant、B_grant拿到总线的比例是3:1我们在module定义开头给了两个parameter定义了A_grant、B_grant拿到总线的比例A_ratio和B_ratio如果要修改模块代码修改module传入的parameter的值即可。更多手撕代码题可以前往 数字IC手撕代码--题库