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
- FPGA学习(第5节)-看电路图写出Verilog代码(乘法运算+自加一+模块实例化等)
- Verilog、FPGA学习(一)
- FPGA学习(第10节)-模块的例化-Verilog层次化设计实现LED流水灯
- FPGA之verilog第一天学习(00011101序列产生器)
- FPGA从零开始-Verilog语法学习笔记(一)
- FPGA学习笔记(一)Verilog语法基础
- FPGA学习(第6节)-Verilog计数器(实现流水灯+实现数码管秒表)
- FPGA学习(第7节)-Verilog状态机(状态按条件切换)
- FPGA学习(第8节)-Verilog设计电路的时序要点及时序仿真
- FPGA学习(第9节)-Verilog设计电路大串讲(误区+组合逻辑+时序逻辑+状态机设计)
- FPGA学习(第3节)-Verilog实现LED流水灯+基础入门语法+Modelsim仿真技巧+计数器+状态机+分频
- Verilog基础知识2(FPGA小数运算处理--定点小数)
- FPGA之verilog学习第一天(时分秒数字时钟)
- FPGA学习之Verilog HDL 一
- FPGA学习笔记 Verilog HDL语句(基础)
- Verilog HDL 学习(一)
- verilog学习笔记(一)
- 【连载】【FPGA黑金开发板】Verilog HDL那些事儿--我眼中的FPGA 和Verilog HDL(一)
- 淘宝开源库VLayout实践
- Eclipse下内存溢出错误(OutOfMemoryError)
- 【BZOJ4103】异或运算(THUSC2015)-可持久化trie树+位运算
- 专访DeepID发明者孙祎:关于深度学习与人脸算法的深层思考
- 近似因子模型 分类:机器学习
- FPGA学习(第5节)-看电路图写出Verilog代码(乘法运算+自加一+模块实例化等)
- 中文奇数乱码解决方案
- Position定位
- Activity
- 二叉树遍历
- 那些我正在使用的 Chrome 插件
- codeforces616C The Labyrinth
- JAVA中的结构体排序(基础向)
- Maven中央仓库信息速查