网页设计与网站建设书如何设计网站导航
网页设计与网站建设书,如何设计网站导航,数据库设计工具,搜索引擎营销优化策略有哪些文章目录 第七讲第八讲第九讲第十讲 第七讲
1、最简单的状态机-三角波发生器
1、两种状态的代码#xff1a;
//最简单的状态机#xff0c;三角波发生器#xff1b;
timescale 1ns/10ps
module tri_gen(clk,res,d_out);
input clk;
input res;
o… 文章目录 第七讲第八讲第九讲第十讲 第七讲
1、最简单的状态机-三角波发生器
1、两种状态的代码
//最简单的状态机三角波发生器
timescale 1ns/10ps
module tri_gen(clk,res,d_out);
input clk;
input res;
output[8:0] d_out;reg state;//主状态机寄存器
reg[8:0] d_out;always(posedge clk or negedge res )
if(~res)beginstate0;d_out0;
end
else begincase(state)0://上升begind_outd_out1;if(d_out299)beginstate1;endend1://下降begind_outd_out-1;if(d_out1)beginstate0;endend endcase
endendmodule//---------testbench of tri_gen-----
module tri_gen_tb;
reg clk,res;
wire[8:0] d_out;
tri_gen U1(.clk(clk),.res(res),.d_out(d_out));initial beginclk0;res0;#17 res1;#8000 $stop;
endalways #5 clk~clk;
endmodule仿真结果 另一种波形查看方法 2、四种状态的代码
//2023-0913time
//最简单的状态机三角波发生器
timescale 1ns/10ps
module tri_gen(clk,res,d_out);
input clk;
input res;
output[8:0] d_out;reg[1:0] state;//主状态机寄存器
reg[8:0] d_out;reg[7:0] con;//计数器记录平顶周期个数always(posedge clk or negedge res )
if(~res)beginstate0;d_out0;con0;
end
else begincase(state)0://上升begind_outd_out1;if(d_out299)beginstate1;endend1://平顶beginif(con200)beginstate2;con0;endelse beginconcon1;end end2://下降begind_outd_out-1;if(d_out1)beginstate3;endend 3://平顶beginif(con200)beginstate0;con0;endelse beginconcon1;end endendcase
endendmodule//---------testbench of tri_gen-----
module tri_gen_tb;
reg clk,res;
wire[8:0] d_out;
tri_gen U1(.clk(clk),.res(res),.d_out(d_out));initial beginclk0;res0;#17 res1;#40000 $stop;
endalways #5 clk~clk;
endmodule仿真波形 3、如果state定义的[1:0],也就是有四种状态那么如果有没用到的状态应该用default写完全。
第八讲
1、串口数据接收 代码
//2023-09-18,time
//串口数据接收
timescale 1ns/10ps
module UART_RXer(clk,res,RX,data_out,en_data_out);
input clk;
input res;
input RX;
output[7:0] data_out;//接受字节输出
output en_data_out;//输出势能reg[7:0] data_out;
reg[7:0] state;//主状态机
reg[12:0] con;//用于计算比特宽度
reg[3:0] con_bits;// 用于计算比特数reg RX_delay;//RX的延时
reg en_data_out;
always(posedge clk or negedge res)
if(~res)beginstate0;con0;con_bits0;RX_delay0;en_data_out0;data_out0;
end
else beginRX_delayRX;case(state)0://等空闲beginif(con5000-1)begincon0;endelse beginconcon1;endif(con0)beginif(RX)begincon_bitscon_bits1;endelse begincon_bits0;endendif(con_bits12)beginstate1;end end1://等起始位beginen_data_out0;if(~RXRX_delay)beginstate2;endend2://收最低位b0;beginif(con7500-1)begincon0;data_out[0]RX;state3;endelse beginconcon1;endend3://收最低位b1;beginif(con5000-1)begincon0;data_out[1]RX;state4;endelse beginconcon1;endend4://收最低位b2;beginif(con5000-1)begincon0;data_out[2]RX;state5;endelse beginconcon1;endend5://收最低位b3;beginif(con5000-1)begincon0;data_out[3]RX;state6;endelse beginconcon1;endend6://收最低位b4;beginif(con5000-1)begincon0;data_out[4]RX;state7;endelse beginconcon1;endend7://收最低位b5;beginif(con5000-1)begincon0;data_out[5]RX;state8;endelse beginconcon1;endend8://收最低位b6;beginif(con5000-1)begincon0;data_out[6]RX;state9;endelse beginconcon1;endend9://收最低位b7;beginif(con5000-1)begincon0;data_out[7]RX;state10;endelse beginconcon1;endend10://产生使能信号脉冲beginen_data_out1;state1;enddefault://beginstate0;con0;con_bits0;en_data_out0;endendcase
endendmodule//-------testbench of UART_RXer-------
module UART_RXer_tb;
reg clk,res;
wire RX;
wire[7:0] data_out;
wire en_data_out;reg[25:0] RX_send;//里面装有串口字节发送数据
assign RXRX_send[0];//连接RXreg[12:0] con;UART_RXer UART_RXer( //同名例化clk,res,RX,data_out,en_data_out);
initial beginclk0;res0;RX_send{1b1,8haa,1b0,16hffff};con0;#17 res1;#4000000 $stop;
endalways #5 clk~clk;always(posedge clk) beginif(con5000-1)begincon0;endelse beginconcon1;endif(con0)beginRX_send[24:0]RX_send[25:1];RX_send[25]RX_send[0];endend
endmodule仿真波形 小结
第九讲
1、串口数据发送 代码
//2023-09-18,time
//串口发送模块
timescale 1ns/10ps
module UART_TXer(clk,res,data_in,en_data_in,TX,rdy);
input clk;
input res;
input[7:0] data_in;//准备发送的数据
input en_data_in;//发送使能
output TX;
output rdy;//空闲标志0表示空闲reg[3:0] state;//主状态机寄存器
reg[9:0] send_buf;//发送寄存器
assign TXsend_buf[0];//连接TXreg[9:0] send_flag;//用于判断右移结束reg[12:0] con;//用于计算波特周期
reg rdy;always(posedge clk or negedge res)
if(~res)beginstate0;send_buf1;con0;send_flag10b10_0000_0000;rdy0;
end
else begincase(state)0://等待使能信号beginif(en_data_in)beginsend_buf{1b1,data_in,1b0};send_flag10b10_0000_0000;rdy1;state1;endend1://串口发送寄存器右移beginif(con5000-1)begincon0;endelse beginconcon1;endif(con5000-1)beginsend_buf[8:0]send_buf[9:1];send_flag[8:0]send_flag[9:1];endif(send_flag[0])beginrdy0;state0;endendendcase
end
endmodule//------testbench of UART_TXer--------
module UART_TXer_tb;
reg clk,res;
reg[7:0] data_in;
reg en_data_in;
wire TX;
wire rdy;
UART_TXer UART_TXer(clk,res,data_in,en_data_in,TX,rdy);initial beginclk0;res0;data_in8h7f;en_data_in0;#17 res1;#30 en_data_in1;#10 en_data_in0;#2000000 $stop;
endalways #5 clk~clk;endmodule仿真波形 小结
第十讲
1、串口指令处理器 代码
//2023-09-19time
//指令处理器
module cmd_pro(clk,res,din_pro,en_din_pro,dout_pro,en_dout_pro,rdy);
input clk;
input res;
input[7:0] din_pro;//指令和数据输入端口
input en_din_pro;//输入使能
output[7:0] dout_pro;//指令执行结果
output en_dout_pro;//指令输出使能
output rdy;//串口发送模块空闲标志0表示空闲parameter add_ab8h0a;
parameter sub_ab8h0b;
parameter and_ab8h0c;
parameter or_ab 8h0d;reg[2:0] state;//主状态机寄存器
reg[7:0] cmd_reg,A_reg,B_reg;//存放指令、A和B
reg[7:0] dout_pro;
reg en_dout_pro;always(posedge clk or negedge res)begin
if(~res)beginstate0;cmd_reg0;A_reg0;B_reg0;dout_pro0;en_dout_pro0;
end
else begincase(state)0://等指令beginen_dout_pro0;if(en_din_pro)begincmd_regdin_pro;state1;endend1://收Abeginif(en_din_pro)beginA_regdin_pro;state2;endend2://收Bbeginif(en_din_pro)beginB_regdin_pro;state3;endend3://指令译码和执行beginstate4;//指令译码一个时钟周期就可以所以可以没条件case(cmd_reg)add_ab: begin dout_proA_regB_reg; endsub_ab: begin dout_proA_reg-B_reg; endand_ab: begin dout_proA_regB_reg; endor_ab: begin dout_proA_reg|B_reg; endendcaseend4://发送指令执行结果beginif(~rdy)beginen_dout_pro1;state0;endenddefault://beginstate0;en_dout_pro0;endendcase
end
endmodule//2023-09-19,time
//串口指令处理器
timescale 1ns/10ps
module UART_top(clk,res,RX,TX);
input clk;
input res;
input RX;
output TX;wire[7:0] din_pro;
wire en_din_pro;
wire[7:0] dout_pro;
wire en_dout_pro;
wire rdy;UART_RXer UART_RXer( .clk(clk),.res(res),.RX(RX),.data_out(din_pro),.en_data_out(en_din_pro));UART_TXer UART_TXer( .clk(clk),.res(res),.data_in(dout_pro),.en_data_in(en_data_),.TX(TX),.rdy(rdy));cmd_pro cmd_pro(.clk(clk),.res(res),.din_pro(din_pro),.en_din_pro(en_din_pro),.dout_pro(dout_pro),.en_dout_pro(en_dout_pro),.rdy(rdy));
endmodule //-------testbench of UART_top------
module UART_top_tb;
reg clk,res;
wire RX;
wire TX;reg[45:0] RX_send;//里面装有串口字节发送数据
assign RXRX_send[0];//连接RXreg[12:0] con;UART_top UART_top(clk,res,RX,TX);initial beginclk0;res0;RX_send{1b1,8h09,1b0,1b1,8h06,1b0,1b1,8h0a,1b0,16hffff};con0;#17 res1;#4000000 $stop;
endalways #5 clk~clk;always(posedge clk) beginif(con5000-1)begincon0;endelse beginconcon1;endif(con0)beginRX_send[44:0]RX_send[45:1];RX_send[45]RX_send[0];endend
endmodule仿真波形
小结
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/88127.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!