2021-07-02

这篇博客详细介绍了如何使用QuartusII和ModelsimSE10进行Verilog代码的开发和仿真。通过两个实例——分频器和除法器的实现,展示了Verilog编程的基本语法和流程控制。实验代码中,分频器根据输入信号x的状态变化更新输出y1,除法器则实现了将输入A除以B的功能,输出结果D和余数R,并有错误检查机制。
摘要由CSDN通过智能技术生成

1:实验目的:
加深对QuartusII的使用以及操作,熟悉ModelsimSE10的操作。
2:实验代码:
module ex8_1(clock,reset,x,y1,y2) ;
input clock,reset;
input x;
output y1,y2;
reg y1,y2;

reg [3:0] cstate,nstate;

parameter s0=4’b0001,s1=4’b0010,
s2=4’b0100,s3=4’b1000;

always @ (posedge clock or posedge reset)
begin
if (reset)
cstate<=s0;
else
cstate<=nstate;
end

always @ (cstate or x)
begin
case (cstate)
s0:begin
if (x0)
nstate=s1;
else
nstate=s3;
end
s1:begin
if (x0)
nstate=s2;
else
nstate=s0;
end
s2:begin
if (x0)
nstate=s3;
else
nstate=s1;
end
s3:begin
if (x0)
nstate=s0;
else
nstate=s2;
end
default : nstate=s0;
endcase
end

always @ (cstate or x)
begin
case (cstate)
s0 : begin
if (x0)
y1=1;
else
y1=0;
end
s1 : begin
if (x0)
y1=0;
else
y1=0;
end
s2 : begin
if (x0)
y1=0;
else
y1=0;
end
s3 : begin
if (x0)
y1=0;
else
y1=1;
end
default :y1=0;
endcase
end

always @ (cstate or x)
begin
if (cstates0 && x0)
y2=1;
else if (cstates3 && x1)
y2=1;
else
y2=0;
end

endmodule

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;

always @(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_state==STATE_RUN) begin
if(invalid) err <= 1;
end
end

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

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
end
endmodule

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

odule my_rs (reset,set,q,qbar);
input reset,set;
output q,qbar;

nor # (1) n1 (q,reset,qbar);
nor # (1) n2 (qbar,set,q);

endmodule
3:实验截图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值