首页 > 其他分享 >Verilog HDL 的简单组合逻辑设计代码学习记录

Verilog HDL 的简单组合逻辑设计代码学习记录

时间:2024-07-23 19:55:29浏览次数:13  
标签:HDL 20 sel Verilog input tick out reg 逻辑设计

1.比较数据a和b,若两个数据相同则输出1,否则输出0(a、b均为单比特)

看需求就简单设置输入a,b,输出o。

module compare (a,b,o);

input a;
input b;
output o;

//先来第一种写法,使用?:,这里是默认全是wire类型
assign o = (a == b)?1'b1 : 1'b0;

//第二种写法,使用if else
reg o;
always @ (*) begin
     if (a==b)
        o=1;
     else
        o=0;
             end

//第三种写法,针对always更好的写法
reg o;
always @ (*) begin
        o=1'b0;
     if (a==b)
        o=1'b1;
             end

//第四种写法,直接同或
assign o = ~(a ^ b);

//以上方法run一种即可
endmodule

//testbench
module compare_tb;//这里插一下,文件名最好是与模块名一致,是个好习惯

reg a , b;
wire o;

initial begin
    a=1; b=0;
#20 a=1; b=1;
#20 a=0; b=1;
#20 a=0; b=0;  //这种简单逻辑就全例举就可以了
#20 $finish; //退出仿真的意思
         end

compare u_compare (.a(a) , .b(b) , .o(o) )//前面是调用模块的名字,也就是上面写的模块compare.v的模块名字,后面是例化名,是自己起的

endmodule

2.实现四位全加器。a,b,进位,o

module full_adder4 (a,b,carry,o);

input [3:0] a;
input [3:0] b;
output carry;
output [3:0] o;

assign {carry,o} = {1'b0,a} + {1'b0,b} ; //防止位数报错

endmodule


//testbench

module full_adder_tb;

reg [3:0] a,b;
wire carry;
wire [3:0] o;

integer i,j;

initial begin
   a = 4'b0000; b=4'b0000;
   for (i=0;i<16;i++)
      for(j=0;j<16;j++) begin
         #20  a=i; b=j;
        end

full_adder4 u_fa4( .a(a), .b(b), .carry(carry), .o(o) )

endmodule

3.实现一个4位全加器(default输出任意态)

module mux4( in0,inl,in2,in3,sel,out );

input [3:0] in0;
input [3:0] in1;
input [3:0] in2;
input [3:0] in3;
input [1:0] sel;
output [3:0] out;

reg [3;0] out;
always @(*)begin
    case(sel)
      2'b00: out=in0;
      2'b01: out=inl;
      2'b10: out=in2;
      2'b11: out=in3;
      default: out=4'dx;//十进制不定态
    endcase
end

endmodule

//testbench

module mux4_tb:
reg [3:0] in0 in1,in2,in3;
reg [1:0] sel;
wire [3:0] out;
initial begin
in0=0; in1=1; in2=2; in3=3; sel=2'dx;
   #20 sel=2'dX;
   #20 sel=2'd0;
   #20 sel=2'd1;
   #20 sel=2'd2;
   #20 sel=2'd3;
   #20 $finish;
end

mux4 u_mux4( .in0(in0),  .in1(in1), .in2(in2), .in3(in3), .sel(sel), .out(out) )

endmodule

4.使用for语句实现七人投票表决器(可以设置inpu同时[3:0],1同意,0同意)

module vote( ticket,result);

input [6;0] ticket;
output result;

reg result;

integer i;

reg [2:0] cnt;
always @(*) begin
    cnt=3'd0;     //最高就是7,所以只需要三比特
    result = 1'b;
       for(i=0;i<7;i++)  begin
            if(ticket[i]==1)    //就是数1的个数
                cnt =cnt +1;
                         end
       if(cnt >3)
            result = 1'b1;

            end 

endmodule

//benchmark

module vote_tb;
reg [6;0] tick;
wire result;
initial begin
    tick =0;
#20 tick =2'b0011001;
#20 tick =2 b0111001;
#20 tick =2'b1011001;
#20 tick =2'b0011101;
#20 tick =2'b0011110;
#20 tick =2'b1100001;
#20 tick =2'b0111001;
#20 tick =2'b0011011;
#20 tick =2'b0011000;
#20 tick =2'b0001000:
#20 $finish;
end

endmodule

