0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

FPGA设计:always组合逻辑块的讲解和译码器的实现

CHANBAEK 来源:小小研究生 作者:xxyjs2020 2023-05-12 14:42 次阅读

always 语句

always 语句是重复执行的。always 语句块从 0 时刻开始执行其中的行为语句;当执行完最后一条语句后,便再次执行语句块中的第一条语句,如此循环反复。多用于仿真时钟的产生,信号行为的检测等。

always语句的格式:

always @(posedge clk) begin
    temp    = a ;
    a       = b ;
    b       = temp ;
end

()中可以是*,表示:每当任何输入发生变化时执行begin和end之间的语句。也可以是posedge clk,表示:时钟上升沿时执行begin和end之间的语句。assign语句和always @(*)创建相同的组合逻辑,比如下面代码中的两个输出波形是一致的。

module top_module(
    input a, 
    input b,
    output wire out_assign,
    output reg out_alwaysblock
);
assign out_assign=a&b;
    always @(*) begin
       out_alwaysblock=a&b; 
    end
endmodule

连续性赋值,过程性赋值 :连续性赋值总是处于激活状态,任何操作数的改变都会影响表达式的结果;过程赋值只有在语句执行的时候,才会起作用。

阻塞赋值与非阻塞赋值 :是过程赋值的两种类型。

阻塞赋值 :阻塞赋值属于顺序执行,下一条语句执行前,当前语句一定会执行完毕。使用等号 = 作为赋值符。initial语句用阻塞赋值。

非阻塞赋值 :并行执行,即下一条语句的执行和当前语句的执行是同时进行的,它不会阻塞位于同一个语句块中后面语句的执行。使用 <= 作为赋值符。

使用非阻塞赋值是为了避免竞争冒险,那么实际使用中只需要记住:always时序逻辑块中多用非阻塞赋值<=(后面的时序逻辑电路会另外介绍),always组合逻辑块中多用阻塞赋值=; 在仿真电路时,initial 块中一般多用阻塞赋值=。 例如下面代码中,用assign语句,always组合语句,always时钟语句实现异或:

module top_module(
    input clk,
    input a,
    input b,
    output wire out_assign,
    output reg out_always_comb,
    output reg out_always_ff   );
assign out_assign=a^b;
    always @(*) begin
       out_always_comb=a^b; 
    end
    always @(posedge clk) begin
       out_always_ff<=a^b; 
    end
endmodule

if 语句格式

if (condition1)       true_statement1 ;
else if (condition2)        true_statement2 ;
else if (condition3)        true_statement3 ;
else                      default_statement ;

如果只有两种情况,就只有if和else。下面用上一节中MUX2_1做练习,上一节中采用了assign的三元运算符语句,这里使用always if语句实现2选1的功能:

