HDL_BITS 学习(9)

build a circuit from waveform(依靠波形图编写电路)

Sim/circuit2

比较简单,4输入,1输出。4个输入相同或者有两个输入相同的时候,输出为1.

编了个4位输入寄存器sum存储输入。然后组合电路逻辑判断寄存器,最后输出。

module top_module (
    input a,
    input b,
    input c,
    input d,
    output q );//

    reg [4:0]sum;
    
    
    always @(*) begin
        sum[0]=d;
        sum[1]=c;
        sum[2]=b;
        sum[3]=a;
    end
    always @(*) begin
        case (sum)
            0:q=1;
            3:q=1;
            5:q=1;
            6:q=1;
            9:q=1;
            10:q=1;
            12:q=1;
            15:q=1;
            default:q=0;
        endcase
    end
endmodule

编译通过。

自己写的这个程序比较长,网上找到了一些比较短的答案。

assign q = (a ^ b) ~^ (c ^ d);

 或者

assign q=~(a^b^c^d);

感觉要卡诺图化简,把当年的数电忘了

Sim/circuit3

比较简单,4个输入量,一个输出量。做卡诺图化简,可以得到q=bd+bc+ad+ac=b(c+d)+a(c+d)=(b+a)(c+d), assign q = (a || b) && (c || d);就搞定。

Sim/circuit4

和上一题类似,卡诺图化简即可。略过。

Sim/circuit5

组合逻辑,c为片选信号。很容易用组合逻辑写出。

module top_module (
    input [3:0] a,
    input [3:0] b,
    input [3:0] c,
    input [3:0] d,
    input [3:0] e,
    output [3:0] q );

    always@(*)begin
        case (c)
            0:q=b;
            1:q=e;
            2:q=a;
            3:q=d;
            default:q=4'b1111;
        endcase
    end
endmodule

sim/circuit6

输入是4位,输出是16位。看不懂输入输出的具体关系。俺也承认自己懒得找了。用case 直接编写吧

    always @ (*) begin
        case(a)
            0: q = 16'h1232;
            1: q = 16'haee0;
            2: q = 16'h27d4;
            3: q = 16'h5a0e;
            4: q = 16'h2066;
            5: q = 16'h64ce;
            6: q = 16'hc526;
            7: q = 16'h2f19;
        endcase
    end
   

sim/circuit7

时序电路。因为是单输入单输出,用阻塞赋值和非阻塞赋值都正确。

always@(posedge clk)
        begin
            q=~a;
        end

百度百科找了下阻塞赋值和非阻塞赋值的区别

状态变量的赋值或开关变量的赋值中,已明确建议大家使用非阻塞赋值。这不但是因为综合工具要求这样做,最根本的原因是与非阻塞赋值语句语意对应的电路结构正是我们想要实现的。这两种赋值语句对应着两种不同的电路结构。阻塞赋值对应的电路结构往往与触发沿没有关系,只与输入电平的变化有关系。而非阻塞赋值对应的电路结构往往与触发沿有关系,只有在触发沿时才有可能发生赋值的情况。

阻塞和非阻塞赋值的区别在阻塞是顺序执行而非阻塞是并行执行。

以下面的语句举例

非阻塞赋值

always@(posedge clk)

begin

b<=a;

c<=b;

end

阻塞赋值

always@(posedge clk)

begin

b=a;

c=b;

end

两种不同的赋值方式结果是不同的,非阻塞赋值b<=a;c<=b;两条语句是同时执行的,而阻塞赋值b=a;c=b;两条语句先执行b=a后执行c=b。

所以,为了良好的习惯,最正确的答案应该是非阻塞赋值<=:

always@(posedge clk)
        begin
            q<=~a;
        end

sim/circuit8

一个时钟信号,一个输入信号。两个输出信号。看波形图没看懂p和输入信号,时钟信号的关联。结果网上搜查猜发现p用的组合逻辑。

module top_module (
    input clock,
    input a,
    output p,
    output q );
    always@(negedge clock)
        begin
            q<=p;
        end
    always@(*)begin
        if(clock)p=a;
        else p=p;
    end

endmodule

sim/circuit9

module top_module (
    input clk,
    input a,
    output [3:0] q );
    always@(posedge clk)begin
        if(a)q<=4;
        else 
            if(q<6)q<=q+4'b1;
            else q<=0;    
    end

endmodule

sim/circuit10 

时序电路,一个组合逻辑电路和一位存储器(flip-flop(触发器))组成,输出的q依靠state确定。

先看波形确定state,再确定输出q和state的关系。

always @ (posedge clk) begin
        if(a == b)
            state <= a;
        else
            state <= state;
    end
    
    assign q = (a == b) ? state : (~state)
endmodule

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值