always@(posedge pclk or negedge rst) begin
if(!rst)
pout_buf<=0; else
pout_buf<=temp; end
assign p_dout=(enable)?pout_buf:8'bz; endmodule
测试程序如下:
module transform_cb_tb; reg sclk; reg pclk; reg rst; reg enable; reg ser_din;
wire [7:0] p_dout;
initial begin
sclk=0; pclk=0; rst=0; enable=0;
#15 rst=1;enable=1; #15 enable=0; #20 enable=1; #50 enable=0; #50 enable=1; #1000 $stop; end
always #5 sclk=~sclk; always #40 pclk=~pclk;
always@(posedge sclk) ser_din={$random}%2;
transform_cb
ps(.sclk(sclk),.pclk(pclk),.rst(rst),.ser_din(ser_din),.enable(enable),.p_dout(p_dout)); endmodule
波形图如下:
图5 8位串并转换电路波形图
图6 8位串并转换电路波形图
图7 8位串并转换电路波形图
图8 8位串并转换电路波形图
从图中可以看出,0-15s、30s-50s时enable无效,输出为三态;15s-30s、50s-100s时enable有效,输出8位并行数据;在200s、280s、360s可以看出,每到pclk上升沿,同步输出一个并行8位数据。
4、设计交通灯控制器(有限状态机问题)。
主干道上车很多,有最高优先级,默认主干道是绿灯亮;支路偶尔有车,有车时必须变绿灯,只要维持足够的时间,能让车通过即可;支路上只要不再有车,则支路绿灯变黄灯,然后变红灯;同时主干道亮绿灯;有一个传感器监视支路上是否有车,向控制器输入信号X;X=1表示有车,否则X=0; 代码如下:
module traffic_light(clock,clear,x,hwy,cntry); input clock; input clear; input x;
output reg[1:0] hwy; //主绿hwy=2'b00,主黄hwy=2'b01,主红hwy=2'b10;
output reg[1:0] cntry; //支绿cntry=2'b00,支黄cntry=2'b01,支红cntry=2'b10;
// reg [5:0] count; //计数器 reg [1:0] state,nextstate; parameter
hwy_green=2'b00,hwy_yellow=2'b01,cntry_green=2'b10,cntry_yellow=2'b11;
always@(posedge clock or negedge clear) begin
if(!clear) begin
// count<=0;
state<=hwy_green; end
else begin
// count<=count+1; state<=nextstate; end
end
always@(x or state)
//nextstate<=hwy_green; case(state)
hwy_green:begin
hwy<=2'b00; cntry<=2'b10; if(x)
nextstate<=hwy_yellow; else
nextstate<=hwy_green; end hwy_yellow: begin
hwy<=2'b01; cntry<=2'b10; if(x)
nextstate<=cntry_green; else
nextstate<=hwy_green; end cntry_green: begin
hwy<=2'b10; cntry<=2'b00; if(x)
nextstate<=cntry_green; else
nextstate<=cntry_yellow; end cntry_yellow:begin
hwy<=2'b10; cntry<=2'b01; if(x)
nextstate<=cntry_green; else
nextstate<=hwy_green; end endcase endmodule
测试程序如下:
module traffic_light_tb; reg clock; reg clear; reg x;
wire [1:0] hwy; wire [1:0] cntry;
initial begin clock=0; clear=0; x=0;
#10 clear=1; #1000 $stop; end
always #10 clock=~clock; always #50 x=~x;
// always@(posedge clock) // x={$random}%2; /* initial begin x=0; #20 x=1; #20 x=0; #20; end */
traffic_light t_l(.clock(clock),.clear(clear),.x(x),.hwy(hwy),.cntry(cntry)); endmodule
波形图如下:
图9 交通灯控制器结果图
从图中可以看出,50s-100s时x=1,此时支路有车,状态应从主路绿灯、支路红灯变为主路黄灯、支路红灯,然后再变为主路红灯、支路绿灯,100s-150s时x=0,之路无车通过,默认状态主路绿灯、支路红灯。
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说教育文库Verilog代码(计数器、交通灯、串并转换)(2)在线全文阅读。
相关推荐: