SR锁存器延迟模型

1.设计所需要的功能模块

2.验证所设计模块的正确性

3.代码:module div2(clk, reset, start, A, B, D, R, ok, err);

parameter n = 32;

parameter m = 16;

input clk, reset, start;

input [n-1:0] A, B;

output [n+m-1:0] D;

output [n-1:0] R;

output ok, err;

wire invalid, carry, load, run;

div_ctl UCTL(clk, reset, start, invalid, carry, load, run, err, ok);

div_datapath UDATAPATH(clk, reset, A, B, load, run, invalid, carry, D, R);

endmodule

module div_ctl(clk, reset, start, invalid, carry, load, run, err, ok);

parameter n = 32; parameter m = 16; parameter STATE_INIT = 3’b001;

parameter STATE_RUN = 3’b010;

parameter STATE_FINISH = 3’b100;

input clk, reset, start, invalid, carry;

output load, run, err, ok;

reg [2:0] current_state, next_state;

reg [5:0] cnt; reg load, run, err, ok;

@(posedge clk or negedge reset) begin if(!reset) begin current_state <= STATE_INIT;

cnt <= 0;

end else begin current_state <= next_state; if(run) cnt <= cnt + 1’b1;

end end always @(posedge clk or negedge reset) begin if(!reset) begin err <= 0; end else if(next_stateSTATE_RUN) begin if(invalid) err <= 1;

end

end

always @(current_state or start or invalid or carry or cnt) begin load <= 1’b0;

ok <= 1’b0;

run <= 1’b0;

case(current_state) STATE_INIT:

begin if(start) next_state <= STATE_RUN;

else next_state <= STATE_INIT; load <= 1;

end STATE_RUN : begin run <= 1;

if(invalid) begin next_state <= STATE_FINISH;

end

else

if(cnt(n+m-1)) begin next_state <= STATE_FINISH;

end

else

begin

next_state <= STATE_RUN;

end end STATE_FINISH :

begin ok <= 1; next_state <= STATE_FINISH;

end default : begin next_state <= STATE_INIT;

end

endcase

end

endmodule

module div_datapath(clk, reset, A, B, load, run, invalid, carry, D, R);

parameter n = 32;

parameter m = 16;

input clk, reset;

input [n-1:0] A, B;

input load, run;

output invalid, carry;

output [n+m-1:0] D;

output [n-1:0] R;

reg [n+n+m-2:0] R0;

reg [n+m-1:0] D;

reg [n-1:0] B0;

reg carry;

wire invalid;

wire [n-1:0] DIFF, R;

wire CO;

assign R = {carry, R0[n+n+m-2:n+m]};

assign invalid = (B0==0);

sub sub(R0[n+n+m-2:n+m-1], B0, 1’b0, DIFF, CO);

always @(posedge clk)

begin

if(load)

begin 

D <= 0;

R0 <= {{(n-1){1’b0}}, A, {m{1’b0}}};

B0 <= B;

carry <= 1’b0;

end

else

if(run)

begin

if(CO && !carry)

begin

R0 <= { R0, 1’b0 };

D <= { D[n+m-2:0], 1’b0 };

carry <= R0[n+n+m-2];

end

else

begin

R0 <= { DIFF, R0[n+m-2:0], 1’b0 };

D <= { D[n+m-2:0], 1’b1 }; carry <= DIFF[n-1];

end

end

endendmodule

module sub(A, B, CI, DIFF, CO);

parameter n = 32;

input [n-1:0] A, B;

input CI;

output [n-1:0] DIFF;

output CO;

assign {CO, DIFF} = {1’b0, A} - {1’b0, B} - {{n{1’b0}}, CI};

endmodule

截图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值