您当前的位置: 首页 > 

刘颜儿

暂无认证

  • 7浏览

    0关注

    99博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Verilog:HDLBits刷题-向量

刘颜儿 发布时间:2022-06-26 21:44:40 ,浏览量:7

前言

这是我第二次刷HDLBits的题,第一次是刚接触FPGA时,为了快速入门Verilog,第一次刷题跟着B站视频刷的,但是现在发现没有很大的用处,个人感觉还是有一点Verilog基础后,再来刷HDLBits会好一点,虽然很多人说这上面的题都很简单,但是还是值得刷一遍,里面几乎涵盖了Verilog的所有常用语法,并且还可以尝试用不同方法解同一道题。

代码

以下是我写的每道题的代码和思路

vector

重点:

  1. 多位向量的输出、翻转
  2. 向量的拼接和复制:拼接中,位宽已知的部分可以不加{ }
  3. 向量的按位或(位数不变)、逻辑或(多位变1位)

// 多位输入:多位输出+一位输出

module top_module ( 
    input wire [2:0] vec,
    output wire [2:0] outv,
    output wire o2,
    output wire o1,
    output wire o0  ); // Module body starts after module declaration

    assign outv = vec;
    assign o2 = vec[2];
    assign o1 = vec[1];
    assign o0 = vec[0];

endmodule

// 分别得到多位输入的高8位和低8位

`default_nettype none     // Disable implicit nets. Reduces some types of bugs.
module top_module( 
    input wire [15:0] in,
    output wire [7:0] out_hi,
    output wire [7:0] out_lo );
    assign out_hi = in[15:8];
    assign out_lo = in[7:0];
// wire [0:7] b;    8-bit wire where b[0] is the most-significant bit.
endmodule


// ====================  3  =============================
// 32位输入分成8个一组,8位前后翻转
module top_module( 
    input [31:0] in,
    output [31:0] out );//

    // assign out[31:24] = in[24:31];
    // assign out[23:16] = in[16:23];
    // assign out[15:8] = in[8:15];
    // assign out[7:0] = in[0:7];
    assign out[31:24] = in[7:0];
    assign out[23:16] = in[15:8];
    assign out[15:8] = in[23:16];
    assign out[7:0] = in[31:24];
    // assign out[31:24] = ...;

endmodule


// ====================  4  =============================
// 按位或、逻辑或、2输入取非

module top_module( 
    input [2:0] a,
    input [2:0] b,
    output [2:0] out_or_bitwise,
    output out_or_logical,
    output [5:0] out_not
);
assign out_or_bitwise = a | b;
assign out_or_logical = a || b;
assign out_not[2:0] = ~ a;
assign out_not[5:3] = ~ b; 


endmodule

// 多位输入,分别用每位做:与、或、异或

module top_module( 
    input [3:0] in,
    output out_and,
    output out_or,
    output out_xor
);
//方法一
    assign out_and = in[0] & in[1] & in[2] & in[3];
    assign out_or  = in[0] | in[1] | in[2] | in[3];
    assign out_xor = in[0] ^ in[1] ^ in[2] ^ in[3];
    //方法二
    //assign out_and = ∈
    //assign out_or = |in;
    //assign out_xor = ^in;

endmodule

// 拼接符{}的用法、11要写成2'd11
module top_module (
    input [4:0] a, b, c, d, e, f,
    output [7:0] w, x, y, z );//

    assign w = {a,{b[4:2]}};
    assign x = {{b[1:0]},c,{d[4]}};
    assign y = {{d[3:0]},{e[4:1]}};
    assign z = {{e[0]},f,2'd11};
    
    // 都用{}拼接起来也能运行
    // assign w = {{a},{b[4:2]}};
    // assign x = {{b[1:0]},{c},{d[4]}};
    // assign y = {{d[3:0]},{e[4:1]}};
    // assign z = {{e[0]},{f},{2'd11}};

endmodule


// ====================  7  =============================

// 8位向量翻转

module top_module( 
    input [7:0] in,
    output [7:0] out
);
// assign out[0:7] = in[7:0];  Verilog不允许向量翻转
    assign out[7] = in[0];
    assign out[6] = in[1];
    assign out[5] = in[2];
    assign out[4] = in[3];
    assign out[3] = in[4];
    assign out[2] = in[5];
    assign out[1] = in[6];
    assign out[0] = in[7];
    
endmodule


// ====================  8  =============================

// 复制:{}的用法,复制后每个元素用{}拼接

module top_module (
    input [7:0] in,
    output [31:0] out );

    assign out = {{24{in[7]}},{in}};

endmodule


// 拼接+复制:{}的2种用法

module top_module (
    input a, b, c, d, e,
    output [24:0] out );//

    assign out = {{~{5{a}}^{a,b,c,d,e}},{~{5{b}}^{a,b,c,d,e}},{~{5{c}}^{a,b,c,d,e}},{~{5{d}}^{a,b,c,d,e}},{~{5{e}}^{a,b,c,d,e}}};

    // The output is XNOR of two vectors created by 
    // concatenating and replicating the five inputs.
    // assign out = ~{ ... } ^ { ... };

endmodule
关注
打赏
1659364566
查看更多评论
立即登录/注册

微信扫码登录

0.1426s