module mux2_1 
(
input wire in1, 
input wire in2, 
input wire sel, 
output reg out 
 ); 
 
 always@(*) begin
 if(sel == 1'b1)//当“if...else...”中只有一个变量时不需要加“begin...end".但是为了不遗漏,还是加上
 out = in1; //always块中的组合逻辑关系时使用阻塞赋值“=”进行赋值
 else
 out = in2;
 end
 endmodule

3-8译码器的实现

从真值表看译码器功能:A2A1A0=000-111共8种输入,对应输出Y的下标,对应下标的输出为1(高电平),其他输出为0(低电平)。3-8译码器的作用:按照之前点亮LED灯的思路,如果一个I/O端口控制一个LED灯,那么I/O端口很有可能不够用,这时候聪明人就想出用3-8译码器的方式,3个I/O口就可以控制8个LED。

设计规划

这个示例中,绘制波形图如图所示。

编写代码

module decoder3_8
(
input wire in1 , 
input wire in2 , 
input wire in3 , 
output reg [7:0] out 
);


 always@(*) begin
 //使用"{}"位拼接符将31bit数据按照顺序拼成一个3bit数据
 if({in1, in2, in3} == 3'b000)
 out = 8'b0000_0001;
 else if({in1, in2, in3} == 3'b001)
 out = 8'b0000_0010;
 else if({in1, in2, in3} == 3'b010)
 out = 8'b0000_0100;
 else if({in1, in2, in3} == 3'b011)
 out = 8'b0000_1000;
 else if({in1, in2, in3} == 3'b100)
 out = 8'b0001_0000;
 else if({in1, in2, in3} == 3'b101)
 out = 8'b0010_0000;
 else if({in1, in2, in3} == 3'b110)
 out = 8'b0100_0000;
 else if({in1, in2, in3} == 3'b111)
 out = 8'b1000_0000;
 else
 out = 8'b0000_0001;
end
 endmodule

代码中使用always组合逻辑块。由于if对应的执行语句只有一句,可以不使用begin,end但是由于怕以后复杂代码会遗漏,还是选择加上。always组合逻辑使用阻塞语句,用=进行赋值。

上面RTL代码综合出的RTL视图:

编写testbench

`timescale 1ns/1ns
module tb_decoder3_8();


//reg define
reg in1;
reg in2;
reg in3;
wire [7:0] out;


 //初始化输入信号
 initial begin
 in1 <= 1'b0;
 in2 <= 1'b0;
 in3 <= 1'b0;
 end


 always #10 in1 <= {$random} % 2;
 always #10 in2 <= {$random} % 2;
 always #10 in3 <= {$random} % 2;
 //-------------decoder3_8_inst----------------
 decoder3_8 decoder3_8_ins
 (
 .in1(in1), 
 .in2(in2), 
 .in3(in3), 
 .out(out) 
 );


 endmodule

经过两个实例后,testbench已经超级熟悉了吧。

对比波形

看看波型:

验证了波形的正确性

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1625

    文章

    21663

    浏览量

    601670
  • FPGA设计
    +关注

    关注

    9

    文章

    428

    浏览量

    26480
  • 仿真
    +关注

    关注

    50

    文章

    4036

    浏览量

    133395
  • 时钟
    +关注

    关注

    10

    文章

    1720

    浏览量

    131339
  • 译码器
    +关注

    关注

    4

    文章

    310

    浏览量

    50273
收藏 人收藏

    评论

    相关推荐

    译码器逻辑功能和使用方法

    译码器是一个多输入、多输出的组合逻辑电路。它的作用是把给定的代码进行“翻译”,变成相应的状态,使输出通道中相应的一路有信号输出。
    的头像 发表于 10-11 12:51 8732次阅读
    <b class='flag-5'>译码器</b>的<b class='flag-5'>逻辑</b>功能和使用方法

    FPGA基础学习笔记--组合逻辑电路-编码译码器

    `FPGA基础学习笔记--组合逻辑电路-编码译码器编码4输入2输出编码
    发表于 02-20 15:36

    第二章_组合逻辑电路之译码器

    本帖最后由 芯航线跑堂 于 2016-12-23 21:02 编辑 组合逻辑电路设计之译码器课程目标: 1. 再次熟悉Quartus II工程的建立以及完整的FPGA开发流程 2
    发表于 12-20 18:45

    第二章 组合逻辑电路之译码器

    组合逻辑电路设计之译码器课程目标: 1. 再次熟悉Quartus II工程的建立以及完整的FPGA开发流程 2. 以译码器为例学会简单
    发表于 12-20 18:54

    怎么实现BCH译码器FPGA硬件设计?

    本文通过对长BCH码优化方法的研究与讨论,针对标准中二进制BCH码的特性,设计了实现译码器FPGA硬件结构。
    发表于 06-15 09:23

    如何利用译码器进行组合逻辑电路的设计呢

    集成电路编码译码器的工作原理即逻辑功能是什么?如何利用逻辑门去实现一种集成电路编码呢?如何
    发表于 11-03 06:55

    译码器定义

    译码器1. 译码器定义译码器是一种用以检测输入位(码)的特定组合是否存在,并以特定的输出电平来指示这种特定码的存在的数字电路。——《数字电子技术基础系统方法》
    发表于 12-07 09:37

    译码器,译码器是什么意思

    译码器,译码器是什么意思 译码器组合逻辑电路的一个重要的器件,其可以分为:变量译码和显示
    发表于 03-08 16:32 5474次阅读

    基于FPGA的高速RS编译码器实现

    本文介绍了 RS[ 255, 223 ]编译码器FPGA设计和基于线形反馈移位寄存的编码设计 , 以及由伴随式计算、关键方程求解、钱氏搜索、Forney算法等功能模块组成的
    发表于 05-22 10:43 45次下载
    基于<b class='flag-5'>FPGA</b>的高速RS编<b class='flag-5'>译码器</b><b class='flag-5'>实现</b>

    译码器逻辑功能_译码器的作用及工作原理

    本文首先介绍了译码器的定义与译码器的分类,其次介绍了译码器的作用和译码器的工作原理,最后介绍了译码器
    发表于 02-08 14:04 11.4w次阅读
    <b class='flag-5'>译码器</b>的<b class='flag-5'>逻辑</b>功能_<b class='flag-5'>译码器</b>的作用及工作原理

    译码器的分类和应用

    本文主要介绍了译码器的分类和应用。译码器指的是具有译码功能的逻辑电路,译码是编码的逆过程,它能将二进制代码翻译成代表某一特定含义的信号(即电
    的头像 发表于 04-04 11:51 4.3w次阅读
    <b class='flag-5'>译码器</b>的分类和应用

    通过采用FPGA器件设计一个Viterbi译码器

    可编程逻辑技术的不断发展,其高密度、低功耗、使用灵活、设计快速、成本低廉、现场可编程和反复可编程等特性,使FPGA逐步成为Viterbi译码器设计的最佳方法。项目目的是用FPGA
    的头像 发表于 04-24 08:29 2959次阅读
    通过采用<b class='flag-5'>FPGA</b>器件设计一个Viterbi<b class='flag-5'>译码器</b>

    集成译码器逻辑功能和使用方法

    译码器是一个多输入、多输出的组合逻辑电路。它的作用是把给定的代码进行“翻译”,变成相应的状态,使输出通道中相应的一路有信号输出。译码器在数字系统中有广泛的用途,不仅用于代码的转换、终端
    的头像 发表于 04-26 14:34 4294次阅读
    集成<b class='flag-5'>译码器</b>的<b class='flag-5'>逻辑</b>功能和使用方法

    组合逻辑电路中的译码器介绍

    译码器定义 逻辑功能:将每个输入的二进制代码对应输出为高、低电平信号。 译码是编码的反操作。
    的头像 发表于 04-30 16:19 2062次阅读
    <b class='flag-5'>组合</b><b class='flag-5'>逻辑</b>电路中的<b class='flag-5'>译码器</b>介绍

    always组合逻辑讲解译码器实现

    always 语句是重复执行的。always 语句从 0 时刻开始执行其中的行为语句;当执行完最后一条语句后,便再次执行语句中的第一条语句,如此循环反复。
    的头像 发表于 05-22 15:13 2921次阅读
    <b class='flag-5'>always</b><b class='flag-5'>组合</b><b class='flag-5'>逻辑</b><b class='flag-5'>块</b>的<b class='flag-5'>讲解</b>和<b class='flag-5'>译码器</b>的<b class='flag-5'>实现</b>