FPGA学习(第5节)-看电路图写出Verilog代码(乘法运算+自加一+模块实例化等)

来源:互联网 发布:ubuntu设置用户根目录 编辑:程序博客网 时间:2024/05/23 01:57

有个前一节的设计规范,现在我们通过看电路图写出对应的Verilog代码。

一、简单模块设计

(1)任务说明


(2)代码实现:

功能分析:输出两数相乘的结果。

图中是一个D触发器和乘法器的组合,可以通过组合逻辑+时序逻辑结合来实现。也可以只在时序逻辑中实现。




module mul_module(    clk    ,    rst_n  ,    //其他信号,举例dout    mul_a  ,    mul_b  ,    mul_result     );    //参数定义    parameter      A_W =   4;    parameter      B_W =   3;    parameter      R_W = A_W + B_W;    //输入信号定义    input               clk    ;    input               rst_n  ;    input [A_W-1:0]     mul_a  ;    input [B_W-1:0]     mul_b  ;    //输出信号定义    output[R_W-1:0]     mul_result;    //输出信号reg定义    reg   [R_W-1:0]     mul_result;    //中间信号定义    reg   [R_W-1:0]     mul_result_tmp;    //组合逻辑写法    /*    always@(*)begin        mul_result_tmp = mul_a * mul_b;    end    always@(posedge clk or negedge rst_n)begin        if(rst_n==1'b0)begin            mul_result <= 0;        end        else begin            mul_result <= mul_result_tmp;        end    end    */    //时序逻辑写法   always@(posedge clk or negedge rst_n)begin       if(rst_n==1'b0)begin           mul_result <= 0;       end       else begin           mul_result <= mul_a * mul_b;       end   endendmodule

二、简单模块设计

(1)电路图


(2)代码实现

功能分析:自加一

图中有一个加法器(组合逻辑实现)、一个D触发器(时序逻辑实现)。

module module_name(clk    ,rst_n  ,//其他信号out);//参数定义parameter      DATA_W =        4;//输入信号定义input               clk    ;input               rst_n  ;//输出信号定义output[DATA_W-1:0]  out   ;//输出信号reg定义reg   [DATA_W-1:0]  out   ;//中间信号定义reg   [DATA_W-1:0]  out_temp;//组合逻辑写法always@(*)begin    out_temp = out+1'b1;end//时序逻辑写法always@(posedge clk or negedge rst_n)beginif(rst_n==1'b0)begin    out<=0;endelse begin    out<=out_temp;endendendmodule


三、复杂模块设计



(2)代码实现

功能分析:与运算+选择器+实例化

从输出部分开始写代码:

两个寄存器变量的D触发器(时序)--》实例化模块(带参数)--》选择器(组合)--》寄存器变量的D触发器+与运行(时序)每个模块都在一个always块里去设计

时序还是组合很清晰。

module mul2port(    clk    ,    rst_n  ,    //其他信号,举例dout    din_a  ,    din_b  ,    din_c  ,    din_d  ,    sel_a  ,    sel_b  ,    result_a,    result_b    );    //参数定义    parameter      A_W =     3;    parameter      B_W =     2;    parameter      C_W =     4;    parameter      R_A_W =   7;    parameter      R_B_W =   6;    //输入信号定义    input               clk    ;    input               rst_n  ;    input [A_W-1:0]     din_a  ;    input [B_W-1:0]     din_b  ;    input [C_W-1:0]     din_c  ;    input [C_W-1:0]     din_d  ;    input               sel_a  ;    input               sel_b  ;    //输出信号定义    output[R_A_W-1:0]   result_a   ;    output[R_B_W-1:0]   result_b   ;    //输出信号reg定义    reg   [R_A_W-1:0]   result_a   ;    reg   [R_B_W-1:0]   result_b   ;    //中间信号定义    reg   [R_A_W-1:0]   result_a_tmp;    reg   [R_B_W-1:0]   result_b_tmp;    reg   [C_W  -1:0]   sel_dout    ;    reg                 sel         ;    always@(posedge clk or negedge rst_n)begin        if(rst_n==1'b0)begin            result_a <= 0;        end        else begin            result_a <= result_a_tmp;        end    end    always@(posedge clk or negedge rst_n)begin        if(rst_n==1'b0)begin            result_b <= 0;        end        else begin            result_b <= result_b_tmp;        end    end    mul_module  #(.A_W(A_W),.B_W(C_W)) mul_4_3(                         .clk       (clk       ),                         .rst_n     (rst_n     ),                         .mul_a     (din_a     ),                         .mul_b     (sel_dout  ),                         .mul_result(result_a_tmp) );    mul_module  #(.A_W(B_W),.B_W(C_W)) mul_4_2(                         .clk       (clk       ),                         .rst_n     (rst_n     ),                         .mul_a     (din_b     ),                         .mul_b     (sel_dout  ),                         .mul_result(result_b_tmp) );       always@(*)begin        if(sel)            sel_dout = din_c;        else            sel_dout = din_d;    end    always@(posedge clk or negedge rst_n)begin        if(rst_n==1'b0)begin            sel <= 1'b0;        end        else begin            sel <= sel_a && sel_b;        end    end    endmodule



阅读全文
1 0
原创粉丝点击