《手把手教你学FPGA设计:基于大道至简的至简设计法》
百度网盘链接:https://pan.baidu.com/s/12knuxzb4Z6z_8gR-By-l-A
提取码:mwzd
自己实现的书中的模块和相应的testbench测试:https://github.com/lishengxie/verilog-learning.git
add_cnt
且add_cnt && cnt==4
时表示计数到第五个,而add_cnt==0 && cnt==4
不表示计数到第五个;x-1
的形式;(加一条件) && (cnt==计数值-1)
;>=
和<
两种符号,尽量不要使用大于或者小于等于两种符号;// 中文词语方便理解,实际使用需要更改为相应的变量名
always @(posedge clk or negedge rst_n) begin
if(rst_n==1'b0)begin
cnt <= 0;
end
else if(加一条件)begin
if(结束条件)
cnt <= 0;
else
cnt <= cnt + 1;
end
end
assign 加一条件 = xxxxxx;
assign 结束条件 = (加一条件) && (cnt==计数值-1);
dout0
和dout1
,dout0
在计数到6时拉高,dout1
在计数到7时拉高,因此dout0
变1的条件为add_cnt && cnt==6-1
,dout1
变1的条件有两种写法dout0 == 1
add_cnt && cnt==7-1
add_
,结束条件统一前缀为end_
;always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
state_c <= IDLE;
end
else begin
state_c <= state_n;
end
end
第二段为组合逻辑的always块,用于描述状态转移条件判断,以三个状态的状态机IDLE->S1->S2->IDLE为例;
always @(*) begin
case(state_c)
IDLE: begin
if(idle2s1_start) begin
state_n = S1;
end
else begin
state_n = state_c;
end
end
S1: begin
if(s12s2_start) begin
state_n = S2;
end
else begin
state_n = state_c;
end
end
S2: begin
if(s22_idle_start) begin
state_n = S2;
end
else begin
state_n = state_c;
end
end
default: begin
state_n = IDLE;
end
endcase
end
第三段定义转移条件,注意条件一定要加上现态。
assign idle2s1_start = state_c == IDLE && xxxx;
assign s12s2_start = state_c == S1 && xxxx;
assign s22idle_start = state_c == S2 && xxxx;
第四段设计输出信号,每一个输出信号使用一个always块
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
out1 <= 1'b0
end
else if(state_c==S1)begin
out <= 1'b1;
end
else begin
out <= 1'b0;
end
end
* 顶部菜单栏 文件(File) -> 首选项(Preference) -> 用户代码段(User Snippets)
* 选择verilog.json打开,添加代码段模板,以编写的计数器模板为例,如下所示
2. 插入代码段
Ctrl+Shift+P进入命令输入,输入Insert Snippet命令选择对应的代码段插入。
- 当sio_out_en=0 时,此时sio_d作为输出口,sio_d输出sio_out的值;
- 当sio_out_en=1 时,此时sio_d作为输入口,sio_din输出sio_d的输入值;
inout_sio_d;
assign sio_d = sio_out_en ? Sio_out : 1'bz;
assign sio_din = sio_d;
]]>