hdlbits.01xz.net答案/Verilog Language/More Verilog Features
1.Conditional
注意:"<"是比较无符号数的大小。
module top_module (
input [7:0] a, b, c, d,
output [7:0] min);//
// assign intermediate_result1 = compare? true: false;
wire [7:0] temp1;
wire [7:0] temp2;
assign temp1 = (a<b) ? a : b;
assign temp2 = (c<d) ? c : d;
assign min = (temp1<temp2) ? temp1 : temp2;
endmodule
2.Reduction
本例介绍了一个归约运算:即对操作数按位相与/或/异或等最终结果为一个一位二进制数。
本例采用了一个描述奇偶校验的例子,结果就是按位相异或的归约运算。
module top_module (
input [7:0] in,
output parity);
assign parity = ^in;
endmodule
3.Gates100
module top_module(
input [99:0] in,
output out_and,
output out_or,
output out_xor
);
assign out_and = ∈
assign out_or = |in;
assign out_xor = ^in;
endmodule
4.Vector100r
主要是引入了for循环的用法
module top_module(
input [99:0] in,
output [99:0] out
);
integer i;//i 必须先声明再使用
always@(in)
for(i = 0; i < 100 ; i = i + 1)//实际上综合时是一个个去实现的
out[99-i] = in[i];
endmodule
5.Popcount255
这个例子的代码里也有几个问题值得一提。
首先是always等块以及for/if/case等高级语句,一旦内部语句多余一条必须加上begin..end/fork...join说明。
这一点可以回想C语言中通过{}实现这个目的,如果没有编译器就无法区分边界了。
代码中整数默认都是32位的整数,用的时候可以稍加修改避免quartus报错。
module top_module(
input [254:0] in,
output [7:0] out );
integer i;
reg[7:0] count;
always@(in)
begin
count = 0;
for(i = 0; i < 255; i = i + 1)
begin
if(in[i])
count = count + 8'b1;//写八位的1可以避免quartus报位数减小的错,因为1默认是32位的1
end
out = count;
end
endmodule
6.Adder100i
实际上本例可以不使用实例化的方法去写。但是这样有违模块化层次化的设计原则。
本例本身是实现一个波行进位(ripple-carry)加法器,也即串行加法器。
module top_module(
input [99:0] a, b,
input cin,
output [99:0] cout,
output [99:0] sum );
integer i;
always@(a or b or cin)
begin
sum[0] = a[0]^b[0]^cin;
cout[0] = (a[0]&b[0]) | (a[0]&cin) | (b[0]&cin);
for(i = 1; i < 100; i = i + 1)
begin
sum[i] = a[i]^b[i]^cout[i-1];
cout[i] = (a[i]&b[i]) | (a[i]&cout[i-1]) | (b[i]&cout[i-1]);
end
end
endmodule
正如题目推荐的那样,使用generate语句可以使得代码模块化。
generate可以用循环不断实例化一个模块,而不用一个个分别再去命名。
使用时通过genvar来设置循环索引变量i
generate的使用比较复杂,具体参考以下链接
链接来源:知乎数字IC小站
module top_module(
input [99:0] a, b,
input cin,
output [99:0] cout,
output [99:0] sum );
generate
genvar i;
for(i = 0;i < 100;i++)begin:add100
if(i == 0)
add1 add_1(a[i],b[i],cin,sum[i],cout[i]);
else
add1 add_1(a[i],b[i],cout[i-1],sum[i],cout[i]);
end
endgenerate
endmodule
module add1(input a,input b,input cin,output sum,output cout);
assign sum = a ^ b ^ cin;
assign cout = (a&b)|(a&cin)|(b&cin);
endmodule
7.Bcdadd100
这里再次强调了generate的使用。
module top_module( 
    input [399:0] a, b,
    input cin,
    output cout,
    output [399:0] sum );
    wire[98:0] temp_cout;  
    generate
        genvar i;
        for(i = 0; i < 100; i++)begin:BCD_adder100
            if( i == 0 )
                bcd_fadd bcd_adder1(a[4*i+3:4*i],b[4*i+3:4*i],cin,temp_cout[i],sum[4*i+3:4*i]);
            else if(i < 99)
                bcd_fadd bcd_adder1(a[4*i+3:4*i],b[4*i+3:4*i],temp_cout[i-1],temp_cout[i],sum[4*i+3:4*i]);
            else
                bcd_fadd bcd_adder1(a[4*i+3:4*i],b[4*i+3:4*i],temp_cout[i-1],cout,sum[4*i+3:4*i]);
        end
    endgenerate
endmodule
本例中报了一个位数被缩减匹配相应变量的警告,说在line8,我也不知道怎么修正如果有同学能指点一下就最好了。
本节中的generate我也是第一次接触。使用非常的灵活,代码如有错误还请指正。
                    
                
                
            
        
浙公网安备 33010602011771号