前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Exams/ece241 2013 q4答案解析

Exams/ece241 2013 q4答案解析

作者头像
用户1148523
发布2020-08-10 10:30:14
1.2K0
发布2020-08-10 10:30:14
举报
文章被收录于专栏:FishFish

题目链接:https://hdlbits.01xz.net/wiki/Exams/ece241_2013_q4

题目的意思就是输入s表示着当前水位的状态,s1为1就表示水位在s1之上,这时就需要打开两个阀门fr1,fr2,然后如果之前的水阀数量比当前的多,那么dfr就是1,如果比现在的少,那dfr么就是0. 如果水位保持不变呢,dfr也保持不变。由于最低状态只能比当前得多,所以dfr一直都会是1,就算是水位不变,也要保持dfr1是1;同理最高水位一定是比之前的高,所以dfr一直是0.

代码语言:javascript
复制
module top_module (
	input clk,
	input reset,
	input [3:1] s,
	output reg fr3,
	output reg fr2,
	output reg fr1,
	output reg dfr
);
    //这六种状态分别是什么呢,A表示的是水位低于S1,D表示水位高于S3
    //B1表示的是高于S1但是低于S2,同时,dfr是0,相对于B2是用来表示从C状态转换过来的,dfr是1的状态。C1,C2同理
    parameter A = 0, B1=1,B2=2,C1=3,C2=4,D=5;
    reg[2:0] state, next;
    
    //注意只有这里的always是用的clk,其他的都是星号。
    always@(posedge clk)begin
        if(reset)
            state <= A;
        else
            state <=next;
    end
    
    //这里就是状态转换,注意B1,B2,C1,C2的区别
    always@(*)begin
        case(state)
            A:next <= s[1]?B1:A;
            B1:next <= s[2]?C1:(s[1]?B1:A);
            B2:next <= s[2]?C1:(s[1]?B2:A);
            C1:next <= s[3]?D:(s[2]?C1:B2);
            C2:next <= s[3]?D:(s[2]?C2:B2);
            D:next <= s[3]?D:C2;
            default:next <= A;
        endcase
    end
	
    //这里是输出结果,根据不同的状态开不同的阀门和赋值不同的dfr
    always@(*)begin
        case(state)
            A: {fr3,fr2,fr1,dfr} = 4'b1111;
            B1: {fr3,fr2,fr1,dfr} = 4'b0110;
            B2: {fr3,fr2,fr1,dfr} = 4'b0111;
            C1: {fr3,fr2,fr1,dfr} = 4'b0010;
            C2: {fr3,fr2,fr1,dfr} = 4'b0011;
            D: {fr3,fr2,fr1,dfr} = 4'b0000;
            default: {fr3, fr2, fr1, dfr} = 'x;
        endcase
    end
      
endmodule
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-08-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档