HDLBits刷题合集—6 More Verilog Features
HDLBits-37 Conditional ternary operator
Problem Statement
Verilog也有像C语言一样的三元条件运算符:
(condition ? if_true : if_false)
这可以在一行中根据条件从两个值中选择一个,而不需要在组合的always块中使用if-then语句。
几个例子:
(0 ? 3 : 5) // This is 5 because the condition is false.
(sel ? b : a) // A 2-to-1 multiplexer between a and b selected by sel.
always @(posedge clk) // A T-flip-flop.
q <= toggle ? ~q : q;
always @(*) // State transition logic for a one-input FSM
case (state)
A: next = w ? B : A;
B: next = w ? A : B;
endcase
assign out = ena ? q : 1'bz; // A tri-state buffer
((sel[1:0] == 2'h0) ? a : // A 3-to-1 mux
(sel[1:0] == 2'h1) ? b :
c )
给定四个无符号数,求最小值。无符号数字可以用标准比较运算符(a < b)比较。使用条件运算符制作两个数值的最小值电路,然后组合他们几个,创建一个四个数值的最小值电路。可能需要一些中间线向量。
代码如下:
module top_module (
input [7:0] a, b, c, d,
output [7:0] min);//
wire [7:0] result1,result2;
assign result1 = a<b ? a : b;
assign result2 = c<d ? c : d;
assign min = result1<result2 ? result1 : result2;
// assign intermediate_result1 = compare? true: false;
endmodule
HDLBits-38 Reduction
Problem Statement
当通过一个不完美的信道传输数据时,奇偶校验通常被用来作为一种简单的方法来检测错误。创建一个电路来计算一个8位字节的奇偶校验位(这将为字节增加到9位)。我们将使用“偶数”校验,其中奇偶校验位就是所有8个数据位的异或。
代码如下:
module top_module (
input [7:0] in,
output parity);
assign parity = ^in;
endmodule
HDLBits-39 Gates100
Problem Statement
建立一个有100个输入的组合电路,有3输出:
out_and:100输入与的输出。
out_or:100输入或的输出。
out_xor:100输入异或的输出。
代码如下:
module top_module(
input [99:0] in,
output out_and,
output out_or,
output out_xor
);
assign out_and = & in;
assign out_or = | in;
assign out_xor = ^ in;
endmodule
HDLBits-40 Vector100r
Problem Statement
给定一个100位的输入向量[99:0],颠倒它的位顺序。
代码如下:
module top_module(
input [99:0] in,
output [99:0] out
);
always@(*) begin
for (int i =0; i<=99; i=i+1)
begin
out[i] = in[99-i];
end
end
endmodule
HDLBits-41 Popcount255
Problem Statement
总体计数电路用来计算输入向量中“1”的个数。为一个255位的输入向量建立一个总体计数电路。
代码如下:
module top_module(
input [254:0] in,
output [7:0] out );
int i;
always@(*) begin
out = 8'b0000_0000;
for (i=0; i<255; i=i+1)
begin
if (in[i] == 1'b1)
out = out +1'b1;
else
out = out + 1'b0;
end
end
endmodule
HDLBits-42 Popcount255
Problem Statement
通过实例化100个全加法器来创建一个100位二进制行纹进位加法器。加法器加上两个100位的数字和一个进位,产生一个100位的和与向高位进位。
题目要求用实例化全加器,但这里用了always块。
代码如下:
module top_module(
input [99:0] a, b,
input cin,
output [99:0] cout,
output [99:0] sum );
assign cout[0] = a[0] & b[0] | a[0] & cin | b[0] & cin;
assign sum[0] = a[0] ^ b[0] ^ cin;
integer i;
always @ (*) begin
for (i=1; i<100; i++)
begin
cout[i] = a[i] & b[i] | a[i] & cout[i-1] | b[i] & cout[i-1];
sum[i] = a[i] ^ b[i] ^ cout[i-1];
end
end
endmodule
HDLBits-43 Bcdadd100
Problem Statement
给定一个名为bcd_fadd一位BCD码加法器,它可以计算两个BCD数字和低位进位,并生成一个和与高位进位。
module bcd_fadd {
input [3:0] a,
input [3:0] b,
input cin,
output cout,
output [3:0] sum );
代码如下:
module top_module(
input [399:0] a, b,
input cin,
output cout,
output [399:0] sum );
wire [399:0] cout_tmp;
bcd_fadd fadd(.a(a[3:0]), .b(b[3:0]), .cin(cin), .cout(cout_tmp[0]),.sum(sum[3:0]));
assign cout = cout_tmp[396];
generate
genvar i;
for(i = 4; i < 400; i=i+4) begin : bcdadd//必须有名字
bcd_fadd fadd(.a(a[i+3:i]), .b(b[i+3:i]), .cin(cout_tmp[i-4]), .cout(cout_tmp[i]),.sum(sum[i+3:i]));
end
endgenerate
endmodule
这题参考知乎—HDLBits 中文导学
Note
新手一枚,主要分享博客,记录学习过程,后期参考大佬代码或思想会一一列出。欢迎大家批评指正!