赞
踩
TAG
-
F
P
G
A
、期末、速成
FPGA、期末、速成
FPGA、期末、速成习题1
– //// A. 系统级描述:
module full_adder (
input A, B, Cin,
output Sum, Cout
);
// 系统级描述中可以使用高级的抽象,不关注具体电路实现细节
assign {Sum, Cout} = A + B + Cin;
endmodule
// B. 算法级描述:
module full_adder (
input A, B, Cin,
output Sum, Cout
);
// 算法级描述关注操作的算法,但不涉及具体的硬件结构
always_comb begin
Sum = A ^ B ^ Cin;
Cout = (A & B) | (B & Cin) | (A & Cin);
end
endmodule
// C. 门级描述:
module full_adder (
input A, B, Cin,
output Sum, Cout
);
// 门级描述涉及具体的逻辑门实现
wire w1, w2, w3, w4;
assign w1 = A ^ B;
assign w2 = w1 ^ Cin;
assign w3 = A & B;
assign w4 = w3 | (w1 & Cin);
assign {Sum, Cout} = {w2, w4};
endmodule
// D. RTL级描述(寄存器传输级描述): module full_adder ( input wire A, B, Cin, output wire Sum, Cout ); // RTL级描述涉及到数据传输和寄存器的操作 reg [1:0] sum_reg; always @(posedge clk or posedge rst) begin if (rst) begin sum_reg <= 2'b0; end else begin sum_reg <= A + B + Cin; end end assign {Sum, Cout} = sum_reg; endmodule
这些描述层级从高到低,系统级描述抽象程度高,而RTL级描述更接近硬件实现。
1
2
3
4
5
1
module mux4_1 ( output reg out, input wire in0, in1, in2, in3, input wire [1:0] sel ); always @(sel or in0 or in1 or in2 or in3) begin case (sel) 2'b00: out = in0; 2'b01: out = in1; 2'b10: out = in2; 2'b11: out = in3; default: out = 1'b0; // Optional default case endcase end endmodule
2
<占个坑>
3
module voter7 ( input [6:0] vote, // 输入七个人的投票,使用二进制编码表示 output reg pass // 输出表决结果 ); always @(posedge clk or negedge rst) begin if (~rst) begin // 在复位时可以对pass进行初始化,例如 pass <= 1'b0; end else begin // 在这里实现表决逻辑,这里只是一个简单的例子 // 如果超过半数的人投赞成票(1),则 pass 置为 1,否则为 0 pass <= (vote >= 4); end end endmodule
4
module count4( output reg [7:0] out, input [7:0] data, input load, input reset, input clk ); always @(posedge clk or posedge reset) begin if (reset) begin out <= 8'b0; // 同步清零 end else if (load) begin out <= data; // 同步置数 end else begin out <= out + 1; // 计数 end end endmodule
习题2
– //1
2
// 结构描述:(门原语)
module FullAdder (input A, input B, input Cin, output Sum, output Cout);
xor f1(t1, A, B);
xor f2(sum, t1, Cin);
and f3(t3, A, B);
and f4(t4, A, Cin);
and f5(t5, B, Cin);
or f6(Cout, t3, t4, t5);
endmodule
// 数据流描述:(表达式)
module FullAdder (input A, input B, input Cin, output Sum, output Cout);
assign {Cout, Sum} = A + B + Cin;
endmodule
// 行为描述:(块语句等高级抽象语言)
module FullAdder (input A, input B, input Cin, output reg Sum, output reg Cout);
always @(A or B or Cin) begin
Sum = A ^ B ^ Cin;
Cout = (A & B) | (B & Cin) | (A & Cin);
end
endmodule
3
module AAA( output reg [7:0] out, input [7:0] data, input load, input reset, input clk ); // 同步不需要 ` or negedge reset or posedge load`,不然就变成异步了 always @(posedge clk) begin if (~reset) begin out <= 8'b00000000; // 同步清零 end else if (load) begin out <= data; // 同步置数 end else begin out <= out + 1; // 计数操作 end end endmodule
4
module fsm_seq101( input clk, clr, x, output reg z ); parameter s0 = 2'b 00; parameter s1 = 2'b 01; parameter s2 = 2'b 11; parameter s3 = 2'b 10; reg [1:0] now,next; always @(posegde clk or negedge clr) begin if (~clr) now = s0; else now = next; end always @(posegde clk or negedge clr) begin if (~clr) next = s0; else begin case (x) // 只是表示当前进行到第几步而已 s0: x ? next = s1 : s0; s1: x ? next = s1 : s2; s2: x ? next = s3 : s0; s3: x ? next = s1 : s2; default: next = s0; endcase end end always @(posedge clk or negedge clr) begin if (~clr) z = 0; else begin z = now == s3 ? 1 : 0; end end endmodule
习题3
– //module mult_8( output reg [15:0] outcome, // 输出乘法结果,16位宽度 input [7:0] a, // 输入数 a,8位宽度 input [7:0] b // 输入数 b,8位宽度 ); reg [15:0] temp,i; // 用于保存中间结果 always @(a or b) begin temp = 16'b0; // 初始化中间结果为0 for (i = 0; i < 8; i = i + 1) begin if (b[i]) // 如果 b 的当前位为1,则将 a 左移相应的位数,并加到中间结果上 temp = temp + (a << i); end outcome = temp; // 将最终结果输出 end endmodule
module count8( output reg [7:0] out, // 输出计数器结果 input [7:0] data, // 同步置数数据 input load, // 同步置数使能信号,高电平有效 input reset, // 异步清零信号,低电平有效 input clk // 时钟信号 ); always_ff @(posedge clk or negedge reset) begin if (~reset) // 异步清零 out <= 8'b0; else if (load) // 同步置数 out <= data; else out <= out + 1; // 正常计数 end endmodule
实现细节
参考示意图
参考链接
作者 | 乐意奥AI
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。