简单的组合逻辑电路例子就这些,明天再更新记录一下时序逻辑电路。

(ps.果然自己打一遍效果更好,相比于纯看好很多)

标签:HDL,20,sel,Verilog,input,tick,out,reg,逻辑设计
From: https://blog.csdn.net/weixin_47104706/article/details/140595449

相关文章

  • 【Verilog入门】常见的可用于仿真不能综合成硬件的语句及其原因
    在Verilog设计中,不可综合的语句和结构主要是因为它们无法直接映射到实际的硬件实现。以下是详细的解释和每种不可综合语句或结构背后的原因:1.延迟控制语句(#)原因:延迟控制语句用于仿真环境中引入时间延迟,但在实际硬件中没有直接对应的实现。硬件电路的操作是由时钟边沿......
  • HDLBits答案(3)_状态机(2)
      前言    今天刷完状态机的2/3,以下是书写的代码。题库1:Lemmings2:        除了向左和向右走之外,如果下面的地面消失,旅鼠还会摔倒(大概会“啊啊!”)。        除了左右行走和撞到时改变方向外,当地面=0时,旅鼠还会摔倒并说“啊!当地面重新出现(地面=1)......
  • Verilog程序模块最详细的说明-实现流水灯
    文章目录前言一、Verilog注释二、Verilog关键字三、Verilog模块1.Verillog的基本设计单元是**"模块"(block)**2.一个模块是由两部分组成,一部分是描述接口,另一部分描述逻辑功能.3.每个Verilog模块包括4个主要部分:4.举例-流水灯5.功能定义部分有三种方法:6.模块的调用......
  • 最详细的Verilog阻塞,非阻塞赋值语句介绍--数码管控制段选信号代码
    目录前言一、结构语句1、initial语句2、always语句二、赋值语句1.阻塞赋值2.非阻塞赋值3.总结三、条件语句1if_else语句2.case语句前言本文笔者将为大家详细的介绍Verilog的三种语句介绍,包括结构语句,赋值语句和条件语句一、结构语句1、initial语句initi......
  • Verilog队列链表操作
    链表在缓存管理中有重要的应用,对所有输入的数据都放在一块大的RAM中缓存,并且根据一定的规则将数据分类并划归不同的队列,不同队列的数据可以分别控制输出,队列内,数据按严格先进先出的顺序操作我们假设输入数据的位宽为256,并且开辟一个2^20深度的RAM用于缓存,那么RAM大小为32MB。将......
  • 在实际应用中,systemverilog相比vefilog2000有哪些重大的提升
    SystemVerilog相较于Verilog-2000有多项重大提升,这些提升使得SystemVerilog成为更强大的硬件描述和验证语言。以下是一些关键的改进:数据类型扩展:SystemVerilog引入了 logic 数据类型,可以替代Verilog-2000中的 wire 和 reg 类型,提供更灵活的使用方式。支持更广......
  • 【VERILOG】输入脉冲下降沿触发输出一组双脉冲 (附带testbench)
    `timescale1ns/1psmodulepulseturn( clk, reset_n, in, out); input clk; input in; input reset_n; output reg out; reg[7:0] cnt; reg[1:0]data_in; assignpos_edge=~data_in[1]&data_in[0]; assignneg_edge=data......
  • verilog实现ram16*8 (vivado)
    moduleram_16x2(inputclk,//时钟信号inputwe,//写使能inputen,//使能信号input[3:0]addr,//地址线input[1:0]datain,//输入数据线outputreg[1:0]dataout//输出数据线);//定义存储器数组......
  • Verilog 组合电路常见错误和always块的使用原则
    一、组合电路常见错误1、变量在多个always块中连续赋值regy;rega,b,clear;always@*if(clear)y=1'b0;always@*y=a&b;//每个always块是电路的一部分,y在两个电路上输出,不能综合2、不完整的敏感信号列表always@(a,b)y=a&b;//如果忘记......
  • 基于FPGA的MSK调制解调系统verilog开发,包含testbench,同步模块,高斯信道模拟模块,误
    1.算法仿真效果本程序系统是《m基于FPGA的MSK调制解调系统verilog开发,并带FPGA误码检测模块和matlab仿真程序》的的升级。 升级前原文链接 增加了完整的AWGN信道模型的FPGA实现,可以在testbench里面设置SNR,分析不同SNR对应的FPGA误码率情况。 vivado2019.2仿真结果如下